基于单元格值与MsgBox实现空白行隐藏/取消隐藏的问题排查
问题分析与代码修正
你的代码列操作正常,但行操作无效,核心问题有以下几点:
- 消息框触发时机错误:当前代码每次单元格变化都会弹出消息框,应该仅在目标单元格(B5:B6)变化时才触发。
- 「是」按钮的行操作逻辑错误:循环结束后
i的值为33,此时Cells(i,1)指向第33行,并非你需要操作的13-32行范围。 - 行隐藏逻辑与「是」按钮操作的关联缺失:现有逻辑未将新入职的行显示需求和按钮操作对应起来。
修正后的代码
Private Sub Worksheet_Change(ByVal Target As Range) Dim HowMany As Long Dim rng As Range Dim i As Integer Dim Ans As VbMsgBoxResult ' 仅处理单个单元格变化且目标在B5:B6范围内的情况 If Target.CountLarge > 1 Then Exit Sub If Intersect(Target, Range("B5:B6")) Is Nothing Then Exit Sub ' 仅在目标单元格符合条件时弹出消息框 Ans = MsgBox("New Joining", vbQuestion + vbYesNo + vbDefaultButton2, "ATTENDANCE SHEET") ' 列操作逻辑(保留原有效代码) Range("D11:AH11").EntireColumn.Hidden = False ' 初始显示所有31列 HowMany = CInt(Range("B9").Text) ' 获取当月天数 If HowMany <> 31 Then Set rng = Cells(11, HowMany + 3).Offset(, 1).Resize(, 31 - HowMany) rng.EntireColumn.Hidden = True End If Range("D13:AH32").ClearContents ' 当B6变化时,根据A列内容隐藏/显示行 If Target.Address = Range("B6").Address Then For i = 13 To 32 Cells(i, 1).EntireRow.Hidden = (Cells(i, 1).Value = "") Next i End If ' 点击「是」按钮时,取消隐藏13-32行的所有行 If Ans = vbYes Then Range("13:32").EntireRow.Hidden = False End If End Sub
关键修改说明
- 调整消息框位置:将
MsgBox移到Target合法性判断之后,避免无关操作触发弹窗。 - 修复行操作逻辑:点击「是」时直接操作
Range("13:32"),取消该范围内所有行的隐藏状态,替代原来错误的Cells(i,1)。 - 简化行隐藏判断:将原有的If-Else简化为
Cells(i, 1).EntireRow.Hidden = (Cells(i, 1).Value = ""),逻辑更简洁。 - 优化列操作逻辑:增加
HowMany <> 31的判断,避免不必要的变量赋值和范围设置。
内容的提问来源于stack exchange,提问作者Kalim Shaikh
相关产品推荐
相关产品推荐

