5

如果数组没有项目,则某些函数Split()将返回一个数组,其上限为 -1,下限为零,例如:

Dim s() As String
s = Split("", ",")
Debug.Print UBound(s)
Debug.Pring LBound(s)

在这种情况下,UBound(s) 将等于 -1,LBound(s) 将等于 0。我有大量代码检查上限上的 -1 以查看数组是否具有值。这很好用。

问题是我现在想将数组数据类型从字符串更改为长。我似乎无法创建一个上限为 -1 且下限为 0 的 long 数组,并且Split()andJoin()函数仅在字符串数组上运行。

我希望能够返回一个上限为 -1 的长数组。这可能吗?

4

4 回答 4

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 对此讨论的回答中发现的。

于 2011-08-17T21:43:25.723 回答
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
于 2011-08-18T10:44:50.380 回答
0

VB6 的一个问题是无法可靠地创建或检测空(或未初始化)数组。有时,可以通过检查上限是否大于下限来检测未初始化的数组;然而,这既不优雅也没有记录。正确完成此类事情的最佳方法是将数组包含在 Variant 中,并将 Variant 设置为 Empty 以取消初始化数组。然后,您可以使用检查,例如 If VarType(v) = vbEmpty ...

于 2011-08-17T21:02:18.330 回答
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

我认为这也适用于整数类型。

于 2011-08-24T11:07:47.997 回答