ОК, это может показаться немного длительным - Создание Excel-таблица - в первой строке (из столбца два) у вас есть имена полей Точно так, как вы их в доступе-таблице, в первой колонке у вас есть требуемые значения ключа (например, CustomerID). При запуске макроса он заполняет в том, что он находит ...
Sub RefreshData()
Const fldNameCol = 2 'the column with the first fieldname in it'
Dim db, rst As Object
Set db = DBEngine.workspaces(0).OpenDatabase("C:\path\to\db\name.accdb")
Set rst = db.openrecordset("myDBTable", dbOpenDynaset)
Dim rng As Range
Dim showfields() As Integer
Dim i, aRow, aCol As Integer
ReDim showfields(100)
Set rng = Me.Cells
aRow = 1 'if you have the fieldnames in the first row'
aCol = fldNameCol
'***** remove both '' to speed things up'
'On Error GoTo ExitRefreshData'
'Application.ScreenUpdating = False'
'***** Get Fieldnames from Excel Sheet'
Do
For i = 0 To rst.fields.Count - 1
If rst.fields(i).Name = rng(aRow, aCol).Value Then
showfields(aCol) = i + 1
Exit For
End If
Next
aCol = aCol + 1
Loop Until IsEmpty(rng(aRow, aCol).Value)
ReDim Preserve showfields(aCol - 1)
'**** Get Data From Databasetable'
aRow = 2 'startin in the second row'
aCol = 1 'key values (ID) are in the first column of the excel sheet'
Do
rst.FindFirst "ID =" & CStr(rng(aRow, aCol).Value) 'Replace ID with the name of the key field'
If Not rst.NoMatch Then
For i = fldNameCol To UBound(showfields)
If showfields(i) > 0 Then
rng(aRow, i).Value = rst.fields(showfields(i) - 1).Value
End If
Next
End If
aRow = aRow + 1
Loop Until IsEmpty(rng(aRow, aCol).Value)
ExitRefreshData:
Application.ScreenUpdating = True
On Error GoTo 0
End Sub
И если вы не хотите, чтобы ваши имена полей в листе первенствовать заменить пункт «Получить имена полей из Excelsheet» с этим:
fieldnames = Split("field1name", "", "", "field3name")
For j = 0 To UBound(fieldnames) - 1
For i = 0 To rst.fields.Count - 1
If rst.fields(i).Name = fieldnames(j) Then
showfields(j + fldNameCol) = i + 1
Exit For
End If
Next
Next
ReDim Preserve showfields(UBound(fieldnames) - 1 + fldNameCol)
и добавить в верхней
dim j as integer
dim fieldnames
вы пробовали с помощью MS-запроса внутри некоторого VBA, а затем манипулировать его перед выводом его в одной ячейке? – Fluffeh
Я не знаю VBA, но мог бы узнать, если понадобится. Но я надеялся, что это достаточно просто, чтобы быть действительно простым, и либо не требует VBA, либо требует только минимального VBA. – PonyEars
Работая с конца Excel, вам понадобится довольно много VBA и некоторых ADO. С конца доступа вы можете просто связать рабочий лист в виде таблицы и использовать окно дизайна запроса для выполнения запросов. Запрос можно выводить на новый лист Excel. – Fionnuala