终于搞定了,之前的东西都太混乱了。
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
这将允许电子表格确定自己的名称,然后才能对该名称运行某些操作。这样,当您有多个运行重复表但具有不同名称的工作表时,您不会意外关闭错误的工作表。在我的书中,这是一个巨大的胜利。
这也将绕过覆盖消息,您可以在另一个工作簿中自动在后台运行代码,而您在不同的工作簿中工作时不会受到影响。
DisplayAlerts=False
这一行应当在设置了 Workbook 对象之后。然而,你也可以通过使用Application.DisplayAlerts
来全局设置它。并且,在阻止弹出警告结束后,你可能应该将其改回 True。 - Kevin Popewb.application.displayalerts
和xls.displayalerts
会得到相同的结果。有关Application
和Workbook.Application
的详细信息,请参见此处。因此,尽管wb.application
在技术上是正确的,但在我看来这是具有误导性的(正如一些评论者建议使用Application.Displayalerts
一样...)。但无论你使用哪种方式,请将代码移动到正确的位置,即在创建对象本身之后。现在你的代码会产生一个错误。 - vacipSet xls = CreateObject("Excel.Application")
这一行之后立即写入xls.DisplayAlerts = False
,而不是在之前。感谢您的耐心和开放!这很重要,因为您的答案在许多搜索的第一页上。 :) - vacip