You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于单元格值与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:43:28