将2D变体数组的一个二维抽取到一个string

类似于: 将Variant数组转换为string – 但接受的答案不适用于我的情况。

我的代码:

SQLStr = "SELECT lineID FROM alldata where asdf = '" & asdf & "'" Set rs = New ADODB.Recordset rs.Open SQLStr, conn, adOpenStatic Dim arr Dim arrString rs.MoveFirst arr = rs.GetRows arrString = Join(arr, ", ") 

在语句arr = rs.GetRows执行后,它在我的控制台中具有以下值:

在这里输入图像描述

我试图join这两个值,用comma space分隔一个string,所以最终的结果是:

arrString = "25616, 99607"

但是,当我运行Join行时,我得到一个Invalid procedure call or argument错误。 我究竟做错了什么?

虽然我确定有一个更优雅的方式来完成您的任务,但我确实写了一些看起来正在成功运行的代码。

 Option Explicit Private Sub TestArray() Dim arr(0, 1) As Variant 'Mimic the structure of your array Dim arrString As String Dim sDelimiter As String Dim j As Long 'Mimic the structure of your array arr(0, 0) = "25616" arr(0, 1) = "99607" sDelimiter = ", " 'Set your delimiter 'Loop through the inner array For j = 0 To UBound(arr, 2) 'Concatenate the elements arrString = arrString & sDelimiter & arr(0, j) Next j 'Remove the leading delimiter / cleanup arrString = Replace(arrString, sDelimiter, "", 1, 1, vbTextCompare) MsgBox arrString End Sub 

有趣的代码是从sDelimiter = ", "和向下。

我无法弄清楚如何将数组转换成一维数组(从一个二维数组数组),所以我决定循环内部数组并连接值。

串联会在列表的前面产生一个额外的分隔符,所以有一行代替这个分隔符。

join只接受一维数组。 这是一个非循环的方式来获取logging到一个逗号分隔的string。

 Sub TestArray() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sArr As String Set cn = New ADODB.Connection cn.Open gsCON Set rs = cn.Execute("SELECT * FROM InvoiceLine") rs.MoveFirst sArr = Join(Split(rs.GetString, vbTab), ", ") Debug.Print sArr rs.Close cn.Close Set cn = Nothing End Sub 

GetRows将数据放在错误的行/列方向。 你可以使用Application.Transpose来正确的,但是你仍然不能将它传递给Join,因为它是2D的。

GetString返回一个tab / lf分隔string。 我把它分成了标签,然后在逗号空间重新join,这是很好的去。

就在两天前,有一个问题促使我编写一个函数,我称之为MultiSplit() ,它使用了一个string和2个分隔符,并将其分成一个2维数组。 这个现在的问题需要一些反面的东西:

 Function MultiJoin(A As Variant, Optional ItemDelimiter As String = ",", Optional RowDelimiter As String = ";") As String 'assumes that A is a 2-dimensional array of strings Dim s As String, i As Long, j As Long Dim lb1 As Long, lb2 As Long, ub1 As Long, ub2 As Long lb1 = LBound(A, 1) lb2 = LBound(A, 2) ub1 = UBound(A, 1) ub2 = UBound(A, 2) For i = lb1 To ub1 For j = lb2 To ub2 s = s & A(i, j) & IIf(j < ub2, ItemDelimiter, "") Next j s = s & IIf(i < ub1, RowDelimiter, "") Next i MultiJoin = s End Function 

testing像:

 Sub test() Dim A As Variant ReDim A(0 To 0, 0 To 1) A(0, 0) = "25616" A(0, 1) = "99607" Debug.Print MultiJoin(A, ", ") ReDim A(0 To 1, 0 To 1) A(0, 0) = 1 A(0, 1) = 2 A(1, 0) = 3 A(1, 1) = 4 Debug.Print MultiJoin(A, " ", vbCrLf) End Sub 

输出:

 25616, 99607 1 2 3 4 

正如你在Excel中,你可以使用Index切片并返回一维数组

  Dim arr(0, 2) As Variant arr(0, 0) = "25616" arr(0, 1) = "99607" arr(0, 2) = "12345" MsgBox Join(Application.Index(arr, 0), ", ")