Declarar e inicializar matriz de seqüência de caracteres no VBA


126

Isso deve funcionar de acordo com outro post de estouro de pilha, mas não é:

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

Alguém pode me informar o que está errado?


33
Nota: A sintaxe entre chaves NÃO funciona no VBA, ela foi projetada para o VB.NET. Para sua própria sanidade, não confunda esses dois ambientes.
boomer57

2
Se você estiver usando o Excel (e estiver satisfeito com uma matriz Variant), poderá usarDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame

1
Para quem está olhando para esse comentário, quase dois anos depois (como eu). Parece que o VBA / Excel NÃO gosta da sintaxe Dim x() As Variant: x = [{"Value1", "Value2"}] SE você estiver usando variáveis ​​... ou seja v1 = "Value1"; v2 = "Value2", se , então x = [{v1, v2}], gerará um erro, enquanto x = [{"Value1", "Value2"}]que não.
Chip R.

Respostas:


169

Tente o seguinte:

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

20
tecnicamente cria uma matriz variante, não uma matriz de strings. É claro que a matriz variante pode ser uma matriz apenas de seqüências de caracteres, mas essa abordagem também permitiria tipos de dados que não sejam de sequência:myArray = Array("A", "B", 12345, "D"...)
David Zemens

10
Que tal Dim myStringArray () como String ... myStringArray = Array ("Cat", "Dog", "Rabbit"). Variantes - eca!
Andez 19/09/14

30
se você quiser tê-lo em uma linha, poderá usar os dois pontos após a declaração: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") A inicialização do comentário acima não funciona para mim, porque Array () cria uma matriz de variantes e não seqüências de caracteres
Andrej Sramko

6
não é uma boa resposta como 1) é uma variante contendo uma matriz e 2) variantes são o tipo de dados mais lenta em VBA
stifin

4
@ stifin e 3) O VBA não possui um inicializador de array de String. Mas você pode usar Split, por exemplo.
Eldar Agalarov

141

No caso específico de uma matriz String, você pode inicializar a matriz usando a Função Split , pois retorna uma matriz String em vez de uma matriz Variant:

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

Isso permite evitar o uso do tipo de dados Variant e preservar o tipo desejado para arrWsNames.


3
Definitivamente, isso facilita a transferência para outras funções; para não mencionar poupando-lhe a memória ...
Jason R. Mick

23

O problema aqui é que o comprimento da sua matriz é indefinido e isso confunde o VBA se a matriz for definida explicitamente como uma sequência. As variantes, no entanto, parecem capazes de redimensionar conforme necessário (porque elas consomem muita memória, e as pessoas geralmente as evitam por várias razões).

O código a seguir funciona muito bem, mas é um pouco manual comparado a alguns dos outros idiomas por aí:

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)

Então você pode fazer algo estático assim:

myStringArray = { item_1, item_2, ... }

Ou 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

exemplo:

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"

desfrutar

edit: removi o recurso de exclusão de duplicadostextos e tornei o código menor e mais fácil de usar.


1
Essa deve ser a resposta - embora não exista nenhuma maneira de inicializar, certamente uma função global como tal mantém o código legível e não inflige que sua definição variant
deva

-7

Usando

Dim myarray As Variant

funciona mas

Dim myarray As String

não, então eu sitck para Variant


8
Isso ocorre porque você deve adicionar parênteses no final de minha matriz. Os parênteses informam ao VBA que é uma matriz. Escurecer como uma string torna uma matriz apenas de String.
PermaNoob

você deve declarar os limites da matriz. Ou uma matriz dinâmica: Dim MyArray() as Stringou uma matriz de tamanho fixo: Dim MyArray(1 to 10) as String.
Patrick Lepelletier 31/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.