Действительно ли невозможно объявить массив 0 длины в VBA?Если я попробую это:
Dim lStringArr(-1) As String
, я получаю ошибку компиляции, говоря, что диапазон не имеет значений.Если я попытаюсь обмануть компилятор и выполнить redim во время выполнения, например, так:
ReDim lStringArr(-1)
Я получаю индекс из-за ошибки диапазона.
Я немного изменил выше, но безнапример,
Dim lStringArr(0 To -1) As String
Вариант использования
Я хочу преобразовать вариантный массив в массив строк.Вариантный массив может быть пустым, поскольку он получен из свойства Keys словаря.Свойство keys возвращает массив вариантов.Я хочу использовать массив строк в своем коде, так как у меня есть некоторые функции для обработки строковых массивов, которые я хотел бы использовать.Вот функция преобразования, которую я использую.Это выдает индекс из-за ошибки диапазона из-за того, что lMaxIndex = -1:
Public Function mVariantArrayToStringArray(pVariants() As Variant) As String()
Dim lStringArr() As String
Dim lMaxIndex As Long, lMinIndex As Long
lMaxIndex = UBound(pVariants)
lMinIndex = LBound(pVariants)
ReDim lStringArr(lMaxIndex)
Dim lVal As Variant
Dim lIndex As Long
For lIndex = lMinIndex To lMaxIndex
lStringArr(lIndex) = pVariants(lIndex)
Next
mVariantArrayToStringArray = lStringArr
End Function
Hack
Возвращает одноэлементный массив, содержащий пустую строку.Обратите внимание, это не то, что мы хотим.Нам нужен пустой массив - такой, что зацикливание на нем похоже на бездействие.Но одноэлементный массив, содержащий пустую строку, часто будет работать, например, если позже мы захотим объединить все строки в массив строк.
Public Function mVariantArrayToStringArray(pVariants() As Variant) As String()
Dim lStringArr() As String
Dim lMaxIndex As Long, lMinIndex As Long
lMaxIndex = UBound(pVariants)
lMinIndex = LBound(pVariants)
If lMaxIndex < 0 Then
ReDim lStringArr(1)
lStringArr(1) = ""
Else
ReDim lStringArr(lMaxIndex)
End If
Dim lVal As Variant
Dim lIndex As Long
For lIndex = lMinIndex To lMaxIndex
lStringArr(lIndex) = pVariants(lIndex)
Next
mVariantArrayToStringArray = lStringArr
End Function
Обновление с ответа
Вот функция Iиспользую для преобразования варианта массива в массив строк.Решение Коминтерна кажется более продвинутым и общим, и я могу перейти к этому однажды, если я все еще застрял в VBA:
Public Function mVariantArrayToStringArray(pVariants() As Variant) As String()
Dim lStringArr() As String
Dim lMaxIndex As Long, lMinIndex As Long
lMaxIndex = UBound(pVariants)
lMinIndex = LBound(pVariants)
If lMaxIndex < 0 Then
mVariantArrayToStringArray = Split(vbNullString)
Else
ReDim lStringArr(lMaxIndex)
End If
Dim lVal As Variant
Dim lIndex As Long
For lIndex = lMinIndex To lMaxIndex
lStringArr(lIndex) = pVariants(lIndex)
Next
mVariantArrayToStringArray = lStringArr
End Function
Примечания
- Я использую Option Explicit.Это не может измениться, поскольку защищает остальную часть кода в модуле.