Leave tracker列隐藏VBA代码异常:更新工作表时全列被隐藏求助
解决Leave Tracker列隐藏功能的误触发问题
我一眼就看出问题所在了——你的代码在任何工作表变更事件触发时,都会先把D:NK列全部隐藏,只有当变更的是B3单元格时,才会再显示对应列。但如果是修改其他单元格(比如输入请假记录),就只会执行隐藏所有列的操作,这就是为啥每次更新工作表列都被藏起来的原因。
咱们来调整代码逻辑,只在B3单元格被修改时才执行列的显示/隐藏操作,同时加上事件禁用避免递归触发:
Private Sub Worksheet_Change(ByVal Target As Range) ' 只处理B3单元格的变更,其他操作直接退出 If Intersect(Target, Range("B3")) Is Nothing Then Exit Sub Dim allColumns As Range Set allColumns = Columns("D:NK") ' 禁用事件,防止列隐藏操作再次触发Change事件导致递归 Application.EnableEvents = False ' 先统一隐藏所有目标列 allColumns.Hidden = True ' 根据B3的值显示对应列 Select Case Target.Value Case "1" Columns("D:AH").Hidden = False Case "2" Columns("AI:BM").Hidden = False ' 后续需要新增选项的话,直接在这里加Case "3"之类的判断即可 End Select ' 重新启用事件,保证后续正常触发变更事件 Application.EnableEvents = True End Sub
代码改进说明:
- 开头加了判断逻辑:如果变更的不是B3单元格,直接退出子程序,避免无关操作误触发列隐藏
- 新增
Application.EnableEvents控制:因为修改列的隐藏状态本身也会触发Worksheet_Change事件,不加这个会导致代码递归执行,甚至出现报错 - 用
Select Case替代原有的If-ElseIf,后续如果要添加更多值的对应列显示逻辑,维护起来更方便 - 只有当B3被修改时才执行列的显示/隐藏操作,其他工作表操作(比如填写请假数据)不会再影响列的状态
这样调整后,只有当你修改B3单元格的值时,才会触发列的显示/隐藏,其他操作就不会再误隐藏所有列了。
内容的提问来源于stack exchange,提问作者user9686834
相关产品推荐
相关产品推荐

