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

Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
最終更新日:2018-02-08

第112回.動的配列(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を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。

また、次元数は変更できません。

添字の下限を変更しようとすると、エラーが発生します。

変数の初期化時には、数値変数は 0 に、可変長文字列は長さ 0 の文字列 ("") に初期化されて、固定長文字列には 0 が埋められます。

また、バリアント型 (Variant) 変数は 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次元の配列です。このようなデータを変数で扱うのが、配列になります。

1次元配列の並べ替え(バブルソート,クイックソート)

2次元配列の並べ替え(バブルソート,クイックソート)
配列(2次元)の並べ替え方法についてバブルソートとクイックソートのサンプルになります。2次元配列の並べ替えと言えばまさにワークシートの並べ替え機能になります。本来はワークシートにデータを書き出してワークシートの並べ替え機能を使えば良いのですがしかしどうしても配列をワークシートに処理途中で書き出すと言うのは面倒なものです。

動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき縦横が違っている為そのまま出力できませんそもそも動的配列の要素数をRedimで変更できるのは最下位の次元のみになります。2次元配列の場合ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが

マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。

大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう・・・そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。



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

列挙型(列挙体)Enum
ユーザー定義型(構造体)Type
静的配列
動的配列(Redim)
配列に関連する関数
セル範囲⇔配列
Split関数
ファイル操作Ⅱ(OpenとClose)
ファイル操作Ⅱ(Line Input #)
ファイル操作Ⅱ(Print #)
ファイルシステムオブジェクト(FileSystemObject)


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

IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)
Shift_JISのテキストファイルをUTF-8に一括変換|VBAサンプル集(5月31日)
「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)
VBA+SeleniumBasicで検索順位チェッカー作成|VBA技術解説(5月18日)
テーブル操作のVBAコード(ListObject)|VBA入門(5月12日)
テーブル操作の概要(ListObject)|VBA入門(5月12日)
VBAのスクレイピングを簡単楽にしてくれるSelenium|VBA技術解説(5月6日)


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

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


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

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


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






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