Dichiarare e inizializzare array di stringhe in VBA


126

Questo dovrebbe funzionare secondo un altro post di overflow dello stack ma non è:

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

Qualcuno può farmi sapere cosa c'è che non va?


33
Nota: la sintassi delle parentesi graffe NON funziona all'interno di VBA, è progettata per VB.NET. Per la tua sanità mentale, non confondere questi due ambienti.
boomer57

2
Se stai usando Excel (e sei soddisfatto di un array Variant), puoi usareDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame il

1
Per chiunque stia guardando questo commento, quasi due anni dopo (come me). Sembra che a VBA / Excel NON piaccia la sintassi Dim x() As Variant: x = [{"Value1", "Value2"}] SE stai usando le variabili ... cioè se v1 = "Value1"; v2 = "Value2", allora x = [{v1, v2}]genererà un errore, mentre x = [{"Value1", "Value2"}]non lo farà.
Chip R.

Risposte:


169

Prova questo:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")

20
crea tecnicamente un array di varianti, non un array di stringhe. Naturalmente l'array variante potrebbe essere un array di sole stringhe, ma questo approccio consentirebbe anche tipi di dati non stringa:myArray = Array("A", "B", 12345, "D"...)
David Zemens,

10
Che dire di Dim myStringArray () Come String ... myStringArray = Array ("Cat", "Dog", "Rabbit"). Varianti - schifo!
Andez,

30
se vuoi averlo in una riga, puoi usare i due punti dopo la dichiarazione: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") L'inizializzazione dal commento sopra non funziona per me, perché Array () crea una matrice di varianti e non stringhe
Andrej Sramko,

6
non è una buona risposta come 1) è una variante contenente un array e 2) le varianti sono il tipo di dati più lento in VBA
stifin

4
@stifin e 3) VBA non ha inizializzatore di array di stringhe. Ma puoi usare Split per esempio.
Eldar Agalarov,

141

Nel caso specifico di un array String, è possibile inizializzare l'array utilizzando la funzione Split in quanto restituisce un array String anziché un array Variant:

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

Ciò consente di evitare l'uso del tipo di dati Variant e di preservare il tipo desiderato per arrWsNames.


3
Questo sicuramente rende più pulito il passaggio ad altre funzioni; per non parlare del salvataggio della memoria ...
Jason R. Mick,

23

Il problema qui è che la lunghezza dell'array non è definita e questo confonde VBA se l'array viene definito esplicitamente come una stringa. Le varianti, tuttavia, sembrano essere in grado di ridimensionare secondo necessità (perché accumulano un mucchio di memoria e le persone generalmente le evitano per una serie di motivi).

Il seguente codice funziona bene, ma è un po 'manuale rispetto ad alcune delle altre lingue là fuori:

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)

Quindi puoi fare qualcosa di statico come questo:

myStringArray = { item_1, item_2, ... }

O qualcosa di iterativo come questo:

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

esempio:

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

risultato:

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

godere

modifica: ho rimosso la funzione di eliminazione dei duplicati e reso il codice più piccolo e più facile da usare.


1
Questa dovrebbe essere la risposta - sebbene non ci sia alcun modo integrato per inizializzare, sicuramente una funzione globale in quanto tale mantiene il codice leggibile e non infligge che la tua definizione debba essere unvariant
Andez

-7

utilizzando

Dim myarray As Variant

funziona ma

Dim myarray As String

non così mi siedo a Variant


8
Questo perché dovresti aggiungere parentesi alla fine di myarray. Le parentesi indicano a VBA che si tratta di un array. L'oscuramento come stringa lo rende un array solo stringa.
PermaNoob,

devi dichiarare i limiti dell'array. Sia un array dinamico: Dim MyArray() as Stringo un array dimensione fissa: Dim MyArray(1 to 10) as String.
Patrick Lepelletier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.