Sponsored Link
VBA 配列について
静的配列
Dim 変数名(添え字) As データ型
1次元配列
Ex.1)オーソドックスな1次配列
Dim arr(9) As String' 0~9で配列を作る
arr(0) = "文字列を入れられるよ。"
arr(1) = "データ型がStringだからね。"
Debug.Print arr(0) & arr(1)
Ex.1では0と1の配列しか使用してないが、Ex.1の記載では0~9まで配列の中身を入れることが出来ます。
Ex.2)範囲を指定する配列
Dim arr(1 to 10) As String' 1~10で配列を作る
arr(1) = "arr(0)はエラーになるんだよ。"
arr(2) = "1~10までの添え字で指定した配列だからね。"
Debug.Print arr(1) & arr(2)
※VBAでは配列の宣言時に「min To max」という形式で添え字をしてすることが出来ます。
Ex.2の場合は1~10で宣言している為、例えば arr(0)
という添え字はインデックスエラーが起こります。
2次元配列
Ex)オーソドックスな2次配列
Dim arr(2,9) As String
arr(0,0) = "名前"
arr(1,0) = "住所"
arr(2,0) = "性別"
arr(0,1) = "鈴木"
arr(1,1) = "東京都"
arr(2,1) = "男"
arr(0,2) = "佐藤"
arr(1,2) = "千葉県"
arr(2,2) = "男"
arr(0,3) = "山本"
arr(1,3) = "神奈川県"
arr(2,3) = "女"
For i = 0 To 2
For j = 0 To 3
Debug.print arr(i,j)
Next j
Next i
※Excelで考えると分かりやすいかも。
左側が列で、右側が行(その逆もまた然り)
名前 arr(0,0) | 住所 arr(1,0) | 性別 arr(2,0) |
---|---|---|
鈴木 arr(0,1) | 東京都 arr(1,1) | 男 arr(2,1) |
佐藤 arr(0,2) | 千葉県 arr(1,2) | 男 arr(2,2) |
山本 arr(0,3) | 神奈川県 arr(1,3) | 女 arr(2,3) |
また、2次元配列においても「min To max」で添え字の範囲を指定することが可能です。
動的配列
ReDimステートメント
ReDim [Preserve] 変数名(添え字) As データ型
例えば配列の要素数が未確定なときに、
ReDimを使用すれば、動的に要素数を設定出来ます。
- Preserve
既存のデータを保持したまま、要素数を変更できます。
省略した場合、今まで設定していた配列の中のデータは消去されます。
Ex)Preserveの動き
Dim arr() As String
ReDim arr(1)
' Preserveをつけない
arr(0) = "今書いたこの文字列は"
arr(1) = "リセットされます。"
Debug.Print arr(0) & arr(1)' 今書いたこの文字列はリセットされます。
ReDim arr(2)
Debug.Print arr(0) & arr(1)' 空になります
' Preserveをつける
arr(0) = "ここで書いた文字列は"
arr(1) = "リセットされません。"
arr(2) = "多分"
ReDim Preserve arr(3)
Debug.Print arr(0) & arr(1) & arr(2)' ここで書いた文字列はリセットされません。
※Type(データ型)変更の注意点※
Typeは Variant型の変数 のみ、変更が出来ます。
それ以外はエラーが出ます。
配列のVariant型もエラーが出ます。
OK
Dim arr As Variant
ReDim arr(5) As Integer
配列で宣言しているのためNG
Dim arr() As Variant
ReDim arr(5) As Integer' エラー!!
Variant型の変数でないためNG
Dim arr As Long
ReDim arr(5) As Integer' エラー!!
元が配列じゃないため、ReDim時に配列に変換はNG
Dim arr As Integer
ReDim arr(5) As Integer' エラー!!
※多次元配列の注意点※
Preserveをつける場合、一番最後(一番右側)の次元の要素数しか変更が出来ません。
それ以外を変更しようとするとエラーが出ます。
Preserveをつけない場合は、リセットされますので変更が可能です。
Ex)多次元配列の要素数の再設定
Dim arr() As String
ReDim arr(1,2)
' Preserveをつけない場合、下記の変更は問題ない
ReDim arr(1,3)
ReDim arr(2,3)
' Preserveをつける場合
ReDim Preserve arr(1,3)' これは大丈夫
ReDim Preserve arr(2,3)' これはエラー
併せて知りたい
- UBound関数
UBound(ArrayName[, dimension])
添え字の最大値を返します- ArrayName
配列の変数名を指定します。 - dimension
多次元配列の場合に、何番目の次元目の配列の最大値を返すのかを指定します。
省略すると1番目の次元を返します。
- ArrayName
- LBound関数
LBound(ArrayName[, dimension])
添え字の最低値を返します- ArrayName
配列の変数名を指定します。 - dimension
多次元配列の場合に、何番目の次元目の配列の最小値を返すのかを指定します。
省略すると1番目の次元を返します。
- ArrayName
Ex)添え字の取得
Dim arr1(2,5) As Integer
Dim arr2(1 To 9, 7) As Integer
UBound(arr1)' ⇒2
UBound(arr1,2)' ⇒5
UBound(arr2)' ⇒9
UBound(arr2,2)' ⇒7
LBound(arr1)' ⇒0
LBound(arr1,2)' ⇒0
LBound(arr2)' ⇒1
LBound(arr2,2)' ⇒0
- filter関数
Filter(ArrayName, Match[, Include[, Compare]])
文字列型の配列から、指定した文字列を含む(あるいは含まない)要素を返します。
一致がない場合は、要素数0の配列を返します。
また、一次元配列のみ指定可能です。多次元配列を指定するとエラーが発生します。- ArrayName
配列の変数名を指定します - Match
検索する文字列を指定します - Include
真偽値を指定します。
True: 検索する文字列を含む要素を返します(既定値)
False:検索する文字列を含まない要素を返します - Compare
文字列式を比較するときの比較モードを指定します。
下記の定数で指定が可能です。
0:「大文字と小文字」「半角と全角」「ひらがなとカタカナ」を区別します(vbBinaryCompare)(既定値)
1:区別をしません(vbTextCompare)
2:Accessでのみ使用可能
- ArrayName
Ex)添え字の取得
Dim arr(3) As String
Dim inputArr() As String
arr(0) = "ミクさんマジ天使"
arr(1) = "レンキュンはぁはぁ"
arr(2) = "リンちゃんなう"
arr(3) = "それでもみくさんがいい"
'-----------------------------------------------
'ミクさんを含む文字列をinputArrに格納する
'-----------------------------------------------
inputArr = Filter(arr, "ミクさん")
Debug.Print inputArr(0)' => ミクさんマジ天使
'-----------------------------------------------
'ミクさんを含まない文字列をinputArrに格納する
'-----------------------------------------------
inputArr = Filter(arr, "ミクさん", False)
Debug.Print inputArr(0)' => レンキュンはぁはぁ
Debug.Print inputArr(1)' => リンちゃんなう
Debug.Print inputArr(2)' => それでもみくさんがいい
'-----------------------------------------------
'ミクさんを含む文字列をinputArrに格納する(文字列を区別しない)
'-----------------------------------------------
inputArr = Filter(arr, "ミクさん", True, 1)
Debug.Print inputArr(0)' => ミクさんマジ天使
Debug.Print inputArr(1)' => それでもみくさんがいい