将Access Query导出到Excel

问题描述 投票:2回答:3

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

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

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

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

excel ms-access vba ms-access-2007
3个回答
0
投票

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

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


0
投票

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

但是,如果一个人然后通过添加新选项卡或添加计算等来更改文件,那么DoCmd.TransferSpreadsheet将不再起作用并且将失败并显示一条丑陋的错误消息。因此,我们在环境中所做的是将DoCmd.TransferSpreadsheet转换为具有格式的原始文件,并通过将文件复制到用户桌面,然后打开该副本以便用户不会弄乱原始源,在VBA中进行操作excel文件。

这种方法是最简单的代码,简洁,易于维护的解决方案。但它确实需要额外的“源”或原始文件。适用于Access 2007。

您还希望结果最终出现在新标签上。不幸的是,我认为这需要一些excel自动化。 Acccess中的VBA可以在Excel中调用VBA内的函数。然后,VBA可以根据需要复制选项卡。


0
投票

我的想法是来自Access的Excel自动化和在Excel中创建模板的混合,它将具有链接到您的查询的数据表。开始在Excel中创建数据表。如果需要或任何地方,您可以向下开三行,向右开两列。转到您的数据选项卡并单击访问,找到您的数据库,选择要链接到的查询,选择表作为单选按钮,但单击属性接下来而不是确定,取消选中启用后台刷新,这部分是关键...连接字符串中的定义选项卡,您将看到一个部分,其中显示Mode = Share Deny将更改更改为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开始,每次都保存旧数据,并自动执行访问步骤。

© www.soinside.com 2019 - 2024. All rights reserved.