「配列って聞いたことあるけど、使い方とかよくわからない」ってことありませんか?
配列を使うと、処理を高速化したり、利便性の向上であったり、様々なメリットがあります。
今回は、そんな便利な配列の宣言、初期化、再定義について簡単に解説していきます。
- 初期化、宣言、再定義について知りたい
配列について知りたい方は、以下をご参照ください。
宣言
「静的配列」と「動的配列」の宣言では、配列の上限値を指定するかどうかの違いのみです。
静的配列
基本的な書き方は、以下の通りです。
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
●実行結果
上の手順を図で書いたものが、下図になります。
配列の下限値を設定することも可能です。
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で配列の宣言、初期化、再定義について解説しました。
最初は、エラーが出たり大変かもしれませんが、使いこなせるようになると便利ですので、お試しください。