VBA - Правильный метод инициализации массива со строкой?

Я рассмотрел этот вопрос/ответ здесь, прежде чем писать это: Объявить и инициализировать String Array в VBA

Я пытаюсь понять, как правильно объявить и инициализировать массив БЕЗ использования типа данных VARIANT.

Это мой код, и он работает так, как есть:

Function MakeLegalFilename(legalname As String) As String

Dim MyArray() As Variant
Dim x As Integer

MyArray = Array("<",">","?","@","%")

For x = LBound(MyArray) To UBound(MyArray)
 legalname = Replace(legalname, MyArray(x), "", 1)
Next x

MakeLegalFilename = legalname

End Function

Если я изменю "Вариант" на "Строка", код завершится с ошибкой в MyArray = Array(... с несоответствием типа ошибки 13).

Если я определяю размер массива в соответствии с количеством символов в строке (всего 5, но массив начинается с 0):

Dim MyArray(4) As String
MyArray = Array("<",">","?","@","%")

Теперь я получаю ошибку компиляции в MyArray = Array(... которая говорит: "Невозможно назначить массив".

Я знаю, что могу объявить массив таким образом и заставить его работать (я протестировал его таким образом):

MyArray(0) = "<"
 MyArray(1) = ">"
 MyArray(2) = "?"
 ...
 MyArray(4) = "%"

Но если я кодирую весь список символов (скажем, 20), то делать это громоздко, и, кроме того, я хотел бы знать, почему другой способ не работает, поскольку он предполагает, что у меня есть фундаментальное недоразумение. В ней самая основная форма, мой вопрос на самом деле, почему это не так:

Dim MyArray(4) As String
MyArray = Array("<",">","?","@","%")

Работа?

Спасибо.

3 ответа

Массив возвращает вариант.

Поэтому вы не можете использовать его, если не знаете, какой вариант.

Split может разделить строку.

Функция разделения

Описание

Возвращает одномерный массив на основе нуля, содержащий указанное количество подстрок.

Синтаксис

Split(expression[, delimiter[, limit[, compare]]])

Поместите запятую в разделительную строку, содержащую ваши символы.


Используйте вспомогательную функцию:

Dim MyArray() As String
MyArray = StrArray("<", ">", "?", "@", "%")

... 
Public Function StrArray(ParamArray args() As Variant) As String()
 Dim i As Long
 ReDim temp(UBound(args)) As String
 For i = 0 To UBound(args)
 temp(i) = args(i)
 Next
 StrArray = temp
End Function


Для инициализации массива строк статического размера используйте:

Dim MyArray(4) As String
MyArray(0) = "<"
MyArray(1) = ">"
MyArray(2) = "?"
MyArray(3) = "@"
MyArray(4) = "%"

Чтобы инициализировать массив строк динамического размера, используйте:

Dim MyArray() As String
For i = 0 to 10
 Redim Preserve MyArray(i) 'increase the size 
 MyArray(i) = Char(64 + i)
Next

Для получения дополнительной информации см. Http://msdn.microsoft.com/en-us/library/wak0wfyt.aspx

licensed under cc by-sa 3.0 with attribution.