Объявление и инициализация массива строк в 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.


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.
Патрик Лепеллетье,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.