Excel 如果范围中的任何单元格符合条件,则尝试取消隐藏其他列

Excel 如果范围中的任何单元格符合条件,则尝试取消隐藏其他列,excel,if-statement,vba,Excel,If Statement,Vba,我的电子表格中有重复的行,用于手动验证数据。列“I”包含一个通过数据验证的下拉列表,有3个选项。我试图隐藏另一列“K”,除非从下拉列表中选择了选项“N/A”(罕见)的情况 Private Sub Worksheet_Change(ByVal Target As Range) If Columns("K").EntireColumn.Hidden = True Then If Target.Value = "N/A" Then Ac

我的电子表格中有重复的行,用于手动验证数据。列“I”包含一个通过数据验证的下拉列表,有3个选项。我试图隐藏另一列“K”,除非从下拉列表中选择了选项“N/A”(罕见)的情况

    Private Sub Worksheet_Change(ByVal Target As Range)
       If Columns("K").EntireColumn.Hidden = True Then
          If Target.Value = "N/A" Then
            Act3
          Else
           Act4
      End If
      Else
        Act4
      End If
    End Sub

 Sub Act3()
     Columns("K").EntireColumn.Hidden = False
 End Sub

 Sub Act4()
     Columns("K").EntireColumn.Hidden = True
 End Sub
我的代码可能有点粗糙,但当选择了正确的条件时,它至少会取消隐藏该列。我的问题是,如果给另一个单元格一个不需要额外列的选择,它会再次隐藏该列。我错过了什么?是否有一个函数允许以下内容:


'如果在范围内,则'

尝试添加我的AnyNA函数。它贯穿整个列以检查N/A,并且在找到任何N/A时不会隐藏

似乎你只想隐藏它,如果不是隐藏的,反之亦然,所以我为你做了优化。为了清晰起见,还删除了冗余的“=True”,并将子名称更改为“隐藏”和“取消隐藏”

Private Sub Worksheet_Change(ByVal Target As Range)
    If Columns("K").EntireColumn.Hidden And Target.Value = "N/A" Then
        Unhide
    ElseIf Not Columns("K").EntireColumn.Hidden And Not AnyNA Then
        Hide
    End If
End Sub

Private Function AnyNA() As Boolean
    For Row = 1 To Range("J" & Rows.Count).End(xlUp).Row
        If Range("J" & Row).Value = "N/A" Then
            AnyNA = True
            Exit Function
        End If
    Next
    AnyNA = False
End Function

Sub Unhide()
    Columns("K").EntireColumn.Hidden = False
End Sub

Sub Hide()
    Columns("K").EntireColumn.Hidden = True
End Sub

尝试添加我的AnyNA函数。它贯穿整个列以检查N/A,并且在找到任何N/A时不会隐藏

似乎你只想隐藏它,如果不是隐藏的,反之亦然,所以我为你做了优化。为了清晰起见,还删除了冗余的“=True”,并将子名称更改为“隐藏”和“取消隐藏”

Private Sub Worksheet_Change(ByVal Target As Range)
    If Columns("K").EntireColumn.Hidden And Target.Value = "N/A" Then
        Unhide
    ElseIf Not Columns("K").EntireColumn.Hidden And Not AnyNA Then
        Hide
    End If
End Sub

Private Function AnyNA() As Boolean
    For Row = 1 To Range("J" & Rows.Count).End(xlUp).Row
        If Range("J" & Row).Value = "N/A" Then
            AnyNA = True
            Exit Function
        End If
    Next
    AnyNA = False
End Function

Sub Unhide()
    Columns("K").EntireColumn.Hidden = False
End Sub

Sub Hide()
    Columns("K").EntireColumn.Hidden = True
End Sub

在@Sean Scott的帮助下,我找到了解决方案:

    Sub Worksheet_Change(ByVal Target As Range)
      If Columns("K").EntireColumn.Hidden Then
         If Target.Value = "N/A" Then
            UnhideDocs
         End If
      ElseIf Not Columns("K").EntireColumn.Hidden And Not Target.Value = "N/A" Then
         HideDocs
      End If
  End Sub

 Function AnyNA() As Boolean
   For Row = 1 To Range("K" & Rows.Count).End(xlUp).Row
    If Range("K" & Row).Value = "N/A" Then
        AnyNA = True
    End If
   Next
    AnyNA = False
 End Function


  Sub UnhideDocs()
     Columns("K").EntireColumn.Hidden = False
  End Sub

  Sub HideDocs()
     Columns("K").EntireColumn.Hidden = True
  End Sub

在@Sean Scott的帮助下,我找到了解决方案:

    Sub Worksheet_Change(ByVal Target As Range)
      If Columns("K").EntireColumn.Hidden Then
         If Target.Value = "N/A" Then
            UnhideDocs
         End If
      ElseIf Not Columns("K").EntireColumn.Hidden And Not Target.Value = "N/A" Then
         HideDocs
      End If
  End Sub

 Function AnyNA() As Boolean
   For Row = 1 To Range("K" & Rows.Count).End(xlUp).Row
    If Range("K" & Row).Value = "N/A" Then
        AnyNA = True
    End If
   Next
    AnyNA = False
 End Function


  Sub UnhideDocs()
     Columns("K").EntireColumn.Hidden = False
  End Sub

  Sub HideDocs()
     Columns("K").EntireColumn.Hidden = True
  End Sub

您指的是文本常量
N/a
还是工作表错误
#N/a
?哪些单元格范围应更改列的可见性?列I中的任何内容或列I中的特定单元格?您可能希望尝试
如果IsError(目标)那么
而不是您拥有的内容。或者尝试
如果Target.Value=“#N/A”,则在数据验证下拉框中实际选择“N/A”。K4:K54是提供下拉列表的单元格。整个专栏我应该是可见的@Jeepad您指的是文本常量
N/a
还是工作表错误
#N/a
?哪些单元格范围应更改列的可见性?列I中的任何内容或列I中的特定单元格?您可能希望尝试
如果IsError(目标)那么
而不是您拥有的内容。或者尝试
如果Target.Value=“#N/A”,则在数据验证下拉框中实际选择“N/A”。K4:K54是提供下拉列表的单元格。整个专栏我应该是可见的@JeepedI可以遵循这里的逻辑,但是我在语法方面遇到了问题。我是VBA新手,所以这可能很简单。我在'Unhide()''Hide()'和'Private Function AnyNA()As Boolean'上遇到语法错误@Sean ScottN/m我通过将()从调用行中移除并更正端到端函数来更正此错误。现在,当在列“I”中选择“N/A”时,它正确地取消隐藏该列,但当我转到下一行时,无论我选择什么,它都会再次隐藏列“K”。我想是这样的。现在它正确地取消隐藏,但如果单元格调整为远离“N/A”,则不会重新隐藏。我修复了我的答案。我在AnyNA中也使用了不正确的语法。因为我没有调用Exit函数,所以它总是返回False。我还忘了将选中的列切换到“J”。现在试试,我可以按照这里的逻辑来做,但是语法有问题。我是VBA新手,所以这可能很简单。我在'Unhide()''Hide()'和'Private Function AnyNA()As Boolean'上遇到语法错误@Sean ScottN/m我通过将()从调用行中移除并更正端到端函数来更正此错误。现在,当在列“I”中选择“N/A”时,它正确地取消隐藏该列,但当我转到下一行时,无论我选择什么,它都会再次隐藏列“K”。我想是这样的。现在它正确地取消隐藏,但如果单元格调整为远离“N/A”,则不会重新隐藏。我修复了我的答案。我在AnyNA中也使用了不正确的语法。因为我没有调用Exit函数,所以它总是返回False。我还忘了将选中的列切换到“J”。现在试试