Декларуйте та ініціалізуйте рядковий масив у VBA


126

Це має працювати відповідно до іншого запису переповнення стека, але його немає:

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

Чи може хто-небудь повідомити мені, що не так?


33
Примітка: Синтаксис фігурних дужок НЕ працює всередині VBA, він призначений для VB.NET. В цілях власного розуму не слід плутати ці два середовища.
бумер57

2
Якщо ви користуєтеся Dim x() As Variant: x = [{"Value1", "Value2"}]
програмою

1
Для всіх, хто дивиться цей коментар, майже через два роки (як я). Здається, що VBA / Excel НЕ любить синтаксис Dim x() As Variant: x = [{"Value1", "Value2"}] ЯКЩО ви використовуєте змінні ... тобто, якщо v1 = "Value1"; v2 = "Value2", тоді x = [{v1, v2}]генеруватиме помилку, тоді як x = [{"Value1", "Value2"}]не буде.
Чіп Р.

Відповіді:


169

Спробуйте це:

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

20
технічно створює варіант масиву, а не рядковий масив. Звичайно, варіантний масив може бути масивом лише рядків, але такий підхід також дозволить мати не рядкові типи даних:myArray = Array("A", "B", 12345, "D"...)
David Zemens

10
Як щодо Dim myStringArray () As String ... myStringArray = Array ("Кіт", "Собака", "Кролик"). Варіанти - юк!
Andez

30
якщо ви хочете мати його в одному рядку, ви можете використовувати двокрапку після декларації: Dim arrWsNames() As String: arrWsNames = Split("Value1,Value2", ",") Ініціалізація з коментаря вище не працює для мене, тому що Array () створює масив варіантів, а не рядки
Andrej Sramko


4
@stifin та 3) VBA не має ініціалізатора String array. Але ви можете використовувати спліт, наприклад.
Ельдар Агаларов

141

У конкретному випадку масиву 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"

насолоджуватися

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


1
Це має бути відповіддю - хоча не існує побудованого способу ініціалізації, але, безумовно, глобальна функція як така для цього зберігає код читабельним, і це не призводить до того, що ваше визначення повинно бутиvariant
Andez

-7

Використання

Dim myarray As Variant

працює, але

Dim myarray As String

не так я сідаю на Варіант


8
Це тому, що вам слід додати дужки в кінці мірного масиву. Дужки дають можливість VBA знати, що це масив. Затемнення як рядок робить його масивом лише для рядків.
PermaNoob

ви повинні оголосити межі масиву. Або динамічний масив: Dim MyArray() as Stringабо масив фіксованого розміру: Dim MyArray(1 to 10) as String.
Патрік Лепелтьє,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.