ExcelマクロVBA入門
第112回.動的配列(Redim)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-07-19

第112回.動的配列(Redim)


マクロVBAにおける配列の説明として最初に静的配列を解説しました、
静的配列では要素数は宣言時点で決められていました。
しかし、プログラミングをする上で、
実行時点で要素数を決めたい場合や、実行途中で要素数を増減させたい場合が多く出てきます。


実行時点で(実行途中で)要素数を増減できるの配列を動的配列と呼びます。
マクロVBAで動的配列の要素数を変更するには、ReDimステートメントを使います。

ReDimステートメント

動的配列変数に対するメモリ領域の再割り当てを行います。
プロシージャ レベルで使用します。
ReDim [Preserve] varname(subscripts) [As type]



Preserve

省略可能です。
既存の配列に格納されている値を失うことなく、配列の最後の次元の要素数を変更する場合に使用する、キーワードです。

varname

必ず指定します。
宣言する変数の名前です。
変数の標準的な名前付け規則に従って指定します。

subscripts

必ず指定します。
配列変数の次元を指定します。
指定できる次元数の最大値は 60 です。
引数 subscripts の構文は、次のとおりです。
[lower To] upper [,[lower To] upper] . . .
引数 lower を省略した場合、配列の添字の最小値は Option Base ステートメントによって制御されます。
Option Base ステートメントが記述されていなければ、添字の最小値は 0 になります。

type

省略可能です。
変数のデータ型を指定します。


キーワードPreserveを指定した場合
変更できるのは動的配列の最後の次元のサイズに限られます。
()内の一番最後(一番右)の次元の要素すうのみ変更可能という事です。

キーワードPreserveを使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。
添字の下限を変更しようとすると、エラーが発生します。
また、次元数は変更できません。

ただし、変数が配列として定義されておらず、Variantとだけ定義されている場合に、
ReDimで配列として使う場合は、添字の下限も変更可能となっています。

配列変数の初期化時の値
データ型によって、以下の値に初期化されます。
数値変数は、数値の0
可変長文字列は、長さ0の文字列 ("")
固定長文字列は、 文字コード0のvbNullChar
ブール変数は、False
バリアント型変数は、Empty値

要素数の変更について

ReDim MyArray(10, 10)

ReDim MyArray(10)

ReDim MyArray(10, 10)

このように、Redimで次元も要素数も変更できます。
ただし、Redimにより、それまでに配列に入っていた値は失われます。
値を保持したまま、ReDimするには、Preserveを指定します。



ReDim MyArray(10, 10)

ReDim Preserve MyArray(10, 11)

ReDim Preserve MyArray(11, 11)

Preserveを指定することで、値がそのまま残ります。
しかし、制限があります。
Preserveを指定した場合は、動的配列の最後の次元のサイズのみ変更可能で、
それより上位の次元は変更できません。
最後の次元以外のサイズを変更するとエラーとなります。

配列について

次元数の最大値は60とはなっていますが、
通常は、2次元までにしましょう。
ワークシートが2次元なのですから。
それ以上の次元は、むやみに複雑化させるだけです。

以下も参考にして下さい。
配列の使い方について
今回は、配列についての基礎知識をまとめました。配列とは シートのセルを考えて下さい。縦1列だけを取り出した場合は、1次元の配列です。縦横の複数行列を取り出した場合は、2次元の配列です。このようなデータを変数で扱うのが、配列になります。
VBAの配列まとめ(静的配列、動的配列)
VBAで配列を必要とするのは、処理速度を上げる為だと言えます、そもそも、エクセルにはセルの2次元配列であるシートがあります。にもかかわらず、VBAの学習を進めると必ず配列が出てきます、ではなぜVBAで配列必須になるかと言うと、セルを使うと処理速度が非常に遅く、これを高速に処理するために配列が必要となるからです。
1次元配列の並べ替え(バブルソート,クイックソート)
2次元配列の並べ替え(バブルソート,クイックソート)
配列(2次元)の並べ替え方法について、バブルソートとクイックソートのサンプルになります。2次元配列の並べ替えと言えば、まさにワークシートの並べ替え機能になります。本来は、ワークシートにデータを書き出して、ワークシートの並べ替え機能を使えば良いのですが、しかし、どうしても、配列をワークシートに処理途中で書き出すと言うのは面倒なものです。
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき、縦横が違っている為そのまま出力できません、そもそも、動的配列の要素数をRedimで変更できるのは、最下位の次元のみになります。2次元配列の場合、ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが、
マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。
大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう… そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。



同じテーマ「マクロVBA入門」の記事

第109回.列挙型(列挙体)Enum
第110回.ユーザー定義型・構造体(Type)
第111回.静的配列
第112回.動的配列(Redim)
第113回.配列に関連する関数
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)
第115回.Split関数
第116回.ファイル操作Ⅱ(OpenとClose)
第117回.ファイル操作Ⅱ(Line Input #)
第118回.ファイル操作Ⅱ(Print #)
第119回.ファイルシステムオブジェクト(FileSystemObject)


新着記事NEW ・・・新着記事一覧を見る

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • 動的配列(Redim)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ