web-dev-qa-db-de.com

Kann ein Array als Konstante deklariert werden?

Kann man entweder:

  1. Deklarieren Sie ein Array als Konstante

    OR

  2. 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.

13
ChrisB

Sie können eine Funktion verwenden, um das Array zurückzugeben und die Funktion als Array zu verwenden.

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

 enter image description here

 enter image description here

23
user6432984

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!

6
A.S.H

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.

4
Soulfire

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
1
S Meaden

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

0
Tragamor

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") ))

0
BillR

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
0
Pankaj Jaju

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,",")
0
Webrohm

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
0
Pragmateek