Declarar e inicializar matriz de cadenas en VBA

126

Esto debería funcionar de acuerdo con otra publicación de desbordamiento de pila, pero no:

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

¿Alguien puede decirme qué está mal?

Kairan
fuente
33
Nota: La sintaxis de llaves no funciona dentro de VBA, está diseñada para VB.NET. Por su propia cordura, no confunda estos dos entornos.
boomer57
2
Si está utilizando Excel (y ya está contenido con una matriz Variant), puede utilizarDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame
1
Para cualquiera que esté mirando este comentario, casi dos años después (como yo). Parece que a VBA / Excel NO le gusta la sintaxis Dim x() As Variant: x = [{"Value1", "Value2"}] SI está utilizando variables ... es decir v1 = "Value1"; v2 = "Value2", si , x = [{v1, v2}]generará un error, mientras x = [{"Value1", "Value2"}]que no.
Chip R.

Respuestas:

169

Prueba esto:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")
Eldar Agalarov
fuente
20
técnicamente crea una matriz variante, no una matriz de cadenas. Por supuesto, la matriz variante podría ser una matriz de solo cadenas, pero este enfoque también permitiría tipos de datos sin cadenas:myArray = Array("A", "B", 12345, "D"...)
David Zemens
10
¿Qué pasa con Dim myStringArray () As String ... myStringArray = Array ("Cat", "Dog", "Rabbit")? Variantes - ¡qué asco!
Andez
30
si desea tenerlo en una línea, puede usar los dos puntos después de la declaración: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") la inicialización del comentario anterior no funciona para mí, porque Array () crea una matriz de variantes y no cadenas
Andrej Sramko
66
no es una buena respuesta ya que 1) es una variante que contiene una matriz y 2) las variantes son el tipo de datos más lento en VBA
stifin
44
@stifin y 3) VBA no tiene inicializador de matriz de cadenas. Pero puedes usar Split por ejemplo.
Eldar Agalarov
141

En el caso específico de una matriz de cadenas, puede inicializar la matriz utilizando la función dividida, ya que devuelve una matriz de cadenas en lugar de una matriz de variantes:

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

Esto le permite evitar el uso del tipo de datos Variant y preservar el tipo deseado para arrWsNames.

Aiken
fuente
3
Esto definitivamente hace que pasarlo a otras funciones sea más limpio; por no hablar de ahorrarle memoria ...
Jason R. Mick
23

El problema aquí es que la longitud de su matriz no está definida, y esto confunde a VBA si la matriz se define explícitamente como una cadena. Sin embargo, las variantes parecen poder cambiar de tamaño según sea necesario (porque acaparan una gran cantidad de memoria y la gente generalmente las evita por muchas razones).

El siguiente código funciona bien, pero es un poco manual en comparación con algunos de los otros idiomas:

Dim SomeArray(3) As String

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

Entonces puedes hacer algo estático como este:

myStringArray = { item_1, item_2, ... }

O algo iterativo como este:

Dim x
For x = 0 To size_of_your_array
    myStringArray(x) = data_source(x).Name
Next x
Andrew Slentz
fuente
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

ejemplo:

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

resultado:

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

disfrutar

editar: eliminé la función de eliminación de textos duplicados e hice el código más pequeño y fácil de usar.

matan justme
fuente
1
Esta debería ser la respuesta: aunque no hay ninguna forma integrada de inicializar, seguramente una función global como tal mantiene el código legible y no inflige que su definición tenga que ser unvariant
Andez
-7

Utilizando

Dim myarray As Variant

funciona pero

Dim myarray As String

no, así que me siento a la variante

Keith Kenny
fuente
8
Eso es porque deberías agregar paréntesis al final de myarray. Los paréntesis le permiten a VBA saber que es una matriz. La atenuación como una cadena la convierte en una matriz de solo cadenas.
PermaNoob
tienes que declarar los límites de la matriz. Cualquiera de una matriz dinámica: Dim MyArray() as String, o una matriz de tamaño fijo: Dim MyArray(1 to 10) as String.
Patrick Lepelletier