Zadeklaruj i zainicjuj tablicę ciągów w języku VBA

126

To powinno działać zgodnie z innym postem przepełnienia stosu, ale nie:

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

Czy ktoś może mi powiedzieć, co jest nie tak?

Kairan
źródło
33
Uwaga: składnia nawiasów klamrowych NIE działa w VBA, jest zaprojektowana dla VB.NET. Dla własnego rozsądku nie myl tych dwóch środowisk.
boomer57
2
Jeśli używasz programu Excel (i jesteś zadowolony z tablicy Variant), możesz użyćDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame
1
Dla każdego, kto patrzy na ten komentarz, prawie dwa lata później (jak ja). Wygląda na to, że VBA / Excel NIE lubi składni Dim x() As Variant: x = [{"Value1", "Value2"}] JEŻELI używasz zmiennych ... tj. Jeśli v1 = "Value1"; v2 = "Value2", to x = [{v1, v2}]wygeneruje błąd, podczas gdy x = [{"Value1", "Value2"}]nie.
Chip R.

Odpowiedzi:

169

Spróbuj tego:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")
Eldar Agalarov
źródło
20
technicznie tworzy tablicę wariantową, a nie tablicę ciągów. Oczywiście tablica wariantów może być tablicą tylko ciągów, ale takie podejście pozwoliłoby również na typy danych niebędące ciągami:myArray = Array("A", "B", 12345, "D"...)
David Zemens,
10
A co z Dim myStringArray () As String ... myStringArray = Array ("Kot", "Pies", "Królik"). Warianty - fuj!
Andez,
30
jeśli chcesz mieć to w jednej linii, możesz użyć dwukropka po deklaracji: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") Inicjalizacja z powyższego komentarza nie działa dla mnie, ponieważ Array () tworzy tablicę wariantów, a nie ciągi
znaków
6
niezbyt dobra odpowiedź, ponieważ 1) jest to wariant zawierający tablicę i 2) warianty są najwolniejszym typem danych w VBA
stifin
4
@stifin i 3) VBA nie ma inicjatora tablicy ciągów. Ale możesz na przykład użyć Split.
Eldar Agalarov
141

W konkretnym przypadku tablicy String można zainicjować tablicę za pomocą funkcji Split, ponieważ zwraca ona tablicę String zamiast tablicy Variant:

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

Pozwala to uniknąć używania typu danych Variant i zachować żądany typ dla arrWsNames.

Aiken
źródło
3
To zdecydowanie sprawia, że ​​przekazywanie go do innych funkcji jest czystsze; nie wspominając o zachowaniu pamięci ...
Jason R. Mick
23

Problem polega na tym, że długość twojej tablicy jest niezdefiniowana, a to wprowadza w błąd język VBA, jeśli tablica jest jawnie zdefiniowana jako ciąg. Wydaje się jednak, że warianty mogą zmieniać rozmiar w razie potrzeby (ponieważ pochłaniają dużo pamięci, a ludzie generalnie unikają ich z wielu powodów).

Poniższy kod działa dobrze, ale jest trochę ręczny w porównaniu do niektórych innych języków:

Dim SomeArray(3) As String

SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"
David Wilson
źródło
3
Dim myStringArray() As String
*code*
redim myStringArray(size_of_your_array)

Następnie możesz zrobić coś statycznego w ten sposób:

myStringArray = { item_1, item_2, ... }

Lub coś takiego iteracyjnego:

Dim x
For x = 0 To size_of_your_array
    myStringArray(x) = data_source(x).Name
Next x
Andrew Slentz
źródło
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

przykład:

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

wynik:

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

cieszyć się

edycja: usunąłem funkcję usuwania zduplikowanych tekstów i uczyniłem kod mniejszym i łatwiejszym w użyciu.

matan justme
źródło
1
To powinna być odpowiedź - chociaż nie ma żadnego wbudowanego sposobu inicjalizacji, z pewnością globalna funkcja jako taka zachowuje kod czytelny i nie powoduje, że twoja definicja musi byćvariant
Andez
-7

Za pomocą

Dim myarray As Variant

działa, ale

Dim myarray As String

nie, więc siadam do wariantu

Keith Kenny
źródło
8
To dlatego, że powinieneś dodać nawiasy na końcu myarray. Nawiasy informują VBA, że jest to tablica. Ściemnianie jako ciąg powoduje, że jest to tablica wyłącznie typu String.
PermaNoob
musisz zadeklarować granice tablicy. Albo dynamicznej tablicy: Dim MyArray() as Stringlub stałą wielkość tablicy: Dim MyArray(1 to 10) as String.
Patrick Lepelletier