【问题标题】:Exporting Access Query to Excel将 Access 查询导出到 Excel
【发布时间】:2011-01-30 17:09:20
【问题描述】:

我有一个 Access 2007 数据库,我在该数据库上创建了大约 15 个 SQL 查询来处理特定数据,我使用 Access 中的菜单创建了一个主框架导航菜单,我现在需要使用 VBA 将所有查询提取到 Excel代码,我已经设法通过创建一个按钮并为其指定此代码来使用下面的代码做到这一点。

Private Sub query1_Click()
DoCmd.TransferSpreadsheet acExport, _
acSpreadsheetTypeExcel9, "Total Users and Sessions", _
"C:\UsersandSessions.xls", , "Total Users & Sessions"
End Sub

现在我的问题是查询导出到 Excel 很好,但是这样做完全没有应用任何格式,我想至少在标题中添加一些格式,也许在电子表格中添加一个标题,我不太喜欢的一件事是所有记录都是从第一个单元格开始的。我还希望,如果我在 Access 中再次点击该按钮,并且 Excel 电子表格已经存在该查询输出,那么当再次点击时,它将再次写入下一个可用工作表。

非常欢迎任何建议或想法。

【问题讨论】:

  • 几个问题:#1 当您说“将所有查询提取到 Excel”时,您的意思是您只想导出查询结果吗? #2 这些查询在运行之前是否需要任何用户输入,即日期条件?
  • 您是否研究过 Access 中的 Excel 自动化?这是一个相当大的话题。
  • PowerUser,查询不需要任何用户输入,是的,对不起,我的意思是导出到 Excel 并格式化,您有什么建议吗?谢谢

标签: excel ms-access vba ms-access-2007


【解决方案1】:

短篇小说,你不能。您也许可以在 Excel 端编写一些脚本来格式化生成的文件。如果你想要一些漂亮的东西,你可能想要创建一个报告。

您可以改为将 excel 工作表安装为表格,然后在 excel 文件中的单独工作表上,引用第一个工作表,并格式化第二个工作表以供查看。

【讨论】:

    【解决方案2】:

    如果您使用 DoCmd.TransferSpreadsheet 并创建一个原始文件,然后对其进行编辑以使格式正确,则可以再次运行 DoCmd.TransferSpreadsheet,它将使用值更新文件但保留格式。

    但是,如果有人随后通过添加新选项卡或添加计算等来更改文件,则 DoCmd.TransferSpreadsheet 将不再工作,并且将失败并显示丑陋的错误消息。所以我们在我们的环境中所做的是 DoCmd.TransferSpreadsheet 到带有格式的原始文件,然后在 VBA 中通过将文件复制到用户桌面来跟进,然后打开该副本,这样用户就不会弄乱原始源excel文件。

    这种方法是代码最少、干净且易于维护的解决方案。但它确实需要一个额外的“源”或原始文件。在 Access 2007 中工作。

    您还希望结果显示在新标签上。不幸的是,我认为这需要一些 excel 自动化来做到这一点。 Access 中的 VBA 可以在 Excel 中调用 VBA 中的函数。然后该 VBA 可以根据需要复制选项卡。

    【讨论】:

      【解决方案3】:

      我的想法是混合使用 Access 中的 Excel 自动化,并在 Excel 中创建一个模板,该模板将有一个链接到您的查询的数据表。 开始在 Excel 中创建数据表。如果您愿意或在任何地方,您可以开始向下三行和右侧两列。转到您的数据选项卡并单击访问,找到您的数据库,选择您要链接到的查询,选择表作为单选按钮,但单击属性下一步而不是确定,取消选中启用后台刷新,这部分很关键...下在连接字符串中的定义选项卡中,您将看到一个部分显示 Mode=Share Deny Write 将其更改为 Mode=Read,这将确保在数据库打开时从 MS Access VBA 刷新查询而不会出现错误,并将保留您的如果您的查询是可写查询,则用户不会写回数据库。设置完成后,您可以调整表格格式,但您可以从表格设计选项卡中选择,它将保留该格式。

      为此,我们假设您在单元格 B4 中启动表格,并将工作表命名为 CurrentDay,对于以下 VBA 示例,请务必将该引用替换为您的实际位置。

      接下来返回 Access 并首先编写 VBA,确保在 VBA 窗口中通过转到工具 > 引用并从字母列表中选择它来选择对 Microsoft Excel 12.0 对象库的引用。 创建您的子如下:

      Sub query1_click()
      Dim xl as Excel.Application
      Dim wbk as Excel.Workbook
      Dim wks as Excel.Worksheet
      Dim RC as Integer
      Dim CC as Integer 
      Set xl = New Excel.Application
      Set wbk = xl.wbk.Open "X:\Filelocation\FileName.xlsx" 'name and path you saved the file you previously created
      xl.Visible = True 
      'The above is not necessary but you may want to see your process work the first few times and it will be easier than going to task manager to end Excel if something fails. 
      RC = xl.Application.CountA(xl.wbk.Worksheets("CurrentDay").Range("B:B")) + 3 'This will count the rows of data in your table including your header so you can copy the data to another tab dynamically as the size of your table expands and shrinks we add 3 to it because we started at row 4 and we need the location of the last row of the record set.
      
      CC = xl.Application.CountA(xl.wbk.Worksheets("CurrentDay").Range("4:4")) + 1 'This counts the header row and adds one space because we will use this as a location holder for our copy / paste function
      
      Set wks = xl.wbk.Worksheets.Add
      wks.Name = format(date(),"MM_dd_yy") 'this will name the tab with today's date... you can eliminate this step if you just want the sheets to be the generic Sheet1, Sheet2, etc. 
      
      
         With xl.wbk
                .Worksheets("CurrentDay").Range(Cells(4,2),Cells(RC,CC)).Copy
                .wks.PasteSpecial xlPasteValues 'This pastes the values so that the table links do not paste otherwise every tab would just refresh everyday.
                .wks.PasteSpecial xlPasteFormats 'This gets your formatting.
                .RefreshAll 'This will refresh your table
          Wend
      
          With xl
              .Save 
              .Close False
              .Quit
          Wend
      Set xl = Nothing
      Set wbk = Nothing
      Set wks = Nothing
      End Sub
      

      这应该让您的数据不在 A1 纸上开始,每次都保存旧数据,并自动执行访问步骤。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多