在VBA中,是否真的无法声明长度为0的数组? 如果我尝试这样做:
Dim lStringArr(-1) As String
我收到一个编译错误,提示range没有值。如果我尝试欺骗编译器并像这样在运行时重新定义大小: ```vb Redim Preserve range(1 to 0) ```
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
备注
- 我使用Option Explicit。这不能更改,因为它可以保护模块中其余的代码。
Dim a(-1 To 0) As Variant
。 - Nathan_SavDim results As Variant
不太可行?传递类型化数组总是很麻烦的,我早就决定要选择自己的战斗,并对任何类型的数组使用Variant
。在变量数组中,变量子类型String
是否存在?如果是这样,那么你正在进行不必要的处理。 - Mathieu GuindonarrOutput = Split(vbNullString)
会生成一个下边界为0,上边界为-1的数组。这已经是最接近操作内存的方式了。 - CominternSplit(vbNullString)
,否则继续redim并转换每个元素。实际上,我会创建一个名为EmptyStringArray
的函数并调用它,只返回这个。 - Mathieu Guindon