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


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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