« 1次元配列の使い方 | トップページ | 正多角形の内角の組合せ »

2010年10月16日 (土)

2次元配列の使い方

記事「 配列の使い方を整理」で説明したように
以下の順番でみていきます。

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はシートを配列代わりに使えるので
配列を使わなくてもやっていけますが、
処理の速度のことを考えたら
一回一回セルに値を入れるのはよくないな~と思ってはいました。

まだ試作段階のプロシージャは
逐一、値の変化が見えた方が便利なので
ついついそのままでした。
よし、これからは最終段階では配列を使おう。

|

« 1次元配列の使い方 | トップページ | 正多角形の内角の組合せ »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 2次元配列の使い方:

« 1次元配列の使い方 | トップページ | 正多角形の内角の組合せ »