web-dev-qa-db-ja.com

配列を定数として宣言できますか?

以下のいずれかが可能ですか?

  1. 配列を定数として宣言する

    OR

  2. 回避策を使用して、要素の追加、削除、または変更から保護されている配列を宣言します。したがって、マクロの存続期間中は機能的に一定ですか。

もちろん、私はこれを行うことができます:

Const myConstant1 As Integer = 2
Const myConstant2 As Integer = 13
Const myConstant3 As Integer = 17
Const myConstant4 ...and so on

...しかし、配列を扱う優雅さを失います。定数を配列にロードし、使用するたびにリロードすることもできますが、使用前にこれらの定数値で配列をリロードしないと、コードが変更された「定数」値にさらされる可能性があります。

実行可能な答えは大歓迎ですが、理想的な答えは、一度セットアップすれば、他のコードが変更されたときに変更やメンテナンスを必要としないものです。

16
ChrisB

関数を使用して配列を返し、関数を配列として使用できます。

Function ContantArray()
    ContantArray = Array(2, 13, 17)
End Function

enter image description here

enter image description here

26
user6432984

機能化してみませんか?といった:

Public Function myConstant(ByVal idx As Integer) As Integer
    myConstant = Array(2, 13, 17, 23)(idx - 1)
End Function

Sub Test()
    Debug.Print myConstant(1)
    Debug.Print myConstant(2)
    Debug.Print myConstant(3)
    Debug.Print myConstant(4)
End Sub

誰も変更したり、サイズを変更したり、コンテンツを編集したりすることはできません...さらに、1行だけで定数を定義できます!

6
A.S.H

"1,2,3,4,5"String定数を宣言し、Splitを使用して新しい配列を作成しました。

Public Const myArray = "1,2,3,4,5"

Public Sub createArray()

        Dim i As Integer
        A = Split(myArray, ",")

        For i = LBound(A) To UBound(A)
                Debug.Print A(i)
        Next i

End Sub

ReDimAまたはReDim Preserveを使用しようとしたとき、それは許可されませんでした。このメソッドの欠点は、サイズを変更できない場合でも、配列の値を編集できることです。

5
Soulfire

特定のVBA環境がExcel-VBAの場合、ExcelアプリケーションのEvaluateメソッドから角括弧に短縮できるNice構文を利用できます。

これ見て

Sub XlSerialization1()
    Dim v
    v = [{1,2;"foo",4.5}]

    Debug.Assert v(1, 1) = 1
    Debug.Assert v(1, 2) = 2
    Debug.Assert v(2, 1) = "foo"
    Debug.Assert v(2, 2) = 4.5

    '* write all cells in one line
    Sheet1.Cells(1, 1).Resize(2, 2).Value2 = v
End Sub
1
S Meaden

いいえ-配列を定数として宣言することはできませんが、回避策を使用できます。

必要な配列を返す関数を作成できます

http://www.vbaexpress.com/forum/showthread.php?1233-Solved-Declare-a-Constant-Array

0
Tragamor

これがいつ変更されたかはわかりませんが、Excel 365では、これは機能します(または、少なくともコンパイラエラーを生成しません):Const table1Defs As Variant = Array( "value 1"、42、Range( "A1:D20" ))

0
BillR

配列を定数として宣言できますか?いや.

回避策-私が考えることができる最も簡単な方法は、定数をdelimで定義し、Split関数を使用して配列を作成することです。

Const myConstant = "2,13,17"

Sub Test()
    i = Split(myConstant, ",")

    For j = LBound(i) To UBound(i)
        Debug.Print i(j)
    Next
End Sub
0
Pankaj Jaju

これは単純すぎますか?

PUBLIC CONST MyArray = "1,2,3,4"

その後、モジュールで:

Dim Arr as Variant

SET Arr = split(MyArray,",")
0
Webrohm

毎回新しいインスタンスが必要ない場合は、Staticローカル変数を使用して、複数のオブジェクトの作成と初期化を回避できます。

Private Function MyConstants()
    Static constants As Variant

    If IsEmpty(constants) Then
        constants = Array(2, 13, 17)
    End If

    MyConstants = constants
End Function
0
Pragmateek