从逗号分隔的字符串填充变体数组
Populate a variant array from a comma-delimited string
通常,如果我想从逗号分隔的字符串创建一个数组,那么它就是我想要的字符串数组,我将使用 Split()
函数。但是现在我需要将逗号分隔的字符串转换为 Variant 数组,以便它可以用作函数参数。
不幸的是,尝试使用 Split()
填充变体数组会引发类型不匹配错误,下面是测试示例。
Public Sub GetTheStuff()
Dim varArray() As Variant
varArray = Split("Bob,Alice,Joe,Jane", ",") '<~~ Error 13, Type Mismatch
DoTheThing varArray
End Sub
Private Sub DoTheThing(Args() As Variant)
Dim i As Long
For i = LBound(Args) To UBound(Args)
Debug.Print Args(i)
Next i
End Sub
是否有一种简单的方法可以从定界字符串填充 Variant 数组,或者我是否必须编写自己的函数才能这样做?
注意:我无法改变我正在调用的函数需要一个 Variant 数组作为参数的事实,我也无法将我的输入作为定界字符串以外的任何内容。
一句话,不 - 没有一个 Split 函数可以 return 一个 Variant 数组。您基本上有 2 个选项 - 如果数组很小(大概),您可以转换它:
Dim rawArray() As String
Dim varArray() As Variant
rawArray = Split("Bob,Alice,Joe,Jane", ",")
ReDim varArray(LBound(rawArray) To UBound(rawArray))
Dim index As Long
For index = LBound(rawArray) To UBound(rawArray)
varArray(index) = rawArray(index)
Next index
您在问题中已经提到的第二个选项 - 编写您自己的 CSV 解析器(烦人但也不难)。
将 CSV 数据导入二维变体数组
数值作为值,
日期作为日期,
字符串作为字符串。
' Import CSV data into two dimensional variant array with numeric as value, date as date, string as string.
Private Function CSV_to_Array(CSV As String)
Dim CSV_Rows() As String
CSV_Rows() = Split(CSV, Chr(10)) ' split the CSV into rows
' Import CSV data into two dimensional variant array with numeric as value, date as date, string as string.
aryWidth = 0
ReDim Ary(0 To UBound(CSV_Rows), 0 To aryWidth) As Variant
For Y = LBound(CSV_Rows) To UBound(CSV_Rows)
CSV_Fields = Split(CSV_Rows(Y), ",")
If UBound(CSV_Fields) > aryWidth Then
aryWidth = UBound(CSV_Fields)
ReDim Preserve Ary(0 To UBound(CSV_Rows), 0 To aryWidth) As Variant
End If
For X = LBound(CSV_Fields) To UBound(CSV_Fields)
If IsNumeric(CSV_Fields(X)) Then
Ary(Y, X) = Val(CSV_Fields(X))
ElseIf IsDate(CSV_Fields(X)) Then
Ary(Y, X) = CDate(CSV_Fields(X))
Else
Ary(Y, X) = CStr(CSV_Fields(X))
End If
Next
Next
CSV_to_Array = Ary()
End Function
Dim Ary() As Variant
Ary() = CSV_to_Array(strCSV)
通常,如果我想从逗号分隔的字符串创建一个数组,那么它就是我想要的字符串数组,我将使用 Split()
函数。但是现在我需要将逗号分隔的字符串转换为 Variant 数组,以便它可以用作函数参数。
不幸的是,尝试使用 Split()
填充变体数组会引发类型不匹配错误,下面是测试示例。
Public Sub GetTheStuff()
Dim varArray() As Variant
varArray = Split("Bob,Alice,Joe,Jane", ",") '<~~ Error 13, Type Mismatch
DoTheThing varArray
End Sub
Private Sub DoTheThing(Args() As Variant)
Dim i As Long
For i = LBound(Args) To UBound(Args)
Debug.Print Args(i)
Next i
End Sub
是否有一种简单的方法可以从定界字符串填充 Variant 数组,或者我是否必须编写自己的函数才能这样做?
注意:我无法改变我正在调用的函数需要一个 Variant 数组作为参数的事实,我也无法将我的输入作为定界字符串以外的任何内容。
一句话,不 - 没有一个 Split 函数可以 return 一个 Variant 数组。您基本上有 2 个选项 - 如果数组很小(大概),您可以转换它:
Dim rawArray() As String
Dim varArray() As Variant
rawArray = Split("Bob,Alice,Joe,Jane", ",")
ReDim varArray(LBound(rawArray) To UBound(rawArray))
Dim index As Long
For index = LBound(rawArray) To UBound(rawArray)
varArray(index) = rawArray(index)
Next index
您在问题中已经提到的第二个选项 - 编写您自己的 CSV 解析器(烦人但也不难)。
将 CSV 数据导入二维变体数组 数值作为值, 日期作为日期, 字符串作为字符串。
' Import CSV data into two dimensional variant array with numeric as value, date as date, string as string.
Private Function CSV_to_Array(CSV As String)
Dim CSV_Rows() As String
CSV_Rows() = Split(CSV, Chr(10)) ' split the CSV into rows
' Import CSV data into two dimensional variant array with numeric as value, date as date, string as string.
aryWidth = 0
ReDim Ary(0 To UBound(CSV_Rows), 0 To aryWidth) As Variant
For Y = LBound(CSV_Rows) To UBound(CSV_Rows)
CSV_Fields = Split(CSV_Rows(Y), ",")
If UBound(CSV_Fields) > aryWidth Then
aryWidth = UBound(CSV_Fields)
ReDim Preserve Ary(0 To UBound(CSV_Rows), 0 To aryWidth) As Variant
End If
For X = LBound(CSV_Fields) To UBound(CSV_Fields)
If IsNumeric(CSV_Fields(X)) Then
Ary(Y, X) = Val(CSV_Fields(X))
ElseIf IsDate(CSV_Fields(X)) Then
Ary(Y, X) = CDate(CSV_Fields(X))
Else
Ary(Y, X) = CStr(CSV_Fields(X))
End If
Next
Next
CSV_to_Array = Ary()
End Function
Dim Ary() As Variant
Ary() = CSV_to_Array(strCSV)