vba中的Join函数是否可以合并多个字段,而不是在访问中使用串联函数?

时间:2019-01-25 20:47:21

标签: access-vba

感谢您的所有回复。 我有一个带有一个id字段和R1-R30字段的表。 我可以使用

连接查询中的R1-R30字段
Route: Trim([R1] & IIf([R2]="","","   ") & [R2] & IIf([R3]="","","   ") & [R3] & IIf([R4]="","","   ") & [R4] & IIf([R5]="","","   ") & [R5] & IIf([R6]="","","   ") & [R6] & IIf([R7]="","","   ") & [R7] & IIf([R8]="","","   ") & [R8] & IIf([R9]="","","   ") & [R9] & IIf([R10]="","","   ") & [R10] & IIf([R11]="","","  ") & [R11] & IIf([R12]="","","   ") & [R12] & IIf([R13]="","","   ") & [R13] & IIf([R14]="","","   ") & [R14] & IIf([R15]="","","   ") & [R15] & IIf([R16]="","","   ") & [R16] & IIf([R17]="","","   ") & [R17] & IIf([R18]="","","   ") & [R18] & IIf([R19]="","","   ") & [R19] & IIf([R20]="","","   ") & [R20] & IIf([R21]="","","   ") & [R21] & IIf([R22]="","","   ") & [R22] & IIf([R23]="","","   ") & [R23] & IIf([R24]="","","   ") & [R24] & IIf([R25]="","","   ") & [R25] & IIf([R26]="","","   ") & [R26] & IIf([R27]="","","   ") & [R27] & IIf([R28]="","","   ") & [R28] & IIf([R29]="","","   ") & [R29] & IIf([R30]="","","   ") & [R30])

我的问题是,我发现的Join函数是否可以应用于查询中,分隔符可能是备用,逗号或斜杠。

加入(source_array,[定界符])

谢谢

1 个答案:

答案 0 :(得分:0)

这将是将1个单个记录集的所有值放入一个二维数组,然后将这些值放入一维数组的代码(不包括空值,因为空值不能与JOIN连接)。

我认为最好使用循环遍历每个字段,但是如果有帮助的话,我会发布它。

为了复制您的问题,我刚刚创建了一个数据库,其中包含1个具有2条记录的单表:

enter image description here

我将连接所有字段,但ID字段除外。因此,通过一个简单的查询,我可以使用ID字段作为参数来获得1条记录的记录集:

SELECT Tabla1.Field1, Tabla1.Field2, Tabla1.Field3, Tabla1.Field4
FROM Tabla1
WHERE (((Tabla1.Id)=1));

然后使用逗号作为分隔符的VBA代码将Msgbox连接到的字段。

Sub JOIN_RST()
Dim rst As Recordset

Dim vArray As Variant
Dim SingleArray() As Variant

Dim i As Long

Dim MySQL As String
Dim STRJoined As String

MySQL = "SELECT Tabla1.Field1, Tabla1.Field2, Tabla1.Field3, Tabla1.Field4 " & _
    "FROM Tabla1 WHERE (((Tabla1.Id)=2));" 'query to get a single recordset.


Set rst = Application.CurrentDb.OpenRecordset(MySQL, 2, 4)
DoEvents

If rst.RecordCount > 0 Then
    rst.MoveLast
    rst.MoveFirst
    vArray = rst.GetRows
    ReDim SingleArray(UBound(vArray))

    For i = 0 To UBound(SingleArray)
        If IsNull(vArray(i, 0)) = True Then
            SingleArray(i) = ""
        Else
            SingleArray(i) = vArray(i, 0)
        End If
    Next i

    Debug.Print vArray(0, 0) 'Field 1
    Debug.Print vArray(1, 0) 'Field 2
    Debug.Print vArray(2, 0) 'Field 3
    Debug.Print vArray(3, 0) 'Field 4

    STRJoined = Join(SingleArray, ",")

    Debug.Print STRJoined
End If

Set rst = Nothing
Erase vArray
Erase SingleArray
DoEvents


End Sub

如果我使用WHERE参数ID = 1来执行此代码,则会在调试器窗口中得到:

First Record
 1 
Null
My first record. Got a null value in Field 3 (it's empty)
First Record,1,,My first record. Got a null value in Field 3 (it's empty)

ID = 2时,我得到:

Second Record
 2 
Not null
Second Record
Second Record,2,Not null,Second Record

这有点用。希望您能适应您的需求。但正如我所说。查看代码,我认为在单个查询中循环读取所有记录中的低谷字段会更容易。像这样的东西:

Sub LOOPING_TROUGHT_FIELDS()
Dim RST As Recordset
Dim Joined_Records() As Variant
Dim i As Long
Dim MySQL As String
Dim STRJoined As String

Dim FLD As Field

MySQL = "SELECT Tabla1.Field1, Tabla1.Field2, Tabla1.Field3, Tabla1.Field4 " & _
    "FROM Tabla1;" 'query to get all recordset you want to join
Set RST = Application.CurrentDb.OpenRecordset(MySQL, 2, 4)
DoEvents

If RST.RecordCount > 0 Then
    RST.MoveLast
    RST.MoveFirst

    i = 0
    ReDim Joined_Records(RST.RecordCount)

    Do Until RST.EOF = True
        For Each FLD In RST.Fields
            If IsNull(FLD.Value) = True Then
                STRJoined = STRJoined & "" & ","
            Else
                STRJoined = STRJoined & FLD.Value & ","
            End If

        Next FLD
        Joined_Records(i) = Left(STRJoined, Len(STRJoined) - 1) 'we get 1 minus because there is an extra comma at end
        i = i + 1
        STRJoined = ""
        RST.MoveNext
    Loop

End If

Set RST = Nothing
Set FLD = Nothing

For i = 0 To UBound(Joined_Records) Step 1
    Debug.Print Joined_Records(i)
Next i

Erase Joined_Records

End Sub

我不知道您有多少记录。尝试两者并检查每个选项花费多长时间,然后选择1。

希望您可以使所有这些适应您的需求。欢迎来到SO。