遍历文件夹处理XLSX文件:删除工作表并保护工作簿问题及修复
批量处理Excel文件:删除指定工作表并设置工作簿保护
我需要编写宏完成以下操作:遍历指定文件夹内所有XLSX文件,删除名为“Summary Copying”和“Sum Totals”的工作表,同时设置工作簿保护。但最初的代码不仅无法完成删除操作,就算去掉删除逻辑,也无法对目标文件生效,运行后更改还没保存。
初始错误代码
Sub LoopThroughFilesFolder() Dim StrFile As String, wb As Workbook, ws As Worksheet StrFile = Dir("C:\Users\user\Documents\Destroy\*.xlsx*") Do While Len(StrFile) > 0 For Each ws In Worksheets If ws.Name = "Summary Copying" Or ws.Name = "Sum Totals" Then Application.DisplayAlerts = False ws.Delete Application.DisplayAlerts = True End If Next ProtectBookStructure ThisWorkbook, "password" StrFile = Dir Loop End Sub
错误原因分析
- 未打开目标文件夹中的文件:仅用
Dir获取文件名,但从未打开目标文件,所有操作都只在当前运行宏的工作簿(ThisWorkbook)上执行,完全没触及目标文件。 - 未保存更改:就算操作了正确文件,也没有保存步骤,导致修改丢失。
- 工作表遍历未指定工作簿:
For Each ws In Worksheets默认指向当前工作簿,而非目标文件的工作表。
修复后的代码
Sub LoopThroughFilesFolder() Dim myfile As String Dim wb As Workbook, ws As Worksheet Application.ScreenUpdating = False myfile = Dir("C:\Users\user\Documents\Destroy\*.xlsx*") Do While myfile <> "" Set wb = Workbooks.Open(fileName:=myfile) For Each ws In wb.Worksheets If ws.Name = "Summary Copying" Or ws.Name = "Sum Totals" Then Application.DisplayAlerts = False ws.Delete Application.DisplayAlerts = True End If Next ProtectBookStructure wb, "password" wb.Close savechanges:=True myfile = Dir Loop Application.ScreenUpdating = True End Sub
修复要点
- 用
Workbooks.Open打开目标文件,通过Set wb绑定到该工作簿,确保后续操作针对目标文件。 - 将
For Each ws In Worksheets改为For Each ws In wb.Worksheets,明确遍历目标工作簿的工作表。 - 操作完成后用
wb.Close savechanges:=True保存更改并关闭文件,确保修改生效。 - 加入
Application.ScreenUpdating = False/True,提升运行效率,避免界面闪烁。
内容的提问来源于stack exchange,提问作者ojmayo
相关产品推荐
相关产品推荐

