我正在尝试将多个表输出到excel文件。每次运行宏时,它都会提示我覆盖旧文件。我正在寻找一种不涉及发送密钥的方法,因为它会锁定键盘和鼠标直到宏完成。
最佳解决方案是什么?
答案 0 :(得分:4)
您使用的是DoCmd.OutputTo吗?
DoCmd.OutputTo acOutputTable, "Table1", acFormatXLS, "c:\temp\test.xls"
这似乎不会提示覆盖现有文件。
答案 1 :(得分:3)
你可以做这样的事情,但它很笨拙而且不够健壮。
DoCmd.SetWarnings False
'do stuff
DoCmd.SetWarnings true
你还可以做的是先查看文件是否存在,如果是,请删除它(当然这会破坏你在其上设置的任何特殊文件权限)。
If Dir(strPath) <> "" Then
Kill (strPath) 'Delete (strPath)
End If
DoCmd.TransferSpreadsheet acExport, _
acSpreadsheetTypeExcel8, _
"MyTableQueryName", _
strPath, _
True
答案 2 :(得分:1)
拥有另一个先运行的宏,如果该文件已经存在,则删除该文件。
答案 3 :(得分:1)
我建议你尽快避免使用宏。它们不健壮(没有错误处理)而且不易管理(你如何找出应该使用宏的位置?)。
从长远来看,DoCmd.OutputTo或其中一个DoCmd.TransferXXX命令将更容易处理。
答案 4 :(得分:0)
不确定Access,但大多数其他Office应用程序都具有DisplayAlerts
属性或类似内容,因此您可以在执行通常会导致出现对话框的操作之前执行Application.DisplayAlerts = False
。
答案 5 :(得分:0)
为避免重复文件,我通常会在文件名中附加日期和时间。这也具有允许用户保留同一报告的多个版本的优点。
Public Sub ExportToExcel(objectToExport As Variant, _
outPutType As AcOutputObjectType, _
filename As String, _
Optional outputFormat = acFormatXLS)
' Construct the filename using the date and time '
Dim fnamebase As String
Dim ext As String
ext = Mid$(filename, InStrRev(filename, "."))
fnamebase = Left$(filename, Len(filename) - Len(ext)) _
& Format(Now, "-yyyymmdd-hh\hmm")
' check if there is another file with the same name '
' append (1), (2) until we find a free slot '
Dim fname As String
Dim count As Integer
fname = fnamebase & ext
Do While Len(Dir(fname)) > 0
count = count + 1
fname = fnamebase & "(" & count & ")" & ext
Loop
' Now we're fairly sure no identical filename exists '
DoCmd.OutputTo objectType:=outPutType, _
ObjectName:=objectToExport, _
outputFormat:=outputFormat, _
OutputFile:=fname, _
Encoding:=vbUnicode
End Sub
您现在可以导出查询和表格:
查询Excel 2007/2010格式(仅限Access2007 / 2010中提供的XLXS格式):
ExportToExcel "qrySupplierList", acOutputQuery, "D:\suppliers.xlsx", acFormatXLSX
文本文件的表格:
ExportToExcel "Suppliers", acOutputTable, "D:\suppliers.txt", acFormatTXT
现在,TransferSpreadSheet
最好将表格转移到Excel,因此您可能更愿意使用该表格:
Public Sub ExportTableToExcel(tableName As String, _
filename As String, _
Optional spreadSheetType = acSpreadsheetTypeExcel8)
' Construct the filename using the date and time '
Dim fnamebase As String
Dim ext As String
ext = Mid$(filename, InStrRev(filename, "."))
fnamebase = Left$(filename, Len(filename) - Len(ext)) _
& Format(Now, "-yyyymmdd-hh\hmm")
' check if there is another file with the same name '
' append (1), (2) until we find a free slot '
Dim fname As String
Dim count As Integer
fname = fnamebase & ext
Do While Len(Dir(fname)) > 0
count = count + 1
fname = fnamebase & "(" & count & ")" & ext
Loop
' Now we're fairly sure no identical filename exists '
DoCmd.TransferSpreadsheet TransferType:=acExport, _
spreadSheetType:=spreadSheetType, _
tableName:=tableName, _
filename:=fname, _
HasFieldNames:=True
End Sub
你这样使用它:
将表格导出为Excel97格式:
ExportTableToExcel "Supplier", "D:\Suppliers.xlx"
要将其导出为XLSX格式(仅限Access 2007/2010):
ExportTableToExcel "Supplier", "D:\Suppliers.xlsx", acSpreadsheetTypeExcel12Xml