VBA入門
動的配列(Redim)

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

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


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

数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
WRAPROWS関数(1次元配列を指定数の行で折り返す)|エクセル入門(2022-11-08)
EXPAND関数(配列を指定された行と列に拡張する)|エクセル入門(2022-11-07)
TAKE関数(配列の先頭/末尾から指定行/列数を取得)|エクセル入門(2022-11-06)
DROP関数(配列の先頭/末尾から指定行/列数を除外)|エクセル入門(2022-11-06)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.マクロって何?VBAって何?|VBA入門
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




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


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



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