我正在使用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循环中做到这一点,以使代码更清洁?我最终会把这个传递给另一个人继续工作,我想确保给他们留下最有效的方法。
答案 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
如果您的嵌套深入,但您可能需要考虑使用隐藏工作表来存储所有关系,并为每次更改循环整个事物。