用Excel 2013隐藏行

所以我试图使用基于几种不同的条件的VBA在Excel 2013中隐藏行:

  • 如果标题的部分是“未使用”隐藏部分。 每个部分是一个命名的范围,使这更容易。
  • 如果行是“Cblank”命名范围的一部分,则将其隐藏。
  • 现在对于困难的部分 – 对于范围内的每个单元格(“CNonTest”)如果C.Value =“”和C.Columns(41).Value =“”然后隐藏它们。

范围(“CNonTest”)在Col C中应该检查的额外列是Col AQ。

为了增加难度,我需要这个macros每次运行8个不同的validation框中的任何一个。

以下是我目前的代码:

Sub CompHide() With Sheets("Comparison").Cells .EntireRow.Hidden = False If Range("C9").Value = "Unused" Then Range("CMarket1").EntireRow.Hidden = True End If If Range("C115").Value = "Unused" Then Range("CMarket2").EntireRow.Hidden = True End If If Range("C221").Value = "Unused" Then Range("CMarket3").EntireRow.Hidden = True End If If Range("C329").Value = "Unused" Then Range("CMarket4").EntireRow.Hidden = True End If If Range("C437").Value = "Unused" Then Range("CMarket5").EntireRow.Hidden = True End If If Range("C545").Value = "Unused" Then Range("CMarket6").EntireRow.Hidden = True End If If Range("C653").Value = "Unused" Then Range("CMarket7").EntireRow.Hidden = True End If If Range("C761").Value = "Unused" Then Range("CMarket8").EntireRow.Hidden = True End If If Range("C869").Value = "Unused" Then Range("CMarket9").EntireRow.Hidden = True End If If Range("C977").Value = "Unused" Then Range("CMarket10").EntireRow.Hidden = True End If For Each C In Range("CNonTest") If C.Value = "" And C.Columns(41).Value = "" Then C.EntireRow.Hidden = True End If Next Range("CBlank").EntireRow.Hidden = True End With End Sub 

然后在工作表上我有这样的代码:

  Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Me.Range("A4")) Is Nothing _ Or _ Intersect(Target, Me.Range("D4")) Is Nothing _ Or _ Intersect(Target, Me.Range("G4")) Is Nothing _ Or _ Intersect(Target, Me.Range("K4")) Is Nothing _ Or _ Intersect(Target, Me.Range("AO4")) Is Nothing _ Or _ Intersect(Target, Me.Range("AR4")) Is Nothing _ Or _ Intersect(Target, Me.Range("AU4")) Is Nothing _ Or _ Intersect(Target, Me.Range("AY4")) Is Nothing _ Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True End Sub 

对于表单代码,我也试过这个无济于事

 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Me.Range("A4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True If Intersect(Target, Me.Range("D4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True If Intersect(Target, Me.Range("G4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True If Intersect(Target, Me.Range("K4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True If Intersect(Target, Me.Range("AO4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True If Intersect(Target, Me.Range("AR4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True If Intersect(Target, Me.Range("AU4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True If Intersect(Target, Me.Range("AY4")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False Call CompHide Application.ScreenUpdating = True Application.EnableEvents = True End Sub 

这段代码似乎都工作正常,当我通过使用F8 CompHide一步它完美的作品。 所以我想这个问题是来自工作表本身的代码。 你会看到在那个代码中的评论,提到防止无休止的循环,这个评论来自一些手下来的代码不是很确定它是什么,但基于评论我想离开它。

当我更改validation框时,不再隐藏所有正确的东西,只有其中的一些。 幸运的是,我还没有看到它隐藏了一些它还没有设想的东西。 我不再说了,因为起初这个代码只看第一个validation框,但现在看起来都是8。

对事件处理程序的一些调整:

 Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range On Error GoTo haveError Set rng = Application.Intersect(Target, Me.Range("A4,D4,G4,K4,AO4,AR4,AU4,AY4")) If Not rng Is Nothing Then Application.EnableEvents = False 'to prevent endless loop Application.ScreenUpdating = False CompHide Application.EnableEvents = True End If Exit Sub haveError: 'always re-enable events ' (screenupdating setting is not persistent)... Application.EnableEvents = True End Sub 

另一部分:

 Sub CompHide() Dim sht As Worksheet, C As Range Set sht = Sheets("Comparison") sht.Rows.Hidden = False SetRowVis "C9", "CMarket1" SetRowVis "C115", "CMarket2" '...and the rest For Each C In sht.Range("CNonTest") If C.Value = "" And C.EntireRow.Columns(43).Value = "" Then C.EntireRow.Hidden = True End If Next sht.Range("CBlank").EntireRow.Hidden = True End Sub 'utility sub... Sub SetRowVis(addr As String, rngName As String) With Sheets("Comparison") If .Range(addr).Value = "Unused" Then .Range(rngName).EntireRow.Hidden = True End If End With End Sub 

第一,你有你的CompHide子引用问题。
您需要将所有的Range对象调用完全引用到工作表中。

 With Sheets("Comparison") .Cells.EntireRow.Hidden = False 'Notice the dot in front of the Range object If .Range("C9").Value = "Unused" Then .Range("CMarket1").EntireRow.Hidden = True 'Also notice that I used a one liner IF which I think is applicable for you 'Rest of your code go here '. '. '. End With 

第二,看看Tim的post。 他击败了我。 🙂