VBA入門
第112回.動的配列(Redim)

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

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

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を指定した場合は、添字(インデックス)の下限(最小値)は変更できません。

配列について

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

以下も参考にして下さい。
配列の使い方について
配列に関する記事は多数掲載していますが、今回は配列についての基礎知識をまとめました。配列に関する基本的事項のみを解説しています。配列とは まずシートのセルを考えて下さい。縦1列だけを取り出した場合は、1次元の配列です。
VBAの配列まとめ(静的配列、動的配列)
VBAで配列を必要とするのは、処理速度を上げる為だと言えます、そもそも、エクセルにはセルの2次元配列であるシートがあります。にもかかわらず、VBAの学習を進めると必ず配列が出てきます、ではなぜVBAで配列必須になるかと言うと、セルを使うと処理速度が非常に遅く、これを高速に処理するために配列が必要となるからです。
1次元配列の並べ替え(バブルソート,クイックソート)
配列(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のお題をやってみた|エクセル雑感(1月13日)
イベントプロシージャーの共通化(Enter,Exit)|ユーザーフォーム入門(1月13日)
Rangeオブジェクトの論理演算(差集合と排他的論理和)|VBA技術解説(1月10日)
イベントプロシージャーの共通化|ユーザーフォーム入門(1月7日)
コントロールの動的作成|ユーザーフォーム入門(1月6日)
Evaluateメソッド(文字列の数式を実行します)|VBA技術解説(1月5日)
エクスポート(PDF/XPS)|VBA入門(1月2日)
分析関数(OVER句,WINDOW句)|SQL入門(12月25日)
取得行数を限定するLIMIT句|SQL入門(12月21日)
外部ライブラリ(ActiveXオブジェクト)|VBA入門(12月21日)


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

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




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


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



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