Déclarer et initialiser le tableau de chaînes dans VBA


126

Cela devrait fonctionner selon un autre post de débordement de pile, mais ce n'est pas le cas:

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

Quelqu'un peut-il me dire ce qui ne va pas?


33
Remarque: la syntaxe des accolades ne fonctionne PAS dans VBA, elle est conçue pour VB.NET. Pour votre propre santé mentale, ne confondez pas ces deux environnements.
boomer57

2
Si vous utilisez Excel (et que vous vous contentez d'un tableau Variant), vous pouvez utiliserDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame

1
Pour tous ceux qui regardent ce commentaire, presque deux ans plus tard (comme moi). Il semble que VBA / Excel n'aime PAS la syntaxe Dim x() As Variant: x = [{"Value1", "Value2"}] SI vous utilisez des variables ... c'est-à-dire si v1 = "Value1"; v2 = "Value2", alors x = [{v1, v2}]générera une erreur, alors que x = [{"Value1", "Value2"}]ce ne sera pas le cas.
Chip R.

Réponses:


169

Essaye ça:

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

20
crée techniquement un tableau de variantes, pas un tableau de chaînes. Bien sûr, le tableau de variantes pourrait être un tableau de chaînes uniquement, mais cette approche autoriserait également les types de données sans chaîne:myArray = Array("A", "B", 12345, "D"...)
David Zemens

10
Qu'en est-il de Dim myStringArray () As String ... myStringArray = Array ("Cat", "Dog", "Rabbit"). Variantes - beurk!
Andez

30
si vous voulez l'avoir sur une ligne, vous pouvez utiliser les deux points après la déclaration: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") L'initialisation du commentaire ci-dessus ne fonctionne pas pour moi, car Array () crée un tableau de variantes et non de chaînes
Andrej Sramko

6
pas une bonne réponse car 1) c'est une variante contenant un tableau et 2) les variantes sont le type de données le plus lent dans VBA
stifin

4
@stifin et 3) VBA n'a pas d'initialiseur de tableau de chaînes. Mais vous pouvez utiliser Split par exemple.
Eldar Agalarov

142

Dans le cas spécifique d'un tableau String, vous pouvez initialiser le tableau à l'aide de la fonction Split car il renvoie un tableau String plutôt qu'un tableau Variant:

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

Cela vous permet d'éviter d'utiliser le type de données Variant et de conserver le type souhaité pour arrWsNames.


3
Cela rend définitivement le passage à d'autres fonctions plus propre; sans parler de vous sauver la mémoire ...
Jason R. Mick

23

Le problème ici est que la longueur de votre tableau n'est pas définie, et cela confond VBA si le tableau est explicitement défini comme une chaîne. Les variantes, cependant, semblent pouvoir être redimensionnées au besoin (car elles monopolisent beaucoup de mémoire et les gens les évitent généralement pour un tas de raisons).

Le code suivant fonctionne très bien, mais c'est un peu manuel par rapport à certains des autres langages disponibles:

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)

Ensuite, vous pouvez faire quelque chose de statique comme ceci:

myStringArray = { item_1, item_2, ... }

Ou quelque chose d'itératif comme celui-ci:

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

exemple:

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

résultat:

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

prendre plaisir

edit: j'ai supprimé la fonction de suppression de duplicatedtexts et j'ai rendu le code plus petit et plus facile à utiliser.


1
Cela devrait être la réponse - bien qu'il n'y ait pas de méthode intégrée pour initialiser, une fonction globale en tant que telle pour faire cela garde le code lisible et n'inflige pas que votre définition variant
doive

-7

En utilisant

Dim myarray As Variant

fonctionne mais

Dim myarray As String

pas donc je m'assois à la variante


8
C'est parce que vous devriez ajouter des parenthèses à la fin de mon tableau. Les parenthèses indiquent à VBA qu'il s'agit d'un tableau. La gradation en tant que chaîne en fait un tableau de chaînes uniquement.
PermaNoob

vous devez déclarer les limites du tableau. Soit un tableau dynamique: Dim MyArray() as Stringou une matrice de taille fixe: Dim MyArray(1 to 10) as String.
Patrick Lepelletier
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.