AccessからVBAでExcelに出力は次のようなコードで実行できる。
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "tbl_lookup_ird", "c:\temp.xls", True
似ている方法で、Excelオブジェクトを作成してからそこに出力を書き込む方法もある。
Public Sub QueryToExcel(ExcelFile As String) Dim db As Database Dim qdf As QueryDef Dim qryCount As Integer Dim SheetName As String Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) 'Make the worksheet visible. xlSheet.Application.Visible = True Set db = CurrentDb() With db qryCount = 0 For Each qdf In .QueryDefs qryCount = qryCount + 1 ' Output qryCount, .Name and .SQL to the next line ' in a sheet in the Excel file With xlSheet.Cells(qryCount, 1) .Value = Str(qryCount) .Font.Size = 12 .Font.Bold = True End With With xlSheet.Cells(qryCount, 2) .Value = qdf.Name .Font.Size = 12 .Font.Bold = True End With With xlSheet.Cells(qryCount, 3) .Value = qdf.SQL .Font.Size = 10 End With Next qdf End With 'Save the new worksheet, close Excel and clear the object variable. xlSheet.SaveAs ExcelFile xlSheet.Application.Quit Set xlSheet = Nothing ' Create new sheets in the newly created Excel file for ' the results of each of the queries With db qryCount = 0 For Each qdf In .QueryDefs With qdf qryCount = qryCount + 1 SheetName = "Query" & Trim(Str(qryCount)) ' Create a new sheet in the specified Excel file with ' the output of the named query. ' If there is a pre-existing one with the same name ' the new sheet will have a "1" appended to its name. ' Problems or issues: ' 1. Invalid queries will error out ' 2. Action queries will error out ' 3. Queries with parameters will require user input DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _ .Name, ExcelFile, , SheetName End With Next qdf .Close End With End Sub
あるいは次のように
Dim appExcel As Excel.Application Dim wbk As Excel.Workbook Dim wks As Excel.Worksheet Dim rng As Excel.Range Dim fileName As String Set appExcel = Excel.Application appExcel.Visible = True Set wbk = appExcel.Workbooks.Add Set wks = wbk.Worksheets(1) Set rng = wks.Range("A2:I4001") wks.Cells(1, 1).Value = "Generating data..." Set rst = CurrentDb.OpenRecordset(customQuery) If (rst.RecordCount > 0) Then cnt = 1 For Each fld In rst.Fields wks.Cells(1, cnt).Value = fld.Name cnt = cnt + 1 Next fld Call rng.CopyFromRecordset(rst, 4000, 26) End If fileName = ExportDir & "\Molenproductie" & DateTimeFrom & "-" & DateTimeTo & ".xls" wks.SaveAs (fileName) rst.Close Set rst = Nothing
ところで、AccessからExcelに出力してからPivot Tableを作成するという手法がある。
但し、次のコードはExcelから直接にAccessのデータベースへ接続してデータを取り出しているようです。
Sub DAOCopyFromRecordSet(DBFullName As String, TableName As String, _ FieldName As String, TargetRange As Range) ' Example: DAOCopyFromRecordSet "C:\FolderName\DataBaseName.mdb", _ "TableName", "FieldName", Range("C1") Dim db As Database, rs As Recordset Dim intColIndex As Integer Set TargetRange = TargetRange.Cells(1, 1) Set db = OpenDatabase(DBFullName) Set rs = db.OpenRecordset(TableName, dbOpenTable) ' all records 'Set rs = db.OpenRecordset("SELECT * FROM " & TableName & _ " WHERE " & FieldName & _ " = 'MyCriteria'", dbReadOnly) ' filter records ' write field names For intColIndex = 0 To rs.Fields.Count - 1 TargetRange.Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name Next ' write recordset TargetRange.Offset(1, 0).CopyFromRecordset rs Set rs = Nothing db.Close Set db = Nothing End Sub
0 件のコメント:
コメントを投稿