我在MS Access中有一个表,它有以下数据要导出到excel
导出到Excel后,我希望将不同的版本号作为从A2开始的行,将不同的测试用例名称作为从B1开始的列。可能有几千条记录。然后将每个单元格设置为结果标记。此外还需要一些花哨的着色/边界材料。
问题 - 是否可以在Access中使用VBA执行此操作,如果是,那么该怎么办?任何提示,样本,示例,资源都会受到赞赏...我用Google搜索了但我遇到的最多的事情是DoCmd.TransferSpreadsheet
或DoCmd.OutputTo
,我认为这不会做我想要的。看到CreateObject("Excel.Application")
的一些例子,但不确定使用这种方式有什么限制和性能。
答案 0 :(得分:1)
我不知道它是否适用于您的情况,但您可能会尝试将VBA代码添加到Excel文档而不是Access数据库。然后,您可以刷新Excel文件中的数据,并在那里添加格式更加容易。这是一个例子:
(或参见http://www.exceltip.com/exceltips.php?view=category&ID=213上的其他例子)
同样,它可能不适用于您的情况,但它可能是一个考虑的选项。基本上,不是从Access推送,而是从Excel中提取。
答案 1 :(得分:1)
是的,在很多情况下DoCmd.TransferSpreadsheet命令都不合适。
最简单的方法是在Access(Early Binding)中引用Excel xx.x对象模型。以这种方式创建和测试您的vba导出功能。然后,一旦对输出感到满意,请删除Excel对象模型引用,然后更改对象以使用使用CreateObject的Late Binding。这使您可以轻松地使用其他使用不同版本的Excel / Access的机器来使用它。
这是一个简单的例子:
Sub ExportRecordsetToExcel(outputPath As String, rs As ADODB.Recordset)
'exports the past due report in correct formattig to the specified path
On Error GoTo handler:
Const xlUP As Long = -4162 'excel constants if used need to be referenced manually!
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Dim row As Long
If rs.BOF And rs.EOF Then
Exit Sub 'no data to write
Else
rs.MoveFirst
End If
row = 1
Set oExcel = CreateObject("Excel.Application")
oExcel.Visible = False 'toggle for debugging
Set oBook = oExcel.Workbooks.Add 'default workbook has 3 sheets
'Add data to cells of the first worksheet in the new workbook.
Set oSheet = oBook.worksheets(1)
Do While rs.EOF = False
oSheet.range("A" & row).value = rs.Fields("MyField").value
'increase row
row = row + 1
Loop
oBook.SaveAs (outputPath)
'tidy up, dont leave open excel process
Set oSheet = Nothing
Set oBook = Nothing
oExcel.Quit
Set oExcel = Nothing
Exit Sub
handler:
'clean up all objects to not leave hanging processes
End Sub