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?


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

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.


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"

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

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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.