【问题标题】:Access + VBA + SQL - How to export multiple queries into one excel Workbook, but, multiple Worksheet using the criteria from a tableAccess + VBA + SQL - 如何将多个查询导出到一个excel工作簿中,但是,多个工作表使用表中的条件
【发布时间】:2014-02-10 15:04:41
【问题描述】:

我需要一些帮助将多个查询导出到一个 Excel 工作簿,但是,多个工作表?使用 MS Access VBA 中表中的条件

附上数据库供参考。

表名:Tbl_Final(列如下)

  • 系统
  • 用户 ID
  • 用户类型
  • 状态
  • 工作职位

基于表“Tbl_Final”(下面的 SQL 查询)中“系统”列中的唯一值,我需要创建 INDIVIDUAL excel 文件并将其导出到文件夹。 例子: SELECT TBL_FINAL.System, TBL_FINAL.[用户 ID], TBL_FINAL.[用户类型], TBL_FINAL.Status, TBL_FINAL.[职位] 从 TBL_FINAL WHERE (((TBL_FINAL.System)="OS/400"));

    SELECT TBL_FINAL.System, TBL_FINAL.[User ID], TBL_FINAL.[User Type], TBL_FINAL.Status, TBL_FINAL.[Job Position]
    FROM TBL_FINAL
    WHERE (((TBL_FINAL.System)="Tab"));

谷歌搜索后,我设法找到了符合条件的代码。但是遇到了一些障碍:(

请求帮助!!

Option Compare Database

Private Sub Command1_Click()

    Dim strSQL As String
    Dim dbs As Database
    Dim qdf As QueryDef
    strQry = "REPORT_QUERY"

    Set dbs = CurrentDb
    Set qdf = dbs.CreateQueryDef(strQry)

    strSQL = "SELECT System, [User ID], [User Type], [Status] FROM TBL_FINAL WHERE System = 'OS/400'"
    qdf.SQL = strSQL
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, _
        strQry, "C:\Program Files\Export\GENERAL_EXPORT.xls", True, _
        "Sheet1"
    
    strSQL = "SELECT System, [User ID], [User Type], [Status] FROM TBL_FINAL WHERE System = 'MySys'"
    qdf.SQL = strSQL
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, _
        strQry, "C:\Program Files\Export\GENERAL_EXPORT.xls", True, _
        "Sheet2"
    
    DoCmd.DeleteObject acQuery, strQry

End Sub

【问题讨论】:

    标签: sql excel vba ms-access-2007


    【解决方案1】:

    以下 VBA 代码适用于我,创建一个包含多个工作表(mySheet1mySheet2)的新 Excel 工作簿(.xlsx 文件):

    Option Compare Database
    Option Explicit
    
    Sub ExportToXlsx()
        Dim cdb As DAO.Database, qdf As DAO.QueryDef
        Set cdb = CurrentDb
    
        Const xlsxPath = "C:\Users\Gord\Desktop\foo.xlsx"
    
        ' create .xlsx file if it doesn't already exist, and add the first worksheet
        Set qdf = cdb.CreateQueryDef("mySheet1", _
                "SELECT * FROM Clients WHERE ID Between 1 And 5")
        Set qdf = Nothing
        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "mySheet1", xlsxPath, True
        DoCmd.DeleteObject acQuery, "mySheet1"
    
        ' file exists now, so this will add a second worksheet to the file
        Set qdf = cdb.CreateQueryDef("mySheet2", _
                "SELECT * FROM Clients WHERE ID Between 6 And 10")
        Set qdf = Nothing
        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "mySheet2", xlsxPath, True
        DoCmd.DeleteObject acQuery, "mySheet2"
    
        Set cdb = Nothing
    End Sub
    

    请注意,工作表的名称取自要导出的查询(或表)的名称。如果 Excel 文件中不存在具有该名称的工作表,则会添加该工作表。

    【讨论】:

    • 有趣的是,这个DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "Table4", "test.xlsx", True DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "Query6", "test.xlsx", True 将在test.xlsx 中创建两个新工作表,即使该文件已经存在。新工作表将根据查询或表名命名。我经常使用它进行调查分析。
    • @Remou 是的,没错,这就是我的代码所做的。我在答案中添加了一些 cmets 来澄清。谢谢。
    • 嗨,戈德,使用上面的代码,我能够将 excel 导出到路径中硬编码的路径。我能够找到提示用户选择应保存导出的文件路径的代码。我想知道,如何将其包含在代码中并为每个文件附加唯一的“系统”值。示例:DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "mySheet2", xlsxPath & "OS400" &, True
    • Sub FolderPicker() Dim fd As Office.FileDialog Dim path As String Dim notCancel As Boolean Set fd = Application.FileDialog(msoFileDialogFolderPicker) With fd notCancel = .Show If notCancel Then path = .SelectedItems(1 ) MsgBox "选中的文件夹是" & path, vbInformation End If End With End Sub
    • @user3217907 将Sub FolderPicker() 更改为Function FolderPicker() As String 并让它返回path 值。在您的主代码中执行xlsxPath = FolderPicker(),然后在您最近的评论中尝试修改后的DoCmd.TransferSpreadsheet。如果您遇到困难,请询问new question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多