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

这个让我很生气,希望你们中的一个能告诉我我做错了什么。

我想要做的就是如果列I中的任何单元格包含值“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 

基本上,代码完全没有。 这让我更难过,因为我不知道我做错了什么。

试试以下…

 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 

这是有用的东西:

 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 
  • 为了确保它能正常工作,请将代码放在相应的表单中,而不是放在模块中
  • 确保macros已启用

首先,如果您的工作簿中有一个单元格用于testing列I是否有任何Y ,则可以保持此VBA非常简单。 我把下面的单元格A1

 =COUNTIF(I:I,"Y") 

我build议把这个放在工作表上,因为Excel很聪明,并且比VBA更快地执行这个计算 – 它也让你看到发生了什么。

我们现在可以使用A1的值来决定是否隐藏macrosJ中的J列


首先,当打开工作簿时,testing列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 

注意:此代码不是为一次更改多个单元格的用户devise的,如果您打算如上所述使用它,则这不应该成为问题。 如果您希望一次粘贴多个单元格(例如),则需要稍微修改。

 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