Есть ли в vba функция Join для объединения нескольких полей вместо использования функции доступа в доступе? - PullRequest
0 голосов
/ 25 января 2019

Спасибо за все ваши ответы.У меня есть таблица с одним полем 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, [delimiter])

Спасибо

1 Ответ

0 голосов
/ 29 января 2019

Это будет код, позволяющий взять все значения 1-го набора записей в двумерный массив, а затем перенести эти значения в одномерный массив (исключая нулевые значения, поскольку нулевые значения нельзя объединить с помощью JOIN).

Я думаю, что было бы лучше просто зациклить каждое поле с помощью цикла, но в случае, если это может помочь, я опубликую это.

Чтобы повторить вашу проблему, я только что создал базу данных с 1 отдельной таблицей с 2 ​​записями:

enter image description here

Я объединю все поля, кроме поля 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

Если я выполню этот код, используя ID параметра WHERE = 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.

...