Вот как я бы это сделал ... только что проверил, и он отлично работает с моим UDF:
Одно - требуется ли вам не использовать New Access.Application?
Sub GetMyDataWithUDF()
Dim oApp As Access.Application
Dim qd As QueryDef
sFileName = "C:\Users\AUser\Desktop\adatabase.mdb"
Set oApp = New Access.Application
oApp.OpenCurrentDatabase (sFileName)
Set qd = oApp.CurrentDb.QueryDefs("Query1")
If oApp.DCount("*", "MSysObjects", "Name='dataTableResults'") > 0 Then _
oApp.CurrentDb.TableDefs.Delete "dataTableResults"
qd.Parameters("avalue") = "4"
qd.Execute
oApp.Quit
Set oApp = Nothing
Dim oRS As ADODB.Recordset
sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFileName & ";User Id=admin;Password=;"
Set oRS = New ADODB.Recordset
oRS.Open "SELECT * FROM dataTableResults", sConn
Sheet1.Cells.Clear
Sheet1.Range("A1").CopyFromRecordset oRS
oRS.Close
Set oRS = Nothing
End Sub
Обратите внимание , что я сделал свой базовый запрос SELECT ... INTO, который создает таблицу с именем dataTableResults
Это мой запрос (QueryDef)в Access:
SELECT dataTable.Field1, dataTable.Field2 INTO dataTableResults
FROM dataTable
WHERE mysqr(dataTable.Field1)=[avalue];
В моей базе данных MS-Access есть функция "mysqr", которая используется в приведенном выше SQL.
Function mysqr(Num)
mysqr = Num * Num
End Function
Таблица "dataTable".Запрашивать это просто список чисел, поэтому, если мой параметр «avalue» равен «16», я получаю строку «4» обратно.Если я введу «4» (как в моем коде), я получу «2» обратно.