如果数组没有项目,某些函数(如Split()
将返回一个数组,其中上限为-1,下限为零,例如:
Dim s() As String
s = Split("", ",")
Debug.Print UBound(s)
Debug.Pring LBound(s)
在这种情况下,UBound将等于-1,LBound(s)将等于0.我有相当数量的代码检查上限为-1,以查看数组是否有值。这非常有效。
问题是我现在想要将数组数据类型从字符串更改为long。我似乎无法创建一个上限为-1且下限为0的long数组,而Split()
和Join()
函数仅对字符串数组有效。
我希望能够返回一个上限为-1的长数组。这可能吗?
答案 0 :(得分:4)
我认为你不能在自己的VB6中做到这一点。但是,如果您愿意使用Windows API函数SafeArrayCreateVector,则可以执行此操作:
Private Declare Function LongSplitEmulator Lib "OLEAUT32.DLL" Alias "SafeArrayCreateVector" _
(Optional ByVal vt As VbVarType = vbLong, _
Optional ByVal low As Long = 0, _
Optional ByVal count As Long = 0) As Long()
Dim a() As Long
a = LongSplitEmulator()
MsgBox UBound(a)
如果您需要为其他数据类型执行此操作,则可以更改vt参数。
请注意,我想我最初从Vi2对此discussion的回答中发现了这一点。
答案 1 :(得分:1)
您可以编写自己的拆分功能来执行此操作:
Private Sub SplitLongs(ByVal strData As String, ByRef lng() As Long)
Dim i As Integer
Dim s() As String
s = Split(strData, ",")
If UBound(s) = -1 Then
ReDim lng(-1 To -1)
Else
ReDim lng(LBound(s) To UBound(s))
For i = LBound(s) To UBound(s)
If IsNumeric(s(i)) Then lng(i) = s(i)
Next
End If
End Sub
答案 2 :(得分:0)
VB6的一个问题是无法可靠地创建或检测空(或未初始化)数组。有时,可以通过检查上限是否大于下限来检测未初始化的数组;然而,这既不优雅也不记录。正确完成此类操作的最佳方法是将数组包含在Variant中,并将Variant设置为Empty以取消初始化数组。然后,您可以使用检查,例如If VarType(v)= vbEmpty ...
答案 3 :(得分:0)
另一种方式是强类型的“工厂”功能:
Private Declare Function SafeArrayRedim Lib "oleaut32.dll" (ByVal ArrayPtr As Long, ByRef DataPtr As tagSAFEARRAYBOUND) As Long
Private Type tagSAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type
Public Type Feed
ID As String
Name As String
Active As Boolean
BasePath As String
End Type
Public Sub EmptyFeedArray(ByRef Arr() As Feed)
Dim Data As tagSAFEARRAYBOUND
Dim lngErr As Long
'Redim to one item
ReDim Arr(0 To 0)
'Reset the safe array to empty
lngErr = SafeArrayRedim(Not Not Arr, Data)
'Raise any errors
If lngErr <> 0 Then Err.Raise lngErr
End Sub
我认为这也适用于整数类型。