Excel VBA 全工作表公式隐藏及保护代码仅对部分表生效问题求助
你代码无法处理全部工作表的核心问题是:当遍历过程中遇到任意一张没有公式的工作表时,你写的If R Is Nothing Then Exit Sub会直接终止整个程序,后续的工作表都不会被处理。
以下是修复后的完整可运行代码:
Option Explicit Private Function SpecialCells(ByVal R As Range, ByVal Typ As XlCellType, _ Optional ByVal Value As XlSpecialCellsValue = &H17) As Range '规避SpecialCells返回当前区域全部单元格的bug On Error Resume Next Select Case Typ Case xlCellTypeConstants, xlCellTypeFormulas Set SpecialCells = Intersect(R, R.SpecialCells(Typ, Value)) Case Else Set SpecialCells = Intersect(R, R.SpecialCells(Typ)) End Select End Function Sub protect_all_sheets() Dim pass As String, repass As String Dim i As Integer Dim s As Worksheet Dim R As Range '密码校验 top: pass = InputBox("请输入保护密码") repass = InputBox("请再次确认密码") If pass <> repass Then MsgBox "两次输入密码不一致,请重新输入" GoTo top End If '检查是否存在已保护的工作表 For i = 1 To Worksheets.Count If Worksheets(i).ProtectContents = True Then MsgBox "检测到存在已保护的工作表,请先取消所有工作表的保护后再运行宏" Exit Sub End If Next '遍历处理所有工作表 For Each s In ActiveWorkbook.Worksheets s.Unprotect Password:=pass '重置UsedRange避免缓存导致识别错误 s.UsedRange s.UsedRange.FormulaHidden = False Set R = SpecialCells(s.UsedRange, xlCellTypeFormulas) '仅当存在公式单元格时执行锁定隐藏,无公式则跳过继续处理下一张 If Not R Is Nothing Then R.FormulaHidden = True R.Locked = True End If s.Protect Password:=pass Next MsgBox "所有工作表保护及公式隐藏操作已完成" End Sub
主要修改说明:
- 移除了碰到无公式工作表就退出程序的逻辑,改为仅跳过当前无公式的工作表,继续处理后续工作表
- 新增强制变量声明语句,避免隐性变量错误
- 增加了UsedRange重置逻辑,避免VBA缓存的已用区域和实际不符导致公式识别不全
- 调整了提示文本为中文,使用更友好的操作提示
- 优化了已保护工作表的判断逻辑,避免不必要的跳转
内容的提问来源于stack exchange,提问作者Mayur
相关产品推荐
相关产品推荐

