5

次のような関数Split()は、配列に項目がない場合、上限に -1、下限に 0 の配列を返します。

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

この場合、UBound(s) は -1 に等しく、LBound(s) は 0 に等しくなります。配列に値があるかどうかを確認するために、上限の -1 をチェックするかなりの量のコードがあります。これはうまくいきます。

問題は、配列のデータ型を string から long に変更したいということです。上限が -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

もう 1 つの方法は、強く型付けされた「ファクトリー」関数です。

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 に答える
0

VB6 の 1 つの問題は、空の (または初期化されていない) 配列を確実に作成または検出する方法がないことです。場合によっては、上限が下限より大きいかどうかを確認することで、初期化されていない配列を検出できることがあります。ただし、これは洗練されておらず、文書化されていません。このようなことを適切に行う最善の方法は、配列を Variant で囲み、Variant を Empty に設定して配列を初期化解除することです。次に、If VarType(v) = vbEmpty ... などのチェックを使用できます。

于 2011-08-17T21:02:18.330 に答える