VBA:根据对问题的是/否响应触发隐藏的行

时间:2017-12-20 18:35:05

标签: excel vba excel-vba

我正在使用excel创建调查问卷,我需要对这个调查问卷进行编程,如果一个人在某个问题上回答“是”,则会触发子问题。这些子问题是隐藏的行,只有在该特定情况下用户回答“是”时才会出现。我有一个解决方案,但是一个非常繁琐的解决方案需要对每个单元进行编程

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$10" Then
    If Target.Value <> "Yes" Then Rows("5").EntireRow.Hidden = True
    If Target.Value = "Yes" Then Rows("5").EntireRow.Hidden = False
End If

我希望使用for循环遍历每个部分,如果答案为Yes,则触发行显示以下代码

For Each cell In Worksheets("Sheet").Range("C21:C32")
    If cell.Value = "Yes" Then
       'code here to show additional rows
        Rows("22").EntireRow.Hidden = False
        Rows("23").EntireRow.Hidden = False
    End If
Next cell

我的问题是不同的“是”响应需要触发不同的行,例如,如果第9行是“是”触发行10和11,并且在此之后如果10是肯定触发另一行子问题。我可以轻松地使用Worksheet_Change方法为每个cel修改它,但这非常繁琐。我有什么方法可以在for循环中做到这一点,以使代码更清洁?我最终会把这个传递给另一个人继续工作,我想确保给他们留下最有效的方法。

2 个答案:

答案 0 :(得分:0)

我想你可能只想使用OFFSET()

For Each cell In Worksheets("CAP - Assessment").Range("C21:C32")
    If cell.Value = "Yes" Then
       'code here to show additional rows
        cell.Offset(1,0).EntireRow.Hidden = False
        cell.Offset(2,0).EntireRow.Hidden = False
    End If
Next cell

答案 1 :(得分:0)

这是一个想法:给你的“控制器”单元格命名,例如(例如)“YES_10_11”。 在更改事件中检查目标范围是否具有名称,然后解析比较值和要显示/隐藏的行并应用测试。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim arr, rName, i, doHide As Boolean
    If Target.Cells.CountLarge > 1 Then Exit Sub

    On Error Resume Next
    rName = Target.Name.Name  ' e.g. YES_10_11
    On Error GoTo 0

    If Len(rName) > 0 Then
        arr = Split(rName, "_")
        doHide = (UCase(arr(0)) <> UCase(Target.Value))
        For i = 1 To UBound(arr)
            Me.Rows(arr(i)).Hidden = doHide
        Next i
    End If

End Sub

如果您的嵌套深入,但您可能需要考虑使用隐藏工作表来存储所有关系,并为每次更改循环整个事物。

相关问题