Access のカスタム カテゴリに一連のクエリと、クエリ名を取得して実行し、各クエリの結果を Excel スプレッドシートの別のタブにコピーする VBA コードがあります。コードは次のとおりです。
Private Sub Command0_Click()
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Dim timestamp As String
Dim path As String
'Create the Excel spreadsheet
timestamp = Format(Now(), "yyyyMMddhhmmss")
path = "C:\Users\username\Desktop\ValidationResults" & timestamp & ".xlsx"
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
Set oSheet = oBook.Worksheets("Sheet1")
oBook.SaveAs path
oExcel.Quit
'This gets a list of query names and puts it in a recordset
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("01 - GetValidationQueries")
'this runs each query and copies the results to a unique worksheet
Do While Not rs.EOF
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, rs("Name"), path, True, Left(rs("Name"), 2)
rs.MoveNext
Loop
End Sub
"01 - GetValidationQueries" クエリは、MSysNavPaneGroupToObjects テーブルと MSysNavPaneObjectIDs テーブルを調べて、カスタム カテゴリ内のクエリの名前を取得します。
問題は、フォーム ボタンをクリックしてこのコードを実行すると、DoCmd 行で次のエラーが発生することです。
Run-time error '3275':
Unexpected error from external database driver (1309).
コードを 1 行ずつ (毎回 F8 キーを押して) 実行すると、正常に実行されるため、TransferSpreadsheet プロセスが遅すぎると推測されます。その行の後に一時停止を入れる以外に、これを機能させるより良い方法はありますか?
EDIT:次のコードを使用して(少なくとも今のところ)
Public Function fnWait(intNrOfSeconds As Integer)
Dim varStart As Variant
varStart = Timer
Do While Timer < varStart + intNrOfSeconds
Loop
End Function
次に、DoCmd 行の前後に...
fnWait (2)
...2 秒の遅延を作成します。これまでのところ機能しているようです。