記事「 配列の使い方を整理」で説明したように
以下の順番でみていきます。
1. Variant型の変数にArray関数を使って配列をいれる。
2.配列を宣言してそれぞれの要素を指定する。
2-a. 固定長配列
2-b. 動的配列
以下の例で使う2次元配列は3x5のサイズです。
配列の内容は
コードの最後でシートに書き出すようになっていますが、
要所要所でウォッチウィンドウで配列の状態を確認してみると
流れがわかります。
まず、1つ目からみます。
1. Variant型の変数にArray関数を使って配列をいれる。
2次元配列はめんどくさくてあまり使っていなかったので
深く考える機会も今までなかったのですが、
Array関数は1次元配列のためのもののようですね。
とりあえず入れ子状にしたら
2次元配列らしきものができました。
この方法に全く実用性はないと思いますが、
各要素を指定する変数が少し変わっていたので
面白いと思いました。
2次元配列の各要素の指定方法は
a(i, j) のようにするのですが、
Array関数を入れ子したこれは、a(i)(j)とします。
サンプルコードはこちら
2次元配列の使い方1のサンプルコード:Sub macro101016a() '2次元配列の使い方1(3x5) 'Array関数を使って
Dim a As Variant 'Array関数を入れ子にして2次元配列にする a = Array( _ Array("(0, 0)", "(0, 1)", "(0, 2)", "(0, 3)", "(0, 4)"), _ Array("(1, 0)", "(1, 1)", "(1, 2)", "(1, 3)", "(1, 4)"), _ Array("(2, 0)", "(2, 1)", "(2, 2)", "(2, 3)", "(2, 4)") _ ) '配列の内容をシートに書き出す '各要素の指定方法に注目! Dim i As Integer, j As Integer Sheets.Add For i = 0 To UBound(a) '<=注目 For j = 0 To UBound(a(i)) '<=注目 Cells(i + 1, j + 1) = a(i)(j) '<=注目 Next j Next i End Sub |
2つ目です。
2-a. 固定長配列
1次元配列と同様に
配列の宣言をしてFor文を使って各要素に値を入れる流れは同じです。
配列の宣言は次のようにします。
Dim a(2, 4) As String
これで3行5列の配列が宣言されました。
2次元配列では各要素にアクセスするために
For文を入れ子します。
For i = 0 To UBound(a, 1)
For j = 0 To UBound(a, 2)
a(i, j) = 何らかの値
Next j
Next i
UBound関数の使い方にも注目。
1次元目の最大の添え字 = UBound(a, 1)
2次元目の最大の添え字 = UBound(a, 2)
サンプルコードはこちら
2次元配列の使い方2-aのサンプルコード:Sub macro101016b() '2次元配列の使い方2(3x5) '固定長配列
Dim a(2, 4) As String Dim i As Integer, j As Integer '配列に値を入れる For i = 0 To UBound(a, 1) For j = 0 To UBound(a, 2) a(i, j) = "(" & i & ", " & j & ")" Next j Next i '配列の内容をシートに書き出す Sheets.Add For i = 0 To UBound(a, 1) For j = 0 To UBound(a, 2) Cells(i + 1, j + 1) = a(i, j) Next j Next i End Sub |
最後は、
2-b. 動的配列
まず動的配列を宣言する。
Dim a() As String
次に、配列のサイズを指定する。
ReDim a(2, 4)
配列の各要素にアクセスする方法は
固定長配列と同様です。
サンプルコードはこちら
2次元配列の使い方2-bのサンプルコード:Sub macro101016c() '2次元配列の使い方3(3x5) '動的配列
Dim a() As String Dim i As Integer, j As Integer '配列に値を入れる 'サイズを指定 ReDim a(2, 4) For i = 0 To UBound(a, 1) For j = 0 To UBound(a, 2) a(i, j) = "(" & i & ", " & j & ")" Next j Next i '既存データを保持してサイズを再指定 ReDim Preserve a(2, 5) For i = 0 To UBound(a, 1) For j = 0 To UBound(a, 2) If a(i, j) = "" Then a(i, j) = "added(" & i & ", " & j & ")" End If Next j Next i
'配列の内容をシートに書き出す Sheets.Add For i = 0 To UBound(a, 1) For j = 0 To UBound(a, 2) Cells(i + 1, j + 1) = a(i, j) Next j Next i End Sub |
配列の使い方のモヤモヤが晴れて
すっきりしました。
Excelはシートを配列代わりに使えるので
配列を使わなくてもやっていけますが、
処理の速度のことを考えたら
一回一回セルに値を入れるのはよくないな~と思ってはいました。
まだ試作段階のプロシージャは
逐一、値の変化が見えた方が便利なので
ついついそのままでした。
よし、これからは最終段階では配列を使おう。