Объявление и инициализация массива строк в VBA

126

Это должно работать в соответствии с другим сообщением о переполнении стека, но это не так:

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

Может ли кто-нибудь сообщить мне, что не так?

Кайран
источник
33
Примечание. Синтаксис фигурных скобок НЕ работает внутри VBA, он разработан для VB.NET. Для вашего собственного здравомыслия не путайте эти две среды.
boomer57 08
2
Если вы используете Excel (и вас устраивает массив Variant), вы можете использоватьDim x() As Variant: x = [{"Value1", "Value2"}]
ThunderFrame
1
Для всех, кто просматривает этот комментарий почти два года спустя (например, я). Кажется, что VBA / Excel НЕ нравится синтаксис, Dim x() As Variant: x = [{"Value1", "Value2"}] ЕСЛИ вы используете переменные ... то есть, если v1 = "Value1"; v2 = "Value2", то x = [{v1, v2}]выдаст ошибку, а x = [{"Value1", "Value2"}]не будет.
Чип Р.

Ответы:

170

Попробуй это:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")
Эльдар Агаларов
источник
20
технически создает вариантный массив, а не строковый массив. Конечно, вариантный массив может быть массивом только строк, но этот подход также допускает myArray = Array("A", "B", 12345, "D"...)
нестроковые
10
А как насчет Dim myStringArray () As String ... myStringArray = Array («Кот», «Собака», «Кролик»). Варианты - фу!
Andez
30
если вы хотите разместить его в одной строке, вы можете использовать двоеточие после объявления: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") инициализация из приведенного выше комментария не работает для меня, потому что Array () создает массив вариантов, а не строки
Андрей Срамко,
6
не лучший ответ, так как 1) это вариант, содержащий массив, и 2) варианты - самый медленный тип данных в VBA
stifin
4
@stifin и 3) VBA не имеет инициализатора массива String. Но вы можете использовать, например, Split.
Эльдар Агаларов
142

В конкретном случае массива String вы можете инициализировать массив с помощью функции Split, поскольку она возвращает массив String, а не массив Variant:

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

Это позволяет избежать использования типа данных Variant и сохранить желаемый тип для arrWsNames.

Aiken
источник
3
Это определенно делает передачу его другим чистящим функциям; не говоря уже о сохранении памяти ...
Джейсон Р. Мик
23

Проблема здесь в том, что длина вашего массива не определена, и это сбивает VBA с толку, если массив явно определяется как строка. Однако варианты, кажется, могут изменять размер по мере необходимости (потому что они занимают много памяти, и люди обычно избегают их по ряду причин).

Следующий код работает отлично, но он немного ручной по сравнению с некоторыми другими языками:

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)

Затем вы можете сделать что-то статичное, например:

myStringArray = { item_1, item_2, ... }

Или что-то итеративное вроде этого:

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

пример:

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

результат:

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

наслаждаться

edit: я удалил функцию удаления дублированных текстов и сделал код меньше и проще в использовании.

Матан Джастме
источник
1
Это должно быть ответом - хотя нет никакого встроенного способа инициализации, конечно, глобальная функция как таковая для этого сохраняет код читабельным и не означает, что ваше определение должно бытьvariant
Andez
-7

С помощью

Dim myarray As Variant

работает, но

Dim myarray As String

не так я сижу в варианте

Кейт Кенни
источник
8
Это потому, что вы должны добавлять круглые скобки в конце myarray. Скобки позволяют VBA узнать, что это массив. Затемнение в виде строки делает его массивом только для строк.
PermaNoob
вы должны объявить границы массива. Либо динамический массив: Dim MyArray() as Stringили массив фиксированного размера: Dim MyArray(1 to 10) as String.
Патрик Лепеллетье,