我有一个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电子表格已经存在该查询输出,那么当再次单击时它将再次写入下一个可用工作表。
非常欢迎任何建议或想法。
答案 0 :(得分:0)
短篇小说,是不是。您可以在Excel端执行一些脚本来格式化生成的文件。如果你想要漂亮的东西,你可能想要创建一个报告。
您可以将Excel工作表作为表格安装,然后在Excel文件中的单独工作表上,引用第一张工作表,并格式化第二张工作表以供查看。
答案 1 :(得分:0)
如果您使用DoCmd.TransferSpreadsheet并创建原始文件然后对其进行编辑以使格式正确,则可以再次运行DoCmd.TransferSpreadsheet,它将使用值更新文件,但保留格式。
但是,如果某人通过添加新标签或添加计算等来更改文件,那么DoCmd.TransferSpreadsheet将不再有效,并且会因丑陋的错误消息而失败。因此,我们在环境中所做的是将DoCmd.TransferSpreadsheet转换为具有格式的原始文件,并通过将文件复制到用户桌面,然后打开该副本以便用户不会弄乱原始源,在VBA中进行操作excel文件。
这种方法是最简单的代码,简洁且易于维护的解决方案。但它确实需要额外的“源”或原始文件。适用于Access 2007。
您还希望结果最终出现在新标签页上。不幸的是,我认为这需要一些excel自动化。 Acccess中的VBA可以在Excel中调用VBA内的函数。然后,VBA可以根据需要复制选项卡。
答案 2 :(得分:0)
我的想法是来自Access的Excel自动化和在Excel中创建模板的混合,它将具有链接到您的查询的数据表。 开始在Excel中创建数据表。如果需要或任何地方,您可以向下开三行,向右开两列。转到您的数据选项卡并单击访问,找到您的数据库,选择要链接到的查询,选择表作为单选按钮,但单击属性接下来而不是确定,取消选中启用后台刷新,这部分是关键...在连接字符串中的定义选项卡中,您将看到一个部分,其中显示Mode = Share Deny将其更改为Mode = Read,这将确保在数据库打开时查询刷新而没有来自MS Access VBA的错误,并将保留您的用户在写入查询是可写查询时写回数据库。设置完成后,您可以调整表格格式,但是您可以从表格设计选项卡中进行选择,它将保留格式。
出于此目的,我们假设您在单元格B4中启动了表格,并且您的工作表名为CurrentDay,为了以下VBA示例的目的,请确保将该引用替换为您的实际展示位置。
接下来返回Access并编写VBA,首先确保在VBA窗口中通过转到Tools>选择了对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开始,每次都保存旧数据,并自动执行访问步骤。