根据值隐藏和取消隐藏行

时间:2017-07-28 18:50:26

标签: excel vba excel-vba-mac

我正在尝试在Excel中创建一个调查,并希望根据他们的答案隐藏和取消隐藏行。例如,如果D3 =" no"隐藏行D4:D10,我想在整个过程中重复多次,但要隐藏的行数会发生变化。所以如果D3 ="是"不要忘了。然后移动回答D5,如果D5 ="否"隐藏行D6:D7。这种情况一直持续下去。

1 个答案:

答案 0 :(得分:0)

使用worksheet_change()事件。在VBE中双击将发生此更改(此单元格)的工作表。然后输入:

Private Sub Worksheet_Change(ByVal Target As Range)

    'Detect if the worksheet change was on cell D3
    If Not (Intersect(Target, Range("D3")) Is Nothing) Then
        'Hide rows if the value of D3 is "No"
        Range("D4:D10").EntireRow.Hidden = (Range("D3").Value = "No")
    End If
End Sub

每次在此工作表上发生更改时,此子例程将触发,测试是否在单元格中发生了更改" D2"然后根据值切换行的隐藏属性。

Hidden范围对象的EntireRow属性采用TrueFalse值,因此我们可以将其设置为等于条件语句的结果(Range("D3").value = "No")将返回TrueFalse,大大简化了您需要编写的代码量。

您只需添加更多If Not (Intersect(Target, Range("whatever")) Is Nothing) Then行来测试其他单元格,例如D5,并根据您在该单元格中测试的任何值隐藏相应的行。

如果代码太多(测试所有相交的代码),你可以像以下一样测试相交:

If Not (Intersect(Target, Union(Range("D3"), Range("D5"), Range("D8"))) Is Nothing) Then
    'And then in here your individual lines that toggle the hidden property:
    Range("D4:D10").EntireRow.Hidden = (Range("D3").Value = "No")

    Range("D6:D7").EntireRow.Hidden = (Range("D5").Value = "No")

    ...
End If

最后,由于此动作将在此工作表上进行任何更改时触发,因此您可能希望在子例程运行时关闭事件触发。因此,请在子程序顶部关闭enableEvents并在结束时将其重新打开:

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    If Not (Intersect(Target, Union(Range("D3"), Range("D5"), Range("D8"))) Is Nothing) Then            
        Range("D4:D10").EntireRow.Hidden = (Range("D3").Value = "No")    
        Range("D6:D7").EntireRow.Hidden = (Range("D5").Value = "No")
        Range("D9:D12").EntireRow.Hidden = (Range("D8").Value = "No")    
    End If

    Application.EnableEvents = True

End Sub

这样可以防止同一个子程序在忙于更改工作表时自动调用,从而导致无限循环并锁定excel(如果在解除工作簿之前没有保存工作簿,则会很糟糕)。