配列の使い方について
配列に関する記事は多数掲載していますが、今回は配列についての基礎知識をまとめました。
配列に関する基本的事項のみを解説しています。
配列とは
縦1列だけを取り出した場合は、1次元の配列です。
縦横の複数行列を取り出した場合は、2次元の配列です。
このようなデータを変数で扱うのが、配列になります。
1次元の配列
あれっ、10個じゃないの?となりますが、
10個で正しいのです。
配列は、0~10になるのです、ですから11個になります。
データ型は、自由に指定可能です。
インデックスとは、つまりは何番目かという事です。
添え字とも言います。
配列の要素に振られた番号です。
通常は、0,1,2と振られています。
また、
Dim 配列名(5 To 10) As Variant
のような記述もあります。
これは、5番目から10番目のみ使用するといった感じです。
さすがに、下限として5を指定することはないのですが、
1から開始することは頻繁に使用されます。
Dim 配列名(1 To 10) As Variant
後述の注意でもあるように、使用すると便利な場合が多々あります。
2次元の配列
縦横と表現しましたが、イメージしやすいように言ったまでで、
10が1次元目、5が2次元目になります。
Dim 配列名(10, 5)
これは、つまり、
配列名(0, 0)~配列名(0, 5)
~
配列名(10, 0)~配列名(10, 5)
このようになります。
3次元以上の配列
エクセルVBAにおいて、感覚的に直ぐに理解できるのは、2次元までだと思います。
動的配列
以下で説明する動的配列に対し、静的配列と呼びます。
実行時に、シートの内容によって、要素数を決定したくなります。
このような場合に、使用するのが、動的配列です。
プログラムの中で、次元数、要素数を決定したり、途中で要素数の変更をします。
動的配列
このように、変数宣言時は配列であることだけを定義します。
これで、1次元10の配列になります。
これは何回でも、変更(ReDim)可能です。
ただし、それまでのデータは全てなくなります。
それまでのデータをそのままにして、要素数のみ変更したい場合は、
ReDim Preserve 配列名(10)
このようにPreserveを指定することで、データが残り要素数のみ変更できます。
添字(インデックス)の下限は変更できません、変更できるのは上限だけです。
ReDim 配列名(0 To 10)
これを
ReDim Preserve 配列名(1 To 10)
これはエラーとなります。。
これで、2次元配列になり、1次元目が5、2次元目が10の配列になります。
これも何回でも、変更(ReDim)可能です。
Preserve
を指定します。
ただし、Preserveを指定した場合は、
変更できるのは、最下位の次元のみです。
上で言えば、2次元目の10のみ変更可能です。
つまり、
ReDim 配列名(5, 10)
ReDim Preserve 配列名(6, 10) '×
これはエラーとなります。
できるのは、最下位の次元のみになります。
ReDim 配列名(5, 10)
ReDim Preserve 配列名(5, 11) '〇
動的配列の要素数の取得
取得方法は、
要素数の最小値:LBound(配列名[,次元数])
※次元数を省略した場合は1次元目になります。
ReDim 配列名(5, 10)
この場合、
UBound(配列名) → 5が返されます。
UBound(配列名, 1) → 5が返されます。
UBound(配列名, 2) → 10が返されます。
配列使用時の注意
ReDim 配列名(5, 10)
これは、インデックスが0から始まります。
つまり、0~5、0~10になります。
しかし、人間の感覚では0番目というのはいかにも使いづらく感じます。
そこで、0番目を無視して1番目から使っているVBAを見かけることがあります。
配列名(0, 〇)、配列名(〇, 0)
これらをVBA内では意図的に使用せず、
配列としては0から使えても、実際のVBA記述は1からしか使用しないということです。
これはこれで問題ありませんし、プログラムも分かりやすい場合もあります。
ただし、シートのセル範囲とデータをやりとりする場合は注意が必要です。
この配列に、配列名(1, 1)~配列名(5, 10)の範囲にデータを入れ、
シートに戻す場合、
Range("A1:J5").Value = 配列名
としてしまいそうです。
しかし、これでは、配列名(0,0)~配列名(4,9)の範囲しか入りません。
もちろん、配列を2重ループで1つづつ入れれば良いのでしょうが、
それでは、処理時間がかかり過ぎます。
数千、数万行のデータでは、現実的には厳しくなります。
ReDim 配列名(1 To 5, 1 To 10)
このように、最初から下限値を指定する必要があります。
これなら全く問題はありません。
また、Option Base 1で変更するのは、誤解のもとになるのでお勧めしません。
Dim 配列名() As Variant
これに対し、
配列名 = Range("A1:J5").Value
とした場合は、配列は、(1 To 5, 1 To 10)となりますので注意して下さい。
私は、ほとんどの場合、LBound~UBoundで処理するように記述しています。
そのようにしておけば、どちらの場合でもプログラムに変更はありません。
初心者の方は、(1 To 5, 1 To 10)のように定義し、1から使用する。
これが、最も分かりやすく間違いが無いだろうと思います。
Split関数(文字列を区切り文字で分割し配列にする)や、
コンボボックスのListの取得等は、Option Base 1に関わらず必ず0からになりますので、
0スタートにも慣れておく必要はあります。
同じテーマ「マクロVBA技術解説」の記事
配列の使い方について
VBAの配列まとめ(静的配列、動的配列)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 配列の使い方について
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。