1分でわかるExcel VBAの配列push処理方法

Excel VBAの配列は[]を使わない

多くのプログラムでは配列は[]を使用して[1, 2, 3]のように書くがExcel VBAは[]は使用せず、pushに該当する処理のクセがある。

この記事では配列とpushに該当する処理について簡単に説明する。

Excel VBAにはpushはない

プログラミング教育にはpushメソッドがあることが多いが、VBAにはpushは存在しない。

そのためpushに該当する処理にクセがある。

まず配列の変数を宣言してRedimで数を指定する。

nums(3)ではなくnums(2)になっているのはVBAのデフォルトの配列の添え字の最小値は0のため。

逆にOption Base 1がコード内に指定されている場合は添え字の最小値が1になるためnums(3)を指定するのが正しい。

Sub MySub()
  Dim nums() As Long
  ReDim nums(2)
  nums(0) = 10
  nums(1) = 20
  nums(2) = 30
End Sub

もしここに40をpushのように追加したい場合はReDim Preserve nums(4)で配列の個数を変更する。

4ではなくUBound(nums) + 1にしたほうが汎用的に使い回せる。

Sub MySub()
  Dim nums() As Long
  ReDim nums(2)
  nums(0) = 10
  nums(1) = 20
  nums(2) = 30

  ReDim Preserve nums(UBound(nums) + 1)
  nums(3) = 40
End Sub

For文で繰り返し処理

配列内の値を順次取得したい場合はFor文を使用する。

For Eachでも可能だがインデックス(i)を使用して最初や最後のデータのみIFで条件分岐したいことが多いので一般的にはForが使用されることが多い。

Option Explicit

Sub MySub()
  Dim nums() As Long
  ReDim nums(2)
  nums(0) = 10
  nums(1) = 20
  nums(2) = 30

  ReDim Preserve nums(UBound(nums) + 1)
  nums(3) = 40

  Dim i As Long

  For i = LBound(nums) To UBound(nums)
    If i = LBound(nums) Then
      Debug.Print "First"
    End If
    Debug.Print i, nums(i)
    If i = UBound(nums) Then
      Debug.Print "Last"
    End If
  Next i
End Sub

出力結果は以下の通り

First
  0          10 
  1          20 
  2          30 
  3          40 
 Last
カテゴリーvba