首页 > 解决方案 > MS Access 表导出为 excel 文件到用户定义的文件夹

问题描述

下面的代码工作正常并将访问表数据导出到 excel 文件 (C:\temp\test.xlsx)。

但我的要求不是在 VBA 脚本中定义 C:\temp 文件夹,系统应该要求用户选择输出目录。你能帮我准备那个 VBA 脚本吗?

Private Sub Command3_Click()

 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Fields", _
       "C:\temp\text.xlsx", True
End Sub

标签: vbams-access

解决方案


正如@Shanayl 指出的那样,您可以提示用户在其本地计算机上选择一个文件夹,然后将结果传递给DoCmd.TransferSpreadsheet它,因为它接受一个字符串值。不要简单地将fd连接到文件路径中。

下面修改了@eabraham 的答案,以在 VBA 函数中为用户运行文件夹选择器对话框而不是文件选择器,而不是稍后为 Excel 文件调用的 VBA 子程序。

功能 (与按钮单击事件位于同一区域的表单/报告后面)

Private Function GetExcelFolder() As String       
   Dim fldr As FileDialog
   Dim txtFileName As String

   ' FOLDER PICKER
   Set fldr = Application.FileDialog(msoFileDialogFolderPicker)

   With fldr
      .AllowMultiSelect = False

      ' Set the title of the dialog box.
      .Title = "Please select folder for Excel output."

      ' Show the dialog box. If the .Show method returns True, the
      ' user picked at least one file. If the .Show method returns
      ' False, the user clicked Cancel.
      If .Show = True Then
        txtFileName = .SelectedItems(1)
      Else
        Msgbox "No File Picked!", vbExclamation
        txtFileName = ""
      End If
   End With

   ' RETURN FOLDER NAME
   GetExcelFolder = txtFileName       
End Function

按钮点击事件

Private Sub Command3_Click()
    Dim user_excel_fldr As String

    ' CALL FUNCTION
    user_excel_fldr = GetExcelFolder()    
    If user_excel_fldr = "" Then Exit Sub

    ' SPECIFY ONE TABLE
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "myTableName", _
       user_excel_fldr & "\" & "ExcelOutput.xlsx", True
End Sub

对于数据库中的每个表,循环通过TableDefs,使用MS Access 的DoCmd.TransferSpreadsheet方法的范围参数将每个表输出到特定的工作表选项卡。

Private Sub Command3_Click()
    Dim user_excel_fldr As String
    Dim tbldef As TableDef

    ' CALL FUNCTION
    user_excel_fldr = GetExcelFolder()
    If user_excel_fldr = "" Then Exit Sub

    ' LOOP THROUGH ALL TABLE NAMES
    For Each tbldef In CurrentDb.TableDefs    
        If Not tbldef.Name Like "*MSys*"    ' AVOID SYSTEM TABLES
           DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, tbldef.Name, _
               user_excel_fldr & "\" & "ExcelOutput.xlsx", True, tbldef.Name & "!"
        End If
    Next tbldef

    Set tbldef = Nothing
End Sub

顺便说一句,请注意Excel 不是数据库。必须将整个 MS Access 数据库转储到 Excel 工作簿中,甚至整个表都可能需要重新考虑。也许您的用户需要定制和过滤的表或查询(即 QueryDefs)。最佳实践是使用 Excel 作为最终用途报告应用程序,使用 Access 作为中央存储库后端。


推荐阅读