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?


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

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.


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"

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

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.