VBA范围在1列中查找显示/隐藏另一列

时间:2016-11-25 15:38:57

标签: excel vba find range

这个让我发疯,所以希望你们其中一个能告诉我自己做错了什么。

我想要做的就是如果第一列中的任何单元格包含值" Y"然后列J被隐藏。如果您随后从任何单元格中删除Y,则再次显示J列。

这是我的代码:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng As Range
Set rng = Range("I:I")
Set cell = rng.Find(What:="Y")
If cell Is Nothing Then
        Columns("J").EntireColumn.Hidden = True
    Else
        Columns("J").EntireColumn.Hidden = False
    End If
End Sub

基本上代码绝对没有。这比惹恼我更让我烦恼,因为我不知道自己做错了什么。

4 个答案:

答案 0 :(得分:0)

尝试以下方法......

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range

Columns("I:I").Select
Set cell = Selection.Find(What:="Y", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

If cell Is Nothing Then
    Columns("J").EntireColumn.Hidden = False
Else
    Columns("J").EntireColumn.Hidden = True
End If
End Sub

答案 1 :(得分:0)

这是可行的:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim c       As Range

    If Target.Column = 9 Then
        With Range("I:I")
            Set c = .Find("Y")
            If Not c Is Nothing Then
                Columns("J").EntireColumn.Hidden = True
            Else
                Columns("J").EntireColumn.Hidden = False
            End If
        End With
    End If

End Sub
  • 为了确保它有效,请将代码放在相应的工作表中,而不是模块中
  • 确保已启用宏

答案 2 :(得分:0)

首先,如果您的工作簿中有一个单元格来测试列Y中是否有I,则可以使此VBA非常简单。我将以下内容放入单元格A1

=COUNTIF(I:I,"Y")

我建议将其放在工作表上,因为Excel很聪明,并且比VBA更快地执行此计算 - 它还可以让您了解正在进行的操作。

我们现在可以使用A1的值来确定是否隐藏宏

中的列J.

<小时/> 首先,当您打开工作簿时,测试列J是否处于正确状态可能是个好主意,因此请将以下代码放入ThisWorkbook模块中。 此代码是可选的

Sub Workbook_Open()
    With Me.Worksheets("Sheet1")
        If .Range("A1").Value > 0 Then
            .Range("J:J").EntireColumn.Hidden = True
        Else:
            .Range("J:J").EntireColumn.Hidden = False
        End If
    End With
End Sub

然后,要监控列I中对值的任何更改,请将以下代码放入工作表模块中

Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("I:I")) Is Nothing Then
        If Me.Range("A1") > 0 Then
            Me.Range("J:J").EntireColumn.Hidden = True
        Else
            Me.Range("J:J").EntireColumn.Hidden = False
        End If
    End If
End Sub

注意:此代码不是为用户一次更改多个单元格而设计的,如果您打算按照描述使用它,这不应该是一个问题。如果您希望一次粘贴多个单元格(例如),则需要稍微调整一下。

答案 3 :(得分:0)

Private Sub Worksheet_Change(ByVal Target As Range)
    Columns("J").EntireColumn.Hidden = WorksheetFunction.CountIf(Columns("I"),"Y") >0
End Sub

或者

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Columns("I")) Is Nothing Then Columns("J").EntireColumn.Hidden = WorksheetFunction.CountIf(Columns("I"),"Y") >0
End Sub