VBAでは定数の配列は宣言できない
VBAでは定数の配列は宣言できない(エラーになる)のですが、代わりに定数配列もどきを作る方法を思いついたので、書き留めたいと思います。
はじめに、定数配列の代わりとして一般的に使われている方法を2つ紹介して、最後に定数配列もどきの作り方を紹介します。
結論を言うと、いずれも一長一短があり、ベストな方法はなさそうです。
方法①:Split関数を使う方法
「VBA 定数 配列」などで検索すると出てくる方法です(※他の方の記事を参考にしました)。
コード
Const CONST_STR_ARRAY As String = "HELLO,HI,HEY"
'main
Public Sub main()
Dim i As Long
Dim STR_ARRAY As Variant
STR_ARRAY = Split(CONST_STR_ARRAY, ",")
For i = 0 To 2
Debug.Print STR_ARRAY(i) & " WORLD!"
Next i
End Sub
出力
HELLO WORLD!
HI WORLD!
HEY WORLD!
短所:再代入できる
実体は配列なので再代入できてしまいます。
これでは、定数配列とは言えません。STR_ARRAY(2) = "NEW"
方法②:Array関数を使う方法
こちらも「VBA 定数 配列」などで検索すると出てくる方法です(※他の方の記事を参考にしました)。
コード
'main
Public Sub main()
Dim i As Long
Dim STR_ARRAY As Variant
STR_ARRAY = Array("HELLO","HI","HEY")
For i = 0 To 2
Debug.Print STR_ARRAY(i) & " WORLD!"
Next i
End Sub
出力 (※前回と同じ)
HELLO WORLD!
HI WORLD!
HEY WORLD!
短所:再代入できる
実体は配列なので再代入できてしまいます。
これでは、定数配列とは言えません。STR_ARRAY(2) = "NEW"
方法③:Functionプロシージャを使う方法
定数配列もどきを紹介します。
これは、配列とFunction
の書き方が似ている(どちらも丸括弧を使う)を利用した方法です。
実体はFunction
なのに、まるで配列のように見えます。
コード
'定数配列もどき
Private Function STR_ARRAY(index) As String
Select Case index
Case 0
STR_ARRAY = "HELLO"
Case 1
STR_ARRAY = "HI"
Case 2
STR_ARRAY = "HEY"
Case Else
Error 9 'インデックスが有効範囲にありません。
End Select
End Function
'main
Public Sub main()
Dim i As Long
For i = 0 To 2
Debug.Print STR_ARRAY(i) & " WORLD!" '定数配列のように見える
Next i
End Sub
出力 (※前回と同じ)
HELLO WORLD!
HI WORLD!
HEY WORLD!
短所:配列関連の関数が使えない
- 配列だと使える関数が使えません(※かなり不便)
LBound
UBound
IsArray
短所:[ウォッチ式の追加]が利用できない
- 追加までは出来るのですが、値欄には
<ウォッチ式が不正です。>
と表示されます。
番外編:Evaluateメソッドを使う方法
コメント欄で、Evaluate
メソッドを使う方法を紹介して頂きました。(勝手に紹介してスミマセン...)。
この方法は配列の添字(インデックス)が1から始まる点に注意が必要です。
ちなみにEvaluate
メソッドとは、ワークシートの数式をVBAで実行する場合に用いるものです。
Evaluate
メソッドには、[]
で囲む簡略化した書き方も用意されていて、どちらで書いても同じ意味です。
コード
'main
Public Sub main()
Dim i As Long
Dim STR_ARRAY As Variant
STR_ARRAY = [{"HELLO","HI","HEY"}]
'Evaluateメソッドを使った書き方(同じ意味)
'STR_ARRAY = Evaluate("{""HELLO"",""HI"",""HEY""}")
For i = 1 To 3
Debug.Print STR_ARRAY(i) & " WORLD!"
Next i
End Sub
出力 (※前回と同じ)
HELLO WORLD!
HI WORLD!
HEY WORLD!
注意:配列の添字(インデックス)は1から始まる
For
ループを0
から始めると、Debug.Print STR_ARRAY(0) & " WORLD!"
を表示するタイミングで、エラーが出ます。For i = 0 To 2 '実行時エラー'9': インデックスが有効範囲にありません。 Debug.Print STR_ARRAY(i) & " WORLD!" Next i