VBAの2次元配列の解説

リスト(1次元配列)を生成する方法がわかったので、次はデータテーブルの使い方をご覧ください。 次のプロシージャでは、国名、通貨名、および為替レートを格納する2次元配列が生成されます。

Sub Exchange()
Dim t As String
Dim r As String
Dim Ex(3, 3) As Variant
t = Chr(9) 'tab
r = Chr(13) 'Enter
Ex(1, 1) = "Japan"
Ex(1, 2) = "Yen"
Ex(1, 3) = 128.2
Ex(2, 1) = "Mexico"
Ex(2, 2) = "Peso"
Ex(2, 3) = 9.423
Ex(3, 1) = "Canada"
Ex(3, 2) = "Dollar"
Ex(3, 3) = 1.567
MsgBox "Country " & t & t & "Currency" & t & "per US$" _
& r & r _
& Ex(1, 1) & t & t & Ex(1, 2) & t & Ex(1, 3) & r _
& Ex(2, 1) & t & t & Ex(2, 2) & t & Ex(2, 3) & r _
& Ex(3, 1) & t & t & Ex(3, 2) & t & Ex(3, 3), , _
"Exchange"
End Sub

プロシージャExchangeを実行すると、3列の情報を示す情報ボックスが表示されます。

メッセージボックスに表示されるテキストはカスタマイズできます。

配列の次元

Sub 配列の例():

Dim x As Long, y As Long
Dim arr(1 To 10, 1 To 3) '10行3列を保持できる配列スペースを作成する
For x = 1 To 4
For y = 1 To 3
arr(x, y) = Cells(x, y) 'セル範囲a1:c4のデータをループで配列にロードする
Next y
Next x
MsgBox arr(4, 3) '提供された行と列番号に基づいて配列を表示する
arr(1, 2) = "書き直してみます"'配列内の指定された位置のデータはいつでも変更できる
MsgBox arr(1, 2)
End Sub

まとめ:2次元は、行と列で表される配列です。例えば、ARR(3,2)は、配列の3番目の行と2番目の列の要素を表します。1次元配列は、ARR(4)が配列の4番目の要素を意味するなど、1つの要素によってのみ決定されます。

静的および動的配列

これまで、この記事では静的配列を紹介してきました。静的配列は、特定のサイズの配列です。配列のサイズが事前にわかっている場合は、静的配列を使用してください。静的配列のサイズは、配列の宣言ステートメントで決定されます。例えば、ステートメントDimFruits(10)AsStringは、Fruitsと呼ばれる10個のメンバーで構成された静的配列を宣言します。

しかし、配列に含まれるメンバーの数がわからない場合はどうしますか?プロシージャがユーザー入力によって決定される場合、ユーザーが提供するメンバーの数は、プログラムが実行されるたびに変わる可能性があります。 宣言する配列がメモリを浪費しないことを確認したらどうしますか?
配列を宣言した後、VBAは配列を格納するのに十分なメモリを残します。必要以上のメンバーがある配列を宣言すると、コンピューターのメモリが浪費されます。この問題の解決策は、配列を動的にすることです。動的配列は、サイズを変更できる配列です。配列のサイズはプログラムを実行するたびに決定される場合、動的配列を使用してください。

1、現在のプロジェクトに新しいモジュールを挿入し、名前をDynamicArraysに変更します

2、次のDynArrayプロシージャを入力します:

Sub DynArray( )
Dim counter As Integer
'declare a dynamic array
Dim myArray( ) As Integer
'specify the initial size of the array
Redim myArray(5)
Workbooks.Add
'populate myArray with values
For counter = 1 to 5
myArray(counter) = counter +1
ActiveCell.Offset(counter-1, 0).Value = myArray(counter)
Next
'change the size of myArray to hold 10 elements
Redim Preserve myArray(10)
'add new values to myArray
For counter = 6 To 10
myArray(counter) = counter * counter
With ActiveCell.Offset(counter-1, 0)
.Value = myArray(counter)
.Font.Bold = TrueEnd with
Next counter
End Sub

3、ExcelウィンドウとVBエディターウィンドウを並べて表示します

4、プロシージャDynArrayがコードを1つずつ実行します。コードの途中にマウスを置き、F8キーを押すと、ステートメントを1つずつ実行できます。

プログラム

DynArrayの実行結果を次の図に示します。

10個のデータの配列を表示します

プロシージャDynArrayで、Dim myArray() As IntegerステートメントはmyArrayと呼ばれる動的配列を宣言します。このステートメントは配列を宣言していますが、配列にメモリを割り当てません。最初のReDimステートメントはmyArrayの開始サイズを明確にし、5つのメンバーを格納するために10バイトのメモリを占有します。ご存知のように、各整数データには2バイトのメモリが必要です。

ステートメントWorkbooks.Addは新しいブックを開き、For…Nextループは配列myArrayにデータを入力し、配列のメンバーをワークシートに書き込みます。ループが始まる前は、counter変数は1です。ループの最初のステートメント:

myArray(counter) = counter + 1

myArrayの最初のメンバーに値2を割り当てます。2番目のステートメント:

ActiveCell.Offset(counter-1, 0).Value = myArray(counter)

myArrayメンバーの値を現在のセルに入力します。現在のセルはA1です。counter変数は1に等しいため、上記のステートメントは次のようになります。

ActiveCell.Offset(1-1, 0).Value = myArray(1)

或は

ActiveCell.Offset(0,0).Value = myArray(1)

上記のステートメントは、セルA1にデータを入力します。ループ内のステートメントは5回実行されます。VBは、適切なワークシートのセルにデータを入力し、次のステートメントに進みます。

ReDim Preserve myArray(10)

通常、配列のサイズを変更すると、配列の元のデータがすべて失われます。ステートメントReDimは、配列を再初期化します。ただし、ステートメントReDimの後にキーワードPreserveを置くことにより、既存の配列に新しいメンバーを追加できます。つまり、キーワードPreserveは、サイズ変更された配列が既存のデータを失わないことを保証します。無視すると、新しい配列は空白になります。

2番目のFor…Nextループは、配列myArrayの6番目、7番目、8番目、9番目、10番目のメンバーに値を割り当てます。今回は、配列メンバーの値が乗算されます。counter * counter。VBは太字を使用して、配列の他の値を適切なワークシートセルに入力します。

ヒント:配列のサイズを決定します。

配列を使用する前に、配列のサイズをDimまたはReDimステートメントで決定する必要があります。これは、DimまたはReDimステートメントを使用して配列を宣言するまで、配列メンバーに値を割り当てることができないことを意味します。

Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です