Excel VBA 配列の使い方 – 宣言、初期化、再定義

「配列って聞いたことあるけど、使い方とかよくわからない」ってことありませんか?

配列を使うと、処理を高速化したり、利便性の向上であったり、様々なメリットがあります。

今回は、そんな便利な配列の宣言、初期化、再定義について簡単に解説していきます。

こんなあなたにおすすめ
  • 初期化、宣言、再定義について知りたい

配列について知りたい方は、以下をご参照ください。

Excel VBA 配列の使い方

宣言

「静的配列」と「動的配列」の宣言では、配列の上限値を指定するかどうかの違いのみです。

静的配列

基本的な書き方は、以下の通りです。

コード

Dim 配列名(上限値) as データ型

実際に静的配列を使ったコードを見ていきましょう。

コード

Sub test()

    Dim arr(2) As String
    
    arr(0) = "1"
    arr(1) = "2"
    arr(2) = "3"
        
    Dim msg As String
    msg = Join(arr, ", ")
    
    MsgBox msg

End Sub

●実行結果

手順1
配列の定義
インデックスが0~1の配列arrを定義
手順2
配列に要素の格納
各インデックスに要素を格納
手順3
Joinで配列の要素を結合
Joinで配列の要素(“123″)を”, “区切りで結合
手順4
メッセージボックスを表示

上の手順を図で書いたものが、下図になります。

配列の下限値を設定することも可能です。

コード

Dim 配列名(下限値 To上限値) as データ型
コード

Sub test()
    
    Dim arr(1 To 3) As String
    
    arr(1) = "1"
    arr(2) = "2"
    arr(3) = "3"
    
    MsgBox Join(arr, ", ")

End Sub

インデックス範囲外で要素を取得しようとすると、エラーが発生するため、注意しましょう。

動的配列

基本的な書き方は、以下の通りです。

コード

Dim 配列名() as データ型

実際に動的配列を使ったコードを見ていきましょう。

コード

Sub test()

    Dim arr() As String
    ReDim arr(2)    '配列を再定義
    
    arr(0) = "1"
    arr(1) = "2"
    arr(2) = "3"
    
    MsgBox Join(arr, ", ")

End Sub

●実行結果

初期化

初期化には、「Erase」、「Array」の2通りの方法があります。

Erase

基本的な書き方は、以下の通りです。

コード

Erase 配列名

「静的配列」、「動的配列」で初期化した際の動きが違ってきます。

「静的配列」が、データ型によって初期化後の値が変わるのに対し、
「動的配列」は、初期化した際、配列自体がインデックスのない空の状態になります。

では、詳しく見ていきましょう。

静的配列

配列のデータ型によって、初期化した後の中身が変わってきます。

  • 数値型 → 0(数値)
  • 文字列型 → “”(からの文字列)

実際に数値に対して、Eraseを使ったコードを見ていきましょう。

コード

Sub test()

    Dim i As Integer
    Dim arr(2) As Integer
    
  '------------------------------------------------------------------------
  '● 初期化前
  '------------------------------------------------------------------------
    msg = "【初期化前】" & vbCrLf
    For i = 0 To 2
        arr(i) = i + 1
        msg = msg & " arr " & i & " : " & arr(i) & vbCrLf
    Next i
    
    Erase arr    '初期化

  '------------------------------------------------------------------------
  '● 初期化後
  '------------------------------------------------------------------------
    msg = msg & "【初期化後】" & vbCrLf
    For i = 0 To 2
        msg = msg & " arr " & i & " : " & arr(i) & vbCrLf
    Next i
    
    MsgBox msg
    
End Sub

●実行結果

データ型が数値の場合、Eraseで初期化すると各要素は、”0″になります。

続いて文字列に対して、Eraseを使ったコードを見ていきましょう。

コード

Sub test()

    Dim i As Integer
    Dim arr(2) As String
    
  '------------------------------------------------------------------------
  '● 初期化前
  '------------------------------------------------------------------------
    msg = "【初期化前】" & vbCrLf
    For i = 0 To 2
        arr(i) = "文字列"
        msg = msg & " arr " & i & " : " & arr(i) & vbCrLf
    Next i
    
    Erase arr    '初期化

  '------------------------------------------------------------------------
  '● 初期化後
  '------------------------------------------------------------------------
    msg = msg & "【初期化後】" & vbCrLf
    For i = 0 To 2
        msg = msg & " arr " & i & " : " & arr(i) & vbCrLf
    Next i
    
    MsgBox msg
    
End Sub

●実行結果

データ型が文字列の場合、Eraseで初期化すると各要素は、””(空)になります。

動的配列

実際に動的配列を使ったコードを見ていきましょう。

コード

Sub test()

    Dim arr() As String
    ReDim arr(2)

  '------------------------------------------------------------------------
  '● 初期化前
  '------------------------------------------------------------------------    
    arr(0) = "1"
    arr(1) = "2"
    arr(2) = "3"
    
    MsgBox Join(arr, ", ")
    
    Erase arr

  '------------------------------------------------------------------------
  '● 初期化後
  '------------------------------------------------------------------------    
    'ReDim arr(2)   '←ここで配列の再定義をすることで、エラーを回避

    arr(0) = "0"    '←ここでインデックスエラーが発生
    arr(1) = "1"
    arr(2) = "2"

End Sub

上のコードを実行した場合、初期化後の”arr(0)”でインデックスエラーが発生します。

これは、動的配列を初期化した際、静的配列のように要素だけではなく、インデックスも初期化するためです。

エラーを回避するためには、初期化後に配列を再定義する必要があります。

一見、動的配列の方が使いづらいように見えますが・・・
配列の要素数が変わってくる場合に、動的配列は力を発揮してくれます!

Array

Arrayは、動的配列のみで使用できます。

初期化した際、要素がなくなるため、配列を再定義する必要があります。

Arrayを使って初期化した場合、中身が消えるため、注意しましょう。

コード

'初期化
    配列名 = Array()
'------------------------------------------------------------------------
'初期化 & 再定義
    配列名 = Array(要素1, 要素2, ・・・)

Arrayは、動的配列のみで使用できます。

初期化した際、要素がなくなるため、配列を再定義する必要があります。

Arrayを使って初期化した場合、中身が消えるため、注意しましょう。

コード

Sub test()

    Dim i As Integer
    Dim arr() As Variant
    
    arr = Array(0, 1, 2)

  '------------------------------------------------------------------------
  '● 初期化前
  '------------------------------------------------------------------------      
    msg = "【初期化前】" & vbCrLf
    For i = 0 To 2
        arr(i) = i + 1
        msg = msg & " arr " & i & " : " & arr(i) & vbCrLf
    Next i
    
    arr = Array(0, 1, 2)    '配列を初期化 & 再定義

  '------------------------------------------------------------------------
  '● 初期化後
  '------------------------------------------------------------------------    
    msg = msg & "【初期化後】" & vbCrLf
    For i = 0 To 2
        msg = msg & " arr " & i & " : " & arr(i) & vbCrLf
    Next i
    
    MsgBox msg
        
End Sub

再定義

「ReDime」を使って、配列を再定義することができます。

コード

ReDim 配列名(上限値) As データ型名

上のコードでは、1つ問題があります。

それは要素を再定義した際に、中身がすべて消えてしまいます。

もし中身を消さずに配列を再定義したい場合は、「Preserve」を使いましょう。

コード

ReDim Preserve 配列名(上限値)

「Preserve」を使うことで、下図のように元の要素を残したまま、配列を再定義できます。

実際にPreserveを使ったコードを見ていきましょう。

コード

Sub test()

    Dim arr() As String
    ReDim arr(2)
    
    arr(0) = "1"
    arr(1) = "2"
    arr(2) = "3"
    
    MsgBox Join(arr, ", ")
    
    ReDim Preserve arr(3)
    arr(3) = "4"
    
    MsgBox Join(arr, ", ")

End Sub
●実行結果 再定義前
●実行結果 再定義後

まとめ

ここまで、Excel VBAで配列の宣言、初期化、再定義について解説しました。

最初は、エラーが出たり大変かもしれませんが、使いこなせるようになると便利ですので、お試しください。

コメントを残す

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