0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBAで定数配列もどきを作る

Last updated at Posted at 2022-08-08

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
0
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?