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

81

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

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

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

  • 29
    Примечание. Синтаксис фигурных скобок НЕ работает внутри VBA, он разработан для VB.NET. Для вашего же здравого смысла, не путайте эти две среды.
  • 2
    Если вы используете Excel (и используете контент с массивом Variant), вы можете использовать Dim x() As Variant: x = [{"Value1", "Value2"}]
Показать ещё 1 комментарий
Теги:
arrays
initialization

7 ответов

108
Лучший ответ

Попробуйте следующее:

Dim myarray As Variant
myarray = Array("Cat", "Dog", "Rabbit")
  • 17
    технически создает вариантный массив, а не строковый массив. Конечно, вариантный массив может быть массивом только строк, но этот подход также допускает не строковые типы данных: myArray = Array("A", "B", 12345, "D"...)
  • 9
    Как насчет Dim myStringArray () As String ... myStringArray = Array ("Cat", "Dog", "Rabbit"). Варианты - гадость!
Показать ещё 8 комментариев
76

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

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

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

  • 2
    Это определенно делает передачу его другим функциям чище; не говоря уже о сохранении вашей памяти ...
12

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

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

Dim SomeArray(3) As String

SomeArray(0) = "Zero"
SomeArray(1) = "One"
SomeArray(2) = "Two"
SomeArray(3) = "Three"
2
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
0
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"

пользоваться

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

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

Использование

Dim myarray As Variant

работает, но

Dim myarray As String

не так, я привязываюсь к варианту

  • 1
    это странно...
  • 5
    Это потому, что вы должны добавить скобки в конце myarray. Скобки позволяют VBA знать, что это массив. Затемнение в виде строки делает его массивом только для строк.
Показать ещё 1 комментарий
-7
Dim arrWsNames As String() = {"Value1", "Value2"}

Неверно, потому что имя массива arrWsNames требует скобки, а не тип String.

Он будет работать следующим образом:

Dim arrWsNames() As String = {"value1", "value2"}

Предполагая, что в массиве есть два элемента, value1 и value2 этот массив состоит из двух элементов: I.E. elementO = "value1" element1 = "value2"

или

Dim arrWsNames() As String

отлично работает без подразумеваемого размера, вы можете заполнить его как можно большим количеством элементов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню