使用Excel 2013隐藏行

乍得·波特曼

因此,我尝试使用基于VBA的几种不同条件在Excel 2013中隐藏行:

  • 如果该部分的标题为“未使用”,则隐藏该部分。每个部分都是一个命名范围,以使此操作更容易。
  • 如果行是“ Cblank”命名范围的一部分,则将其隐藏。
  • 现在开始进行困难的部分-如果C.Value =“”和C.Columns(41).Value =“”对于Range(“ CNonTest”)中的每个单元格,则将它们隐藏。

Range(“ CNonTest”)在Col C中,应检查的额外列是Col AQ。

为了增加难度,我需要每次在8个不同的验证框中的任何1个发生更改时都运行此宏。

以下是我目前拥有的代码:

    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时,它可以完美运行。所以我认为问题出在表本身的代码上。您会在该代码中看到一条注释,该注释提到要防止无休止的循环,该注释来自某些使我不满意的代码,但我不太清楚它的用途,但根据注释我会留意。

当我更改验证框时,它不再只隐藏其中的一些正确的东西。幸运的是,我还没有看到它隐藏的东西,而这本来不是应该的。我不再赘述,因为起初此代码仅查看第一个验证框,但现在查看的全部为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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Excel 2013中使用VBA读取隐藏列的问题

来自分类Dev

Excel隐藏行公式

来自分类Dev

如何使用Interop C#隐藏Excel列和行

来自分类Dev

使用VBA隐藏行

来自分类Dev

使用宏隐藏行

来自分类Dev

使用Togglebutton Excel 2016隐藏和取消隐藏列中具有日期的行

来自分类Dev

VBA在Excel 2013中自动隐藏功能区

来自分类Dev

如何在Excel 2013中显示隐藏的字符?

来自分类Dev

使用JavaScript隐藏表格行

来自分类Dev

使用嵌套的IF语句隐藏行

来自分类Dev

Excel:计数If语句忽略隐藏的行

来自分类Dev

Worksheet_Change隐藏Excel中的行

来自分类Dev

忽略Excel公式中的隐藏表行

来自分类Dev

Excel是否总是计算隐藏行?

来自分类Dev

关于Excel中的过滤(隐藏行)

来自分类Dev

如何与Python的OpenPyxl一起使用R的Reticulate包以在Excel中隐藏行

来自分类Dev

使用colspan隐藏复杂的列,并使用jQuery隐藏行跨

来自分类Dev

需要使用Excel 2013 VBA脚本

来自分类Dev

使用IF(Isnumber(Search)公式-Excel 2013

来自分类Dev

Excel 2013 AVERAGEIFS使用COLUMN()参考

来自分类Dev

如何使用Jquery隐藏选项隐藏表行

来自分类Dev

使用Excel计算重复的行

来自分类Dev

Excel-使用行分组

来自分类Dev

使用Javascript类显示/隐藏表行

来自分类Dev

使用JQuery隐藏html中的行

来自分类Dev

使用jQuery隐藏/显示表行

来自分类Dev

如何隐藏使用聚合函数的行

来自分类Dev

使用python隐藏Google表格中的行

来自分类Dev

如何使用jQuery显示/隐藏ListView的行