【问题标题】:If statement with two target address with multiple outcomesIf 语句有两个目标地址和多个结果
【发布时间】:2022-07-29 14:51:58
【问题描述】:

我正在尝试构建一个代码,其中取决于用户输入,它会隐藏某些行。例如,如果用户选择“是”,它将显示某些行并隐藏其他行。当用户选择答案“否”时也是如此。我成功地创建了这个代码。但是,我有类似的情况,但是有两个变量的答案是“是”和“否”。这将产生 4 种可能的结果。我遇到了修改B6和B7中的变量时代码不会执行的问题。

我在下面包含了我的行代码。有人可以就如何解决这个问题给我一些建议吗?

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "B6:B7" Then
        If Range("B6").Value = "Yes" And Range("B7").Value = "Yes" Then
            Rows("12:38").EntireRow.Hidden = False
            Rows("39:57").EntireRow.Hidden = True
        ElseIf Range("B6").Value = "No" And Range("B7").Value = "Yes" Then
            Rows("12:38").EntireRow.Hidden = True
            Rows("39:57").EntireRow.Hidden = False
        ElseIf Range("B6").Value = "Yes" And Range("B7").Value = "No" Then
            Rows("12:38").EntireRow.Hidden = True
            Rows("39:57").EntireRow.Hidden = False
        ElseIf Range("B6").Value = "No" And Range("B7").Value = "No" Then
            Rows("11:38").EntireRow.Hidden = True
            Rows("39:57").EntireRow.Hidden = False
        End If
    End If
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您可以使用Application.Intersect 检查是否有任何修改过的单元格在 B6 或 B7 中。

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim intersection As Range
        Set intersection = Application.Intersect(Range("B6:B7"), Target)
        If Not intersection Is Nothing Then
            If Range("B6").Value = "Yes" And Range("B7").Value = "Yes" Then
                Rows("12:38").EntireRow.Hidden = False
                Rows("39:57").EntireRow.Hidden = True
            ElseIf Range("B6").Value = "No" And Range("B7").Value = "Yes" Then
                Rows("12:38").EntireRow.Hidden = True
                Rows("39:57").EntireRow.Hidden = False
            ElseIf Range("B6").Value = "Yes" And Range("B7").Value = "No" Then
                Rows("12:38").EntireRow.Hidden = True
                Rows("39:57").EntireRow.Hidden = False
            ElseIf Range("B6").Value = "No" And Range("B7").Value = "No" Then
                Rows("11:38").EntireRow.Hidden = True
                Rows("39:57").EntireRow.Hidden = False
            End If
        End If
    End Sub
    

    【讨论】:

      【解决方案2】:

      只有当修改的范围正好是B6:B7时,您的代码才会执行​​。

      在这些事件中使用Intersect 总是一个好主意,因为您不知道传入的是什么。将关注点分开以提高可读性也是一个好主意。事件实际上应该只是对某事做出反应,然后将工作交给其他事情。

      Private Sub Worksheet_Change(ByVal Target As Range)
          If Not Intersect(Target, Range("B6:B7")) Is Nothing Then SomeModule.ArrangeColumns
      End Sub
      
      'SomeModule
      Sub ArrangeColumns()
          Dim b6 As Boolean: b6 = Range("B6").Value = "Yes"
          Dim b7 As Boolean: b7 = Range("B7").Value = "Yes"
      
      '   Section 1 starts at row 11 or 12 if No, No.
          Dim sect1 As Range
          Set sect1 = Iif(not (b6 or b7), Rows("11:38"), Rows("12:38"))
      
          Dim sect2 As Range
          Set sect2 = Rows("39:57")
      
      '   Toggle the section Hidden property based on input.
          sect1.Hidden = Not (b6 And b7)
          sect2.Hidden = b6 And b7
      End Sub
      

      请注意,如果您从 No Yes 或 Yes No 变为 No No,则第 11 行仍会被隐藏(不确定是否有意这样做)。

      【讨论】:

        猜你喜欢
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-04
        • 2012-05-19
        • 2019-04-03
        相关资源
        最近更新 更多