VBA入門
動的配列(Redim)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日:2024-01-03

第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を指定した場合は、
動的配列の最後の次元のサイズのみ変更可能で、それより上位の次元は変更できません。
最後の次元以外のサイズを変更するとエラーとなります。


添字(インデックス)の下限(最小値)の変更について

Dim myArray() '配列として宣言

ReDim MyArray(0 To 10, 0 To 10)
'↓
ReDim Preserve MyArray(0 To 10, 0 To 11)
'↓
ReDim Preserve MyArray(0 To 10, 1 To 11)

Preserveを指定した場合には添字(インデックス)の下限(最小値)は変更できません。

ただし、Variant変数の場合は変更可能です。

Dim myArray 'Variant変数

ReDim myArray(0 To 10, 0 To 10)
'↓
ReDim Preserve myArray(0 To 10, 1 To 11)

Variant変数を配列として使用する場合は、添字の下限も変更可能となっています。


配列について

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

以下も参考にして下さい。
配列の使い方について
・配列とは ・1次元の配列 ・2次元の配列 ・3次元以上の配列 ・動的配列 ・動的配列 ・動的配列の要素数の取得 ・配列使用時の注意
VBAの配列まとめ(静的配列、動的配列)
・配列の概念 ・静的配列 ・動的配列 ・セル範囲⇔配列の基本 ・配列で必要となるVBA関数とステートメント ・配列に関する記事の一覧
1次元配列の並べ替え(バブルソート,クイックソート)
・検証方法 ・バブルソート ・挿入ソート ・クイックソート ・最後に
2次元配列の並べ替え(バブルソート,クイックソート)
・検証方法 ・バブルソート ・クイックソート ・複数キーでの並べ替えについて ・ワークシートを使って並べ替え・・・番外編
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき、縦横が違っている為そのまま出力できません、そもそも、動的配列の要素数をRedimで変更できるのは、最下位の次元のみになります。2次元配列の場合、ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが、
マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。
大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう… そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。




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

第109回.列挙型(列挙体)Enum

・Enumステートメント ・列挙型(Enumステートメント)の使用例 ・列挙型(Enumステートメント)の活用について
第110回.ユーザー定義型・構造体(Type)
・Typeステートメントの構文 ・ユーザー定義型の使い方 ・ユーザー定義型の使用例 ・ユーザー定義型の制限 ・最後に
第111回.静的配列
・配列とは ・静的配列と動的配列 ・配列の宣言 ・多次元配列 ・要素の下限の変更 ・配列について
第112回.動的配列(Redim)
第113回.配列に関連する関数
・LBound関数とUBound 関数 ・Array関数 ・IsArray 関数 ・Join関数 ・Filter関数 ・Eraseステートメント
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)
・セル範囲⇔配列の基本VBA ・使用例 ・配列およびマクロVBAの高速化に関するページ
第115回.Split関数
・Split関数 ・区切り文字が文字列式内に存在しない場合 ・空文字("")をSplitした場合 ・Split関数の使用例
第116回.ファイル操作Ⅱ(OpenとClose)
・Openステートメント ・Closeステートメント ・OpenステートメントとCloseステートメントの使用例
第117回.ファイル操作Ⅱ(Line Input #)
・Line Input # ステートメント ・EOF関数 ・Line Input # ステートメント と EOF関数の使用例.
第118回.ファイル操作Ⅱ(Print #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、その後に、読込み書込みを行い、最後に、ファイルを閉じます。ファイルを書き込む時には、Print#ステートメントを使います。Print#ステートメント シーケンシャル出力モード(OutputまたはAppend)で開いたファイルにデータを書き込むファイル入…
第119回.ファイルシステムオブジェクト(FileSystemObject)
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例


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

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門




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


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


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