如何使用 workbook.saveas 自动覆盖

在这部分代码中,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)

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

315546 次浏览

隐藏提示设置 xls.DisplayAlerts = False

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

注意 ,这与显示 Overwrite 提示符没有任何关系!

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)

我建议在执行 SaveAs 之前,删除存在的文件。

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

这比关闭和打开 DisplayAlerts 更容易,而且如果由于代码崩溃而使 DisplayAlerts 保持关闭状态,那么在同一个会话中使用 Excel 可能会导致问题。

使意见分歧

我更喜欢:

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

终于搞清楚了,上面的东西太让人困惑了。

    Sub SaveAndClose()
Dim wb1 As String
    

Application.Calculation = xlCalculationAutomatic
    

'this only works if the following equation is in C43 in sheet "data"
'=LEFT(MID(CELL("filename",C41),SEARCH("[",CELL("filename",C41))+1, SEARCH("]",CELL("filename",C41))-SEARCH("[",CELL("filename",C41))-1),75)
'the vba equation has double quotes everywhere that is how you use a formula in vba.
'vba code recreates this incase it gets deleted by accident.
    

ThisWorkbook.Sheets("Data").Range("C43").ClearContents
ThisWorkbook.Sheets("Data").Range("C43").Formula2R1C1 = _
"=LEFT(MID(CELL(""filename"",R[-2]C),SEARCH(""["",CELL(""filename"",R[-2]C))+1, SEARCH(""]"",CELL(""filename"",R[-2]C))-SEARCH(""["",CELL(""filename"",R[-2]C))-1),75)"
'https://techcommunity.microsoft.com/t5/excel/cell-reference-containing-file-name-changes-when-opening-second/m-p/2417030
    

wb1 = ThisWorkbook.Sheets("Data").Range("C43").Text
If ThisWorkbook.Name = wb1 Then
'MsgBox (wb1)
Workbooks(wb1).Close SaveChanges:=True
End If
    

End Sub

这将允许电子表格确定自己的名称,然后只有这样子才能运行的东西对该名称。这是因为当您有多个工作表运行重复的工作表,但使用不同的名称时,您不会意外地关闭错误的工作表。在我看来,这是 CYA 的巨大胜利。

这也将绕过覆盖消息,您可以让代码在另一个工作簿的后台自动运行,而您在不同的工作簿中工作,而不会受到影响。