我正在尝试在Excel中创建一个调查,并希望根据他们的答案隐藏和取消隐藏行。例如,如果D3 =" no"隐藏行D4:D10,我想在整个过程中重复多次,但要隐藏的行数会发生变化。所以如果D3 ="是"不要忘了。然后移动回答D5,如果D5 ="否"隐藏行D6:D7。这种情况一直持续下去。
答案 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
属性采用True
或False
值,因此我们可以将其设置为等于条件语句的结果(Range("D3").value = "No")
将返回True
或False
,大大简化了您需要编写的代码量。
您只需添加更多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(如果在解除工作簿之前没有保存工作簿,则会很糟糕)。