【发布时间】:2022-04-27 13:16:08
【问题描述】:
真的不能在VBA中声明一个长度为0的数组吗?如果我试试这个:
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
破解
返回一个包含空字符串的单例数组。注意——这不是我们想要的。我们想要一个空数组——这样循环它就像什么都不做。但是包含空字符串的单例数组通常可以工作,例如如果我们稍后想将字符串数组中的所有字符串连接在一起。
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
自回答后更新
这是我用于将变量数组转换为字符串数组的函数。 Comintern 的解决方案似乎更先进、更通用,如果我仍然在 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
注意事项
- 我使用选项显式。这无法更改,因为它保护了模块中的其余代码。
【问题讨论】:
-
以下作品
Dim a(-1 To 0) As Variant -
IIRC 仅声明没有指定大小的数组将使其保持“空”,尽管尝试访问该数组而不对其应用 redim 会导致错误(即声明为
Dim test() As String)跨度> -
我想
Dim results As Variant是不可能的?传递类型数组总是让人头疼,我早就决定选择我的战斗并将Variant用于任何类型的数组。变体子类型String在变体数组中吗?如果是这样,您正在执行不需要发生的处理。 -
@Nathan_Sav 我不确定您的建议。看起来它不会实现问题的要求。如果您找到了解决方案,请在答案中详细说明。
-
arrOutput = Split(vbNullString)给出一个 LBound 为 0 且 UBound 为 -1 的数组。这与没有内存黑客的情况一样接近。