在Access 2007中如何在没有提示的情况下覆盖文件?

时间:2009-07-28 13:59:32

标签: ms-access

我正在尝试将多个表输出到excel文件。每次运行宏时,它都会提示我覆盖旧文件。我正在寻找一种不涉及发送密钥的方法,因为它会锁定键盘和鼠标直到宏完成。

最佳解决方案是什么?

6 个答案:

答案 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