プログラム開発メモ

プログラム開発で忘れがちなこと、役だったことを自分のためにメモしていくブログです。

【ExcelVBA】配列

■配列の宣言、定義

 ・固定長配列

   Dim 配列名(添字の上限値) As データ型名

 

 ・可変長配列

   Dim 配列名() As データ型名

 

■初期化

 ・Eraseステートメントを使う方法

   Erase 配列名

 

   初期値はデータ型によって異なる。

   ・数値配列:0(ゼロ)

   ・文字列配列:長さ0(ゼロ)の文字列

   ・オブジェクト配列:Nothing

   ・バリアント配列:Empty

 

 ・Array関数を使う方法

   Dim 配列名() As Variant

   配列名 = Array(要素(0), 要素(1), ・・・)

 

■ReDimで再定義

 ReDim 配列名(添字)

 配列に代入されたデータを保持したまま要素数を変更する場合

 ReDim Preserve 配列名(添字)

 データ型の変更も可能だが、変更できるのは可変長配列の宣言時に

 バリアント型で宣言した場合のみ。

 

■2次元配列(多次元配列)

 Dim 配列名(添字の上限値, 添字の上限値, ・・・) As データ型名

 次元ごとに「,」(カンマ)で区切って「()」内に並べる。

 

■セル範囲の値を配列の要素に一括で代入する

 Sub Sample1()

   Dim arr As Variant

   arr = WorksheetFunction.Transpose(Range("A1:B5"))

 

   Dim msg As String

   Dim i As Integer

   Dim j As Integer

 

   For i = 1 To 5

     For j = 1 To 2

       msg = msg & arr(j, i) & ", "

     Next j

     msg = msg & vbCrLf

   Next i

 

   MsgBox msg

 End Sub

 

 配列arrの要素の値にアクセスするためのインデックス番号が

 0からでなく1から始まっている。

 Transpose関数により行と列が入れ替わっている。

 

■要素の値をセルに代入する

 Sub Sample2()

   Dim arr(2, 5) As Variant

   Dim msg As String

   Dim i As Integer

   Dim j As Integer

 

   For i = 0 To 4

     For j = 0 To 1

       arr(j, i) = i + 1 + 10 * j

       msg = msg & arr(j, i) & ", "

     Next j

     msg = msg & vbCrLf

   Next i

 

   Range("A1:B5") = WorksheetFunction.Transpose(arr)

 

   MsgBox msg

 End Sub

 

 Transpose関数を使って行と列を入れ替えて配列要素の値をセルに格納。 

 

■UBound、LBoundで配列の要素数を取得する

 配列の要素数を取得するには以下の式で計算し取得する。

 

  要素数 = UBound関数の戻り値 - LBound関数の戻り値 + 1

 

■Forループで操作する方法

 Dim i As Integer

 For i = LBound(arr) To UBound(arr)

   'arr(i)を使った処理

 Next i

 

■For Eachで操作する方法

 Dim Var As Variant

 For Each Var In arr

   'Varを使った処理

 Next Var