【问题标题】:How to use workbook.saveas with automatic Overwrite如何使用带有自动覆盖的 workbook.saveas
【发布时间】:2013-01-31 20:23:27
【问题描述】:

在这一段代码中,Excel总是提示:“文件已经存在,你要覆盖吗?”

Application.DisplayAlerts = False
Set xls = CreateObject("Excel.Application")
Set wb = xls.Workbooks.Add
fullFilePath = importFolderPath & "\" & "A.xlsx"

wb.SaveAs fullFilePath, AccessMode:=xlExclusive, ConflictResolution:=True   

wb.Close(True)

如果我有DisplayAlerts = False,为什么db.SaveAs 总是提示我覆盖现有文件?

【问题讨论】:

    标签: excel vba excel-2010


    【解决方案1】:

    隐藏提示集xls.DisplayAlerts = False

    ConflictResolution 不是truefalse 属性,它应该是xlLocalSessionChanges

    注意这与显示覆盖提示无关!

    Set xls = CreateObject("Excel.Application")    
    xls.DisplayAlerts = False
    Set wb = xls.Workbooks.Add
    fullFilePath = importFolderPath & "\" & "A.xlsx"
    
    wb.SaveAs fullFilePath, AccessMode:=xlExclusive,ConflictResolution:=Excel.XlSaveConflictResolution.xlLocalSessionChanges    
    wb.Close (True)
    

    【讨论】:

    • 您需要告诉您正在处理的工作簿不显示警报。我已经更新了上面的代码....只要看看 Application.DisplayAlerts 应该是 wb.Application.DisplayAlerts
    • @JackDouglas - 正如所写,你是对的 - DisplayAlerts=False 行应该在设置 Workbook 对象之后。但是,您可以使用 Application.DisplayAlerts 对其进行全局设置。在您完成阻止警报后,您还应该将其更改回 True。
    • @Sorceri 你的回答有很多错误,请考虑修改! 首先,ConflictResolution 与SaveAs 覆盖提示无关。 (详见here——它是关于共享excel文件中多个编辑器之间的冲突。)第二Application.DisplayAlertsApplication对象的成员,不是 Workbook 对象。因此,在创建 Excel 应用程序的新实例后,请使用以下命令:xls.DisplayAlerts = False。 (这是 OP 的代码不起作用的真正原因。)
    • 在您的代码中,wb.application.displayalerts 给出与xls.displayalerts 相同的结果。有关Applicaion VS Workbook.Application 的详细信息,请参阅here。因此,尽管wb.application 在技术上是正确的,但在我看来它具有误导性(从一些建议使用 Application.Displayalerts insted 的评论中可以看出...)但是无论您使用哪个,请将代码移动到正确的位置,即 在创建对象本身之后。现在您的代码会产生错误。
    • 在这个特定的问题中,OP 创建了一个新的 Excel 实例(这是无用的并且是一个坏主意,但无论如何,他确实这样做了)。因此,您需要为新的 Excel 实例设置 DisplayAlerts 属性,如下所示:xls.DisplayAlerts = FalseSet xls = CreateObject("Excel.Application") 行的右侧之后,而不是之前。感谢您的耐心和开放!这很重要,因为您的答案在许多搜索的 Google 第一页上。 :)
    【解决方案2】:

    我建议在执行 SaveAs 之前,如果文件存在,请删除它。

    If Dir("f:ull\path\with\filename.xls") <> "" Then
        Kill "f:ull\path\with\filename.xls"
    End If
    

    这比关闭和打开 DisplayAlerts 更容易,而且如果 DisplayAlerts 由于代码崩溃而仍然关闭,如果您在同一会话中使用 Excel 可能会导致问题。

    【讨论】:

    • 请注意,如果文件在另一个进程中打开。它会抛出异常
    • C#版本:if (File.Exists(@"C:\test.txt")) { File.Delete(@"C:\test.txt"); }
    【解决方案3】:

    分裂意见分歧

    我更喜欢:

       xls.DisplayAlerts = False    
       wb.SaveAs fullFilePath, AccessMode:=xlExclusive, ConflictResolution:=xlLocalSessionChanges
       xls.DisplayAlerts = True
    

    【讨论】:

    • ConflictResolution 不是真/假属性docs.microsoft.com/en-us/office/vba/api/…
    • 用 CreateObject 创建的 xls。这是一个不同的 Excel 实例......所以 Application.DisplayAlerts 设置在 original 实例中,同时 wb 保存在第二个实例中。这个答案显示在第二个实例中设置 DisplayAlerts 应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多