Kann man entweder:
Deklarieren Sie ein Array als Konstante
OR
Verwenden Sie eine Problemumgehung, um ein Array zu deklarieren, das vor dem Hinzufügen, Löschen oder Ändern von Elementen geschützt ist und daher während der Lebensdauer eines Makros funktional konstant ist.
Natürlich könnte ich das machen:
Const myConstant1 As Integer = 2
Const myConstant2 As Integer = 13
Const myConstant3 As Integer = 17
Const myConstant4 ...and so on
... aber es verliert die Eleganz der Arbeit mit Arrays. Ich könnte auch die Konstanten in ein Array laden und sie jedes Mal erneut laden, wenn ich sie benutze. Wenn das Array jedoch vor der Verwendung nicht erneut mit diesen konstanten Werten geladen wird, kann dies zu einem "konstanten" Wert führen, der sich geändert hat.
Jede praktikable Antwort ist willkommen, aber die ideale Antwort ist eine, die einmal eingerichtet werden kann und keine Änderungen/Pflege erfordert, wenn anderer Code geändert wird.
Wie wäre es, eine Funktion daraus zu machen? Sowie:
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
Niemand kann ihn ändern, in der Größe verändern oder den Inhalt bearbeiten ... Außerdem können Sie Ihre Konstanten in nur einer Zeile definieren!
Ich habe eine Konstante String
von "1,2,3,4,5"
deklariert und dann mit Split
ein neues Array erstellt:
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
Als ich versuchte, ReDim
oder ReDim Preserve
für A
zu verwenden, hat mich das nicht zugelassen. Der Nachteil dieser Methode ist, dass Sie die Werte des Arrays auch dann bearbeiten können, wenn Sie die Größe nicht ändern können.
Wenn die spezifische VBA-Umgebung Excel-VBA ist, steht in der Evaluate-Methode der Excel-Anwendung eine Nice-Syntax zur Verfügung, die zu eckigen Klammern verkürzt werden kann.
Schau dir das an
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
Nein - Arrays können nicht als konstant deklariert werden, Sie können jedoch eine Problemumgehung verwenden.
Sie können eine Funktion erstellen, die das gewünschte Array zurückgibt
http://www.vbaexpress.com/forum/showthread.php?1233-Solved-Declare-a-Constant-Array
Weiß nicht, wann sich dies geändert hat, aber in Excel 365 funktioniert dies (oder generiert zumindest keinen Compilerfehler): Const table1Defs As Variant = Array ("Wert 1", 42, Bereich ("A1: D20") ))
Kann ein Array als Konstante deklariert werden? Nein.
Problemumgehungen - Die einfachste Möglichkeit, die ich mir vorstellen kann, ist, eine Konstante mit delim zu definieren und dann mit der Funktion Split
ein Array zu erstellen.
Const myConstant = "2,13,17"
Sub Test()
i = Split(myConstant, ",")
For j = LBound(i) To UBound(i)
Debug.Print i(j)
Next
End Sub
Ist das zu simpel?
PUBLIC CONST MyArray = "1,2,3,4"
dann später in einem Modul:
Dim Arr as Variant
SET Arr = split(MyArray,",")
Wenn Sie nicht jedes Mal eine neue Instanz benötigen, können Sie eine Static
-lokale Variable verwenden, um die Erstellung und Initialisierung mehrerer Objekte zu vermeiden:
Private Function MyConstants()
Static constants As Variant
If IsEmpty(constants) Then
constants = Array(2, 13, 17)
End If
MyConstants = constants
End Function