VBA技术需求:关闭除指定工作簿外的所有文件(现有代码异常)
关闭除指定多个工作簿外的所有工作簿
我来帮你搞定这个问题!你的代码之所以会误关Book2,核心原因是大小写和文件后缀不匹配:
你用Ucase(wb.name)把工作簿名转成了大写,但Case语句里写的是"BOOK2.XLS",而从你调试输出的Book2.xlsx能看出来,实际工作簿的后缀是.xlsx,转大写后是BOOK2.XLSX,和BOOK2.XLS完全对不上,所以Book2被归到Case Else里执行关闭操作了。
正确的VBA实现方案
下面两种写法都能完美解决你的需求,你可以选自己习惯的:
方案一:用数组匹配(更灵活,方便修改保留列表)
这种方式适合需要经常调整保留工作簿的场景,添加或删除只需修改数组内容:
Sub CloseAllExceptSpecified() Dim wb As Workbook Dim keepWorkbooks As Variant ' 这里填写你要保留的工作簿名称,记得带上正确的后缀(.xlsx/.xls等) keepWorkbooks = Array("Book1.xlsx", "Book2.xlsx", ThisWorkbook.Name) ' 遍历所有打开的工作簿 For Each wb In Workbooks ' 统一转大写,避免大小写差异导致的匹配失败 If IsError(Application.Match(UCase(wb.Name), UCase(keepWorkbooks), 0)) Then ' 不在保留列表里就关闭,SaveChanges:=True表示自动保存,按需改成False wb.Close SaveChanges:=True End If Next wb End Sub
方案二:修正你的Select Case写法
如果你更习惯用Select Case,只需要把Case里的文件名改成和实际一致的大写后缀就行:
Sub CloseAllExceptSpecified_SelectCase() Dim wb As Workbook For Each wb In Workbooks Select Case UCase(wb.Name) ' 确保这里的文件名(含后缀)和实际工作簿转大写后完全一致 Case "BOOK1.XLSX", "BOOK2.XLSX", UCase(ThisWorkbook.Name) ' 保留该工作簿,什么都不用做 Case Else wb.Close SaveChanges:=True End Select Next wb End Sub
额外提示
- 如果你不确定工作簿的准确名称,可以在即时窗口用
Debug.Print UCase(wb.Name)输出所有工作簿的大写名称,直接复制到代码里就不会出错了; ThisWorkbook.Name会自动包含当前运行代码的工作簿,避免误关代码所在的文件。
内容的提问来源于stack exchange,提问作者TurboCoder
相关产品推荐
相关产品推荐

