Это будет код, позволяющий взять все значения 1-го набора записей в двумерный массив, а затем перенести эти значения в одномерный массив (исключая нулевые значения, поскольку нулевые значения нельзя объединить с помощью JOIN).
Я думаю, что было бы лучше просто зациклить каждое поле с помощью цикла, но в случае, если это может помочь, я опубликую это.
Чтобы повторить вашу проблему, я только что создал базу данных с 1 отдельной таблицей с 2 записями:
![enter image description here](https://i.stack.imgur.com/sFMjZ.jpg)
Я объединю все поля, кроме поля 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.