【17】VBAの「配列」について

記事で紹介しているエクセル
・エクセル2019 [64ビット版]

目次

「配列」とは?

今回は「配列」について解説いたします。

そもそも配列とは何か?

分かりやすく言えば、1つの変数に対して、複数の値を入れられる事です。

サンプルコードにて説明します。

Sub test16()
    
    Dim A(2) As String
    
    A(0) = "ニワトリ"
    A(1) = "カモ"
    A(2) = "ペンギン"
    
    MsgBox A(0)
    MsgBox A(1)
    MsgBox A(2)
    
End Sub

「Dim A(2) As String」は文字列型で宣言していますが、括弧と数字があります。

イメージとしては、変数Aという箱が3つあり、変数Aの箱にそれぞれ「0番」「1番」「2番」が付いている感じです。

これが配列であり、この場合は「配列A」になります。

この3つの箱の数は「要素数」と呼ばれ、配列Aの要素数は「3」になります。

配列の箱は、予め数を用意できます。

このような配列を「静的配列」と呼びます。

このサンプルコードを実行すると以下の通りになります。

画像1

しかしこれだけ見ると、わざわざ配列にしなくても、変数を3個用意すれば同じです。

そこで配列の利点について説明いたします。

例えば、今回は3個しか値がありませんでしたが、これが100個の場合はどうでしょうか?

かなりコードが長くなる事が想像できると思います。

そこで、配列ではループ処理を使う事で、コードを短くする事ができます。

以下のサンプルコードを見て下さい。

Sub test16a()
    
    Dim A(2) As String
    
    A(0) = "ニワトリ"
    A(1) = "カモ"
    A(2) = "ペンギン"
    
    For i = 0 To 2
        MsgBox A(i)
    Next
    
End Sub

For文を使うことで、3行記入していたMsgBoxを1行で表す事ができます。

画像2

今回は文字列型で配列を使いましたが、もちろん数値型などでも配列を使うことができます。

配列は様々なデータを処理する上で欠かせません。

簡単なプログラムでは、配列を使う事なく処理できますが、大規模になればなるほど、配列は必ず使われているでしょう。

しっかりと覚えておきましょう。

<補足情報>動的配列について

「動的配列」と利用例

先程の解説では「静的配列」について説明しました。

静的とは、言い換えれば固定であり、配列数が3個に固定されていたので、静的な配列と呼ばれています。

一方で、配列数を固定せず、プログラムの中で必要に応じて用意する事も可能です。

これを「動的配列」と呼びます。

ちなみにですが、コンピュータの世界では「静的:Static(スタティック)」と「動的:Dynamic(ダイナミック)」という表現は、値を固定しているか固定していないかで、しばしば使われますので覚えておきましょう。

以下に動的配列のサンプルコードを用意しました。

Sub test16b()
    
    '動的配列の宣言
    Dim A() As String
    
    '要素数を定義する
    ReDim A(3)
    
    A(0) = "ニワトリ"
    A(1) = "カモ"
    A(2) = "ペンギン"
    A(3) = "カラス"
    
    For i = 0 To 3
        MsgBox A(i)
    Next
    
End Sub

配列を宣言する際に「Dim A() As String」と要素数を入れてません。

これが動的配列になります。

しかし、動的配列を使うには、要素数を定義してあげる必要があります。

ReDim <配列名>(<定義する要素数>)

「ReDim A(3)」が動的配列の要素数定義になります。

これだけ見れば、静的配列も動的配列もあまり変わりません、

むしろ動的配列の方が面倒です。

しかしプログラムによっては、この要素数が決まっていないケースがある場合、この動的配列は有効です。

これまでVBAの話を中心にしてきましたが、本サイトではエクセルVBAについて解説していく予定なので、エクセルを絡めて説明します。

以下のサンプルコードと「画像3:入力されたエクセル」を見て下さい。

Sub test16c()
    
    '動的配列の宣言
    Dim A() As String
    '要素数を入れるための変数宣言
    Dim ElementNum As Integer
    
    'エクセルのシートA列に入力されている数を代入
    ElementNum = WorksheetFunction.CountA(Range("A:A"))
    
    '要素数を定義する
    ReDim A(1 To ElementNum)
    
    For i = 1 To ElementNum
        'エクセルの値を取得
        A(i) = Cells(i, 1).Value
        MsgBox A(i)
    Next
    
End Sub
画像3:入力されたエクセル

少し複雑化してますが、とりあえず1つずつ解説いたします。

    '動的配列の宣言
    Dim A() As String
    '要素数を入れるための変数宣言
    Dim ElementNum As Integer

まず動的配列と変数宣言をしています。

この変数「ElementNum」には、動的配列の要素数を代入する予定です。

    'エクセルのシートA列に入力されている数を代入
    ElementNum = WorksheetFunction.CountA(Range("A:A"))

ここでは、エクセルのA列にいくつ値が入っているかを取得しています。

「WorksheetFunction.CountA(Range(“A:A”))」については、今後詳しく解説しますので、現時点では「A列に値が入っている数を取得している」とだけ理解していただければ問題ありません。

A列には「山田」「田中」「加藤」の3つの値が入ってます。

よって変数ElementNumは「3」になります。

    '要素数を定義する
    ReDim A(1 To ElementNum)

要素数を定義するのに「To」が出てきました。

これは例えば、配列宣言(Dim)、配列数の再定義(ReDim)のどちらでも使う事ができます。

「A(2 To 4)」とした場合、「配列A(2)」「配列A(3)」「配列A(4)」として、3つの要素が定義されます。

配列はこの「To」を使わなければ、通常配列番号は「0」からです。

今回配列番号を1から始める理由は、後で述べますが、このような使い方ができる事を覚えておきましょう。

配列Aは「A(1 To ElementNum)」->「A(1 To 3)」となり、「A(1)」「A(2)」「A(3)」が用意され、要素数は3個になりました。

    For i = 1 To ElementNum
        'エクセルの値を取得
        A(i) = Cells(i, 1).Value
        MsgBox A(i)
    Next

最後はFor文のループ処理です。

「For i = 1 To ElementNum」は「For i = 1 To 3」です。

3回繰り返す事になります。

「A(i) = Cells(i, 1).Value」は、A列の1行目の値を取得しています。

これについて少し説明しますが、後々に詳しく解説しますので、今は何となく程度で覚えて下さい。

このCellsは「Cells(<行番号>,<列番号>).Value」で、エクセルの値を取得できます。

エクセルのA列1行目は、1行目なので行番号が「1」で、A列は1列目なので列番号は「1」になります。

For分でループ処理させる事で、「Cells(i, 1).Value」は「Cells(1, 1).Value」「Cells(2, 1).Value」「Cells(3, 1).Value」となり、「A列1行目」「A列2行目」「A列3行目」を取得しています。

先程「配列番号を1から始める理由」について答えると、配列番号を「0」からスタートした場合、「Cells(0, 1).Value」で存在しない行を取得することでエラーになるからです。

「MsgBox A(i)」ではそれぞれ、「山田」「田中」「加藤」が出力されます。

エクセルのA列の値が今回は3つでしたが、5つだったらどうでしょうか?

「山田」「田中」「加藤」「北島」「新岡」と5行入力されていた場合、もし静的配列だったら、プログラムコードの配列要素数を変更する必要があります。

しかし、今回のtest16c関数では、エクセルから取得した値に応じて、柔軟に要素数の変更ができ、プログラムコードの変更が必要ありません。

このような場合、動的配列は有効と言えます。

画像4
よかったらシェアしてね!
目次
閉じる