Deklarieren und initialisieren Sie das String-Array in VBA

126

Dies sollte gemäß einem anderen Stapelüberlaufpfosten funktionieren, aber es ist nicht:

Dim arrWsNames As String() = {"Value1", "Value2"}

Kann mich jemand wissen lassen, was los ist?

Kairan
quelle
33
Hinweis: Die Syntax für geschweifte Klammern funktioniert NICHT in VBA, sondern ist für VB.NET konzipiert. Verwechseln Sie diese beiden Umgebungen aus Gründen Ihrer eigenen Gesundheit nicht.
Boomer57
2
Wenn Sie Excel verwenden (und mit einem Variant-Array zufrieden sind), können SieDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame
1
Für alle, die sich diesen Kommentar ansehen, fast zwei Jahre später (wie ich). Es scheint, dass VBA / Excel die Syntax NICHT mag, Dim x() As Variant: x = [{"Value1", "Value2"}] wenn Sie Variablen verwenden ... dh wenn v1 = "Value1"; v2 = "Value2", dann x = [{v1, v2}]wird ein Fehler generiert, während dies x = [{"Value1", "Value2"}]nicht der Fall ist .
Chip R.

Antworten:

169

Versuche dies:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")
Eldar Agalarov
quelle
20
Erstellt technisch ein Variantenarray, kein String-Array. Natürlich könnte das Variantenarray ein Array von nur Zeichenfolgen sein, aber dieser Ansatz würde auch Datentypen ohne Zeichenfolge zulassen:myArray = Array("A", "B", 12345, "D"...)
David Zemens
10
Was ist mit Dim myStringArray () als String ... myStringArray = Array ("Katze", "Hund", "Kaninchen"). Varianten - igitt!
Andez
30
Wenn Sie es in einer Zeile haben möchten, können Sie den Doppelpunkt nach der Deklaration verwenden: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") Die Initialisierung aus dem obigen Kommentar funktioniert bei mir nicht, da Array () ein Array von Varianten und keine Zeichenfolgen erstellt
Andrej Sramko
6
Keine
4
@stifin und 3) VBA hat keinen String-Array-Initialisierer. Sie können jedoch beispielsweise Split verwenden.
Eldar Agalarov
141

Im speziellen Fall eines String-Arrays können Sie das Array mithilfe der Split-Funktion initialisieren, da es ein String-Array anstelle eines Variant-Arrays zurückgibt:

Dim arrWsNames() As String
arrWsNames = Split("Value1,Value2,Value3", ",")

Auf diese Weise können Sie die Verwendung des Variant-Datentyps vermeiden und den gewünschten Typ für arrWsNames beibehalten.

Aiken
quelle
3
Dies macht die Weitergabe an andere Funktionen auf jeden Fall sauberer.
Jason R. Mick
23

Das Problem hierbei ist, dass die Länge Ihres Arrays undefiniert ist und dies VBA verwirrt, wenn das Array explizit als Zeichenfolge definiert ist. Varianten scheinen jedoch in der Lage zu sein, die Größe nach Bedarf zu ändern (weil sie eine Menge Speicher beanspruchen und die Leute sie im Allgemeinen aus einer Reihe von Gründen meiden).

Der folgende Code funktioniert einwandfrei, ist jedoch im Vergleich zu einigen anderen Sprachen etwas manuell:

Dim SomeArray(3) As String

SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"
David Wilson
quelle
3
Dim myStringArray() As String
*code*
redim myStringArray(size_of_your_array)

Dann können Sie so etwas Statisches machen:

myStringArray = { item_1, item_2, ... }

Oder so etwas iteratives:

Dim x
For x = 0 To size_of_your_array
    myStringArray(x) = data_source(x).Name
Next x
Andrew Slentz
quelle
3
Public Function _
CreateTextArrayFromSourceTexts(ParamArray SourceTexts() As Variant) As String()

    ReDim TargetTextArray(0 To UBound(SourceTexts)) As String

    For SourceTextsCellNumber = 0 To UBound(SourceTexts)
        TargetTextArray(SourceTextsCellNumber) = SourceTexts(SourceTextsCellNumber)
    Next SourceTextsCellNumber

    CreateTextArrayFromSourceTexts = TargetTextArray
End Function

Beispiel:

Dim TT() As String
TT = CreateTextArrayFromSourceTexts("hi", "bye", "hi", "bcd", "bYe")

Ergebnis:

TT(0)="hi"
TT(1)="bye"
TT(2)="hi"
TT(3)="bcd"
TT(4)="bYe"

genießen

Bearbeiten: Ich habe die Funktion zum Löschen duplizierter Texte entfernt und den Code kleiner und benutzerfreundlicher gemacht.

matan justme
quelle
1
Dies sollte die Antwort sein - obwohl es keine eingebaute Möglichkeit zur Initialisierung gibt, hält eine globale Funktion als solche den Code sicher lesbar und bedeutet nicht, dass Ihre Definition a sein mussvariant
Andez
-7

Verwenden von

Dim myarray As Variant

funktioniert aber

Dim myarray As String

nicht so setze ich mich zu Variant

Keith Kenny
quelle
8
Das liegt daran, dass Sie am Ende von myarray Klammern hinzufügen sollten. Die Klammern geben VBA an, dass es sich um ein Array handelt. Das Dimmen als Zeichenfolge macht es zu einem Nur-Zeichenfolgen-Array.
PermaNoob
Sie müssen die Grenzen des Arrays deklarieren. Entweder ein dynamisches Array: Dim MyArray() as Stringoder ein Array mit fester Größe : Dim MyArray(1 to 10) as String.
Patrick Lepelletier