TOP

VBA-レッスン 13.2。配列 (Arrays) の使用 (続き)


複数の列のデータを格納するには、異なる次元の配列が必要です。例:

データを 2 次元配列に保存する:

 '宣言
 Dim array_example(10, 2) '11 x 3 の「定義された」配列

 'データを配列に保存する
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

これらの値を操作する例をいくつか示します。

MsgBox array_example(0, 0)  '=> 戻り値: 03.11.2026
MsgBox array_example(0, 1)  '=> 戻り値: 24
MsgBox array_example(9, 2)  '=> 戻り値: NO
MsgBox array_example(10, 2) '=> 戻り値: YES

動的配列

配列内のデータを定期的に更新する必要があるため、宣言時に固定値を割り当てることができないことを少し想像してみましょう...

空ではない最後のセル、つまりデータベースの最後の行の行番号を確認するには、次の式を使用します。

last_row = Range("A1").End(xlDown).Row

Excel は、宣言内で変数を受け入れません。

代わりに、(空の括弧を使用して) 動的配列を宣言し、Redim を使用してそのサイズを定義します。

Dim array_example()
ReDim array_example(last_row - 2, 2)

次の手順を使用すると、データセット (テーブル) のすべての行を配列に保存できます。

Dim array_example()
ReDim array_example(last_row - 2, 2)

上り

前の例では、配列の最後の番号は last_row - 2 でした。

For i = 0 To last_row - 2

配列の最後の数値を決定する別の方法は、Ubound を使用することです。

For i = 0 To UBound(array_example)

この関数は、選択した次元の配列内の最大の数値を返します (最初の次元がデフォルトです)。

これをより明確にするいくつかの例を次に示します。

Sub example()
     Dim array_example(10, 2)
     
     MsgBox UBound(array_example)    '=> 戻り値: 10
     MsgBox UBound(array_example, 1) '=> 戻り値: 10
     MsgBox UBound(array_example, 2) '=> 戻り値: 2
End Sub

配列要素の範囲にデータを保存する

ループを使用しなくても、ワークシート上のセル範囲の値を配列に設定することができます。

 '宣言
 Dim array_example(10, 2) '11 x 3 の「定義された」配列

 'データを配列に保存する
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

前述のコードは、次のように効果的に置き換えることができます。

 '宣言
 Dim array_example()

 'データを配列に保存する
 array_example = Range("A2:C12").Value

2 番目の方法は最初の方法よりも魅力的に見えますが、ほとんどの場合、最初の方法よりも実装に時間がかかる可能性があることに注意してください。

この方法でデータを配列に保存すると、最初の数値が 0 ではなく 1 になり、混乱が生じる可能性があります。

コードを増やすプロセスの後半で、特定の検索条件に一致するデータのみを配列に保存する場合 (またはまったく異なる操作を実行する場合)、別のループ関数を使用してコードを完全に書き直す必要があります。

ただし、この 2 番目の方法は、ループよりも高速であるため (15,000 レコードごとに約 0.2 秒節約できます)、大規模なデータ セットの内容全体を保存する必要がある場合に非常に便利です。

配列 (Array)

ただし、「固定」内容を持つ配列を作成する必要がある場合。

解決策の 1 つは、値をテープごとに記録することです。

Dim en(5)

en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "ISNUMBER"
en(5) = "MID"

幸いなことに、配列 (Array) を使用すると、このコードを簡素化できます。

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")

ここでは、関数 Replace の使用例を示します (これは、次の例を理解するのに役立ちます)。

Sub replace_example()
     Dim var_translate As String

     'この例のテキスト リボン
     var_translate = "Hello World !"
     
     'テキストリボンの「World」を「you」に置き換えます
     var_translate = Replace(var_translate, "World", "you")

     '交換後のテープ
     MsgBox var_translate '=> 「こんにちは!」を返します。
End Sub

ここで、一連の値を別のデータ セットに置き換える場合は、配列と Array 関数を使用すると非常に便利です。

Sub translate() '数式を英語からフランス語に翻訳する簡単な例
     Dim var_translate As String

     'この例のテキスト リボン
     var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))"
     
     '2 つの値セット
     en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
     fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
     
     '「SI」を「IF」に、「RECHERVEV」を「VLOOKUP」などに置き換えます。
     For i = 0 To UBound(en)
         var_translate = Replace(var_translate, en(i), fr(i))
     Next

     '交換後のテープ
     MsgBox var_translate '=> "Formula を変換する: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))" を返します
End Sub

テキストを配列に変換 (VBA Split)

Split 関数を使用すると、文字列を部分に分割し、結果の値を配列に書き込むことができます。

リボンを配列に変換するには、次の手順を実行します。

variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"

VBA 関数 Split を使用して区切り文字を指定します。

en = Split(variable, "/")

「en」配列は次の値を返します。

MsgBox en(0) '=> 戻り値: IF
MsgBox en(1) '=> 戻り値: VLOOKUP
MsgBox en(2) '=> 戻り値: SUM
MsgBox en(3) '=> 戻り値: COUNT
MsgBox en(4) '=> 戻り値: ISNUMBER
MsgBox en(5) '=> 戻り値: MID

次の 3 つの配列も同じ値を返します。

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")

次の例は、文字列の 3 番目の値を返します。

MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> 戻り値: SUM

Split の逆は、VBA 関数 Join です。

この関数は、配列の値を文字列に収集します。

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> 戻り値 : 12345