VBA入門
静的配列

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

第111回.静的配列


配列は複数の区画に値を格納できる1つの変数です。
マクロVBAを学習していくと必ず配列が出てきますが、それだけ重要かつ便利だという事です。


VBA記述自体は簡単なものですが、正しく理解せずに使っている場合も結構見受けられます。
ここでは、配列の概要とVBAでの記述方法を解説していきます。


配列とは

配列は、値を格納するために複数の区画を持つ1つの変数です。
よく集合住宅やアパートにたとえられます。
要は、同じデータ型の変数の箱を複数つなげたものと理解すれば良いでしょう。

1つの箱には、1つの値しか入れられませんが、その箱が複数つながっていますので、
結果として、複数の値を入れられるのが配列という事になります。
通常の変数が、1つの変数に1つの値を格納している点で大きく異なっています。

通常の変数 VBA マクロ 画像

配列    VBA マクロ 画像


配列が格納しているすべての値を参照する場合には配列全体を参照することもできますし、
配列のインデックス番号(配列内の位置)を指定することで個々の要素を参照することもできます。

配列のインデックス番号の最小値は、配列宣言時に指定しなければ0になります。
ただしこれは、
Option Base 1
このように指定することでインデックスの最小値を1に変更可能です。
しかし、誤解の元になり易いですし、移植しづらくなるので推奨しません。
1から開始したい時は、配列宣言時に最小値に1を指定(ページ下部で説明)してください。


静的配列と動的配列

配列の要素数(値を入れる箱の数)が、あらかじめ決まっていてVBA内において不変で良い場合は、
配列変数宣言時に要素数を指定します。
これを静的配列と呼びます。

対して、
マクロVBA実行時点で要素数を決める場合や、実行途中で要素数を増減させることもできます。
これを動的配列と呼びます。

マクロVBAでは配列の要素数が決まっていない場合が多々あるため、
むしろ動的配列を使用する機会の方が多いかもしれません。


配列の宣言

Dim ステートメント、またはPrivate ステートメント、Public ステートメントで宣言します。

Dim MyArray(10) As Long

インデックスの最小値は、0になりますので、
上記の宣言で、0から10の11個の要素を持つ、1次元の配列を定義したことになります。
(Option Base 1を指定していない場合です。)

値を入れる時は、

MyArray(0) = 1

このように使用します。
以下の例では、配列に1から順に数値を入れています。

Sub sample()
  Dim MyArray(10) As Long
  Dim i As Long
  For i = 0 To 10
    MyArray(i) = i
  Next i
End Sub


多次元配列

Dim MyArray(10, 5) As String

これは、2次元配列を宣言しています。
ワークシートの、11行、6列のセル範囲を想像してもらえればよいでしょう。
マクロ VBA 配列

Sub sample()
  Dim MyArray(10, 5) As Variant
  Dim i As Long, j As Long
  For i = 0 To 10
    For j = 0 To 5
      MyArray(i, j) = Cells(i + 1, j + 1)
    Next
  Next
  Stop 'ローカルウィンドウで確認してみましょう
End Sub

上記では、セル範囲A1~F11を配列に入れています。
配列は0から開始され、Cellsは1から開始されるので、Cellsの方は+1しています。
マクロ VBA 配列

マクロ VBA 配列

※上記画像はローカル ウィンドウです。
・ローカル ウィンドウの表示 ・ローカル ウィンドウの基本的な使い方 ・ローカル ウィンドウの制限 ・ローカル ウィンドウの最後に

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


要素の下限の変更

配列のインデックスの下限を変更することができます。

Dim MyArray(1 To 10) As String

このように定義することで配列の要素は、
1~10の10個になります。
特に、ワークシートとデータのやり取りをする場合は、
このようにした方が理解しやすく、また、記述もしやすいでしょう。


配列について

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




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

第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)

・GetPhoneticメソッド ・GetPhoneticメソッドの使用例 ・SetPhoneticメソッド ・SetPhoneticメソッドの使用例
第109回.列挙型(列挙体)Enum
・Enumステートメント ・列挙型(Enumステートメント)の使用例 ・列挙型(Enumステートメント)の活用について
第110回.ユーザー定義型・構造体(Type)
・Typeステートメントの構文 ・ユーザー定義型の使い方 ・ユーザー定義型の使用例 ・ユーザー定義型の制限 ・最後に
第111回.静的配列
第112回.動的配列(Redim)
・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)で開いたファイルにデータを書き込むファイル入…


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

無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)
イータ縮小ラムダ(eta reduced lambda)|エクセル入門(2023-11-20)
PIVOTBY関数(縦軸と横軸でグループ化して集計)|エクセル入門(2023-11-19)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




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


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



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