【问题标题】:Add Hiding rows to current VBA code将隐藏行添加到当前 VBA 代码
【发布时间】:2018-08-27 16:56:34
【问题描述】:

我编写了 VBA 代码来隐藏工作簿中 4 个不同选项卡中的特定范围。我希望在代码中添加另一个范围,该范围将根据 4 个不同选项卡中每个选项卡上相同范围内的单元格值隐藏行。如果 B9-B13 范围内的单元格为空白,则在每个选项卡上隐藏该特定行。

这是我当前的代码:

 Sub  HideRowsSummary()
     Dim wsMySheet As Worksheet
     Dim lngMyRow  As Long
     Application.ScreenUpdating = False
     For Each wsMySheet In ThisWorkbook.Sheets
     Select Case wsMySheet.Name
        Case Is = "Summary 1", "Summary (2)",  "Summary (3)", "Summary (4)"
                For lngMyRow = 73 To 24 Step  -1 'Need to work backwards through the rows when hiding or deleting
                    If  Len(wsMySheet.Range("A" & lngMyRow)) = 0 Then
                         wsMySheet.Range("A" & lngMyRow).EntireRow.Hidden = True
                    Else
                         wsMySheet.Range("A" & lngMyRow).EntireRow.Hidden = False
                    End If
                Next lngMyRow
         End Select
     Next wsMySheet
     Application.ScreenUpdating = True
End Sub

感谢您的收看!

【问题讨论】:

  • 您甚至没有遍历您提到的范围。你不应该循环 B9-B13 吗?还是您打算在之后添加的内容?
  • 这是我要添加到当前代码的部分。
  • 您不需要向后工作来隐藏行,但您需要插入或删除行。

标签: vba excel excel-2010 formula


【解决方案1】:

例如在您之前的循环之后直接执行以下操作?使用 Union 将符合条件的行(如果都在同一张表中)收集在一起并顺便隐藏起来会更有效。这样,您可以从两个循环中收集符合条件的行(您也可以将循环合并到其中)并一次性隐藏所有行。

For lngMyRow = 13 To 9 Step -1  'Need to work backwards through the rows when hiding or deleting
    wsMySheet.Range("B" & lngMyRow).EntireRow.Hidden = (wsMySheet.Range("B" & lngMyRow) = vbNullString)
Next lngMyRow

感谢@ScottCraner 指出了非常好的速记。


具有范围联合的两个循环可能看起来像(未测试):

Option Explicit
Public Sub HideRowsSummary()
    Dim wsMySheet As Worksheet
    Dim lngMyRow  As Long, unionRng As Range
    Application.ScreenUpdating = False
    For Each wsMySheet In ThisWorkbook.Sheets
        Select Case wsMySheet.NAME
        Case Is = "Summary 1", "Summary (2)", "Summary (3)", "Summary (4)"
            With wsMySheet
                .Range("A9:A13, A24:A74").EntireRow.Hidden = False
                For lngMyRow = 9 To 13
                    If .Range("B" & lngMyRow) = vbNullString Then
                        If Not unionRng Is Nothing Then
                            Set unionRng = Union(unionRng, .Range("B" & lngMyRow))
                        Else
                            Set unionRng = .Range("B" & lngMyRow)
                        End If
                    End If
                Next lngMyRow
                For lngMyRow = 24 To 73
                    If Len(.Range("A" & lngMyRow)) = 0 Then
                        If Not unionRng Is Nothing Then
                            Set unionRng = Union(unionRng, .Range("A" & lngMyRow))
                        Else
                            Set unionRng = .Range("A" & lngMyRow)
                        End If
                    End If
                Next lngMyRow
            End With
        End Select
        If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True
        Set unionRng = Nothing
    Next wsMySheet
    Application.ScreenUpdating = True
End Sub

【讨论】:

  • 根据您的建议,总代码的外观如何?我愿意提高效率。
  • 1.只需要向后添加或删除行。 2.您可以删除IfwsMySheet.Range("B" & lngMyRow).EntireRow.Hidden = IsEmpty(wsMySheet.Range("B" & lngMyRow))
  • @QHarr - B9:B13 中的范围填充了公式,这是我之前没有说明的错误。该代码完美运行,除了它不会隐藏范围 B9:B13 因为它被公式占用。这如何改变代码?
  • 抱歉,范围已在我对 B9:B13 的评论中更新。如果没有可显示的内容,则公式会生成“”,如果“”,我希望隐藏这些行。
  • @QHarr - 完美运行,感谢大家的帮助和更新效率!
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2014-05-29
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多