VBA-根据单元格值取消隐藏行

时间:2019-03-25 09:00:16

标签: excel vba

我在下面的代码中找不到问题,但是它不起作用,因此必须有任何问题。该代码应类似于:

  1. 如果D18 =“否”,则取消隐藏第20行
  2. 如果D18 =其他,则隐藏第20行

代码是:

Private Sub Worksheet_Change2(ByVal Target As Range)
Dim Rng1 As Range

With Worksheets("Dashboard")

Set Rng1 = ("D18")

If Rng1.Value = "No" Then Sheet.Rows("20:20").EntireRow.Hidden = False
Else: Sheet.Rows("20:20").EntireRow.Hidden = True
End If

End With

End Sub

它什么都不做,请您帮忙查找问题吗?

非常感谢!

3 个答案:

答案 0 :(得分:3)

这里有很多问题

  • Worksheet_Change2不是工作表事件
  • 没有意义的方块
  • Set Rng1 = ("D18")语法无效
  • 区分大小写的测试
  • 无效的行引用
  • 无效的Sheet参考
  • 代码在所有更改上运行

您的代码,经过重构

确保将其放在所需工作表后面的代码中

Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Application.Intersect(Target, Me.Range("D18")) Is Nothing Then
       If LCase(Me.Range("D18").Value = "no" Then
           Me.Rows(20).EntireRow.Hidden = False
       Else
           Me.Rows(20).EntireRow.Hidden = True
       End If
   End If
End Sub

答案 1 :(得分:2)

您对范围变量的分配无效(甚至不会编译),并且If语句的语法也无效。

With Worksheets("Dashboard")
    Set Rng1 = .Range("D18")

    If Rng1.Value = "No" Then
        .Rows("20:20").EntireRow.Hidden = False
    Else
        Sheet.Rows("20:20").EntireRow.Hidden = True
    End If
end with

但是,我会将代码压缩为

With Worksheets("Dashboard")
    Set Rng1 = .Range("D18")
    .Rows("20:20").EntireRow.Hidden = (Rng1.Value <> "No")
End With

我想知道子程序的名称。它看起来像是事件例程的副本(事件例程为Worksheet_Change,而没有尾随2)。您什么时候要调用例程?如果您希望每次在工作表中进行某些更改时都执行它,请摆脱多余的2-但是在这种情况下,您可能只对单元格D18发生更改的情况感兴趣:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("D18")) Is Nothing Then Exit Sub
     With Worksheets("Dashboard")
        .Rows("20:20").EntireRow.Hidden = (Target.Value <> "No")
    end with
End Sub

答案 2 :(得分:1)

子名称应为Worksheet_Change以触发更改事件。该子可以重写如下

Private Sub Worksheet_Change(ByVal Target As Range)
'Dim Rng1 As Range
Set Target= Range("D18")
With Worksheets("Dashboard")
    If Target.Value = "No" Then
        .Rows("20:20").EntireRow.Hidden = False
    Else
        .Rows("20:20").EntireRow.Hidden = True
    End If
End With

End sub

由于您正在使用工作表(“仪表板”),因此可以将工作表。行改写为.rows。