Baccho Log

No Image

Sponsored Link

VBA 配列について

  • 投稿日:
  • 更新日:
Tags:
Excel VBA
Categories:
プログラミング

静的配列

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])
    添え字の最大値を返します

    1. ArrayName
      配列の変数名を指定します。
    2. dimension
      多次元配列の場合に、何番目の次元目の配列の最大値を返すのかを指定します。
      省略すると1番目の次元を返します。
  • LBound関数
    LBound(ArrayName[, dimension])
    添え字の最低値を返します

    1. ArrayName
      配列の変数名を指定します。
    2. dimension
      多次元配列の場合に、何番目の次元目の配列の最小値を返すのかを指定します。
      省略すると1番目の次元を返します。

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の配列を返します。
    また、一次元配列のみ指定可能です。多次元配列を指定するとエラーが発生します。

    1. ArrayName
      配列の変数名を指定します
    2. Match
      検索する文字列を指定します
    3. Include
      真偽値を指定します。
      True: 検索する文字列を含む要素を返します(既定値)
      False:検索する文字列を含まない要素を返します
    4. Compare
      文字列式を比較するときの比較モードを指定します。
      下記の定数で指定が可能です。
      0:「大文字と小文字」「半角と全角」「ひらがなとカタカナ」を区別します(vbBinaryCompare)(既定値)
      1:区別をしません(vbTextCompare)
      2:Accessでのみ使用可能

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)' => それでもみくさんがいい
« [WordPress]WordPressの導入方法VBA テキストファイルの操作 »

Sponsored Link

コメントする

記事の感想や修正依頼等ありましたら、コメントをお願いいたします