【问题标题】:How to hide / show rows across multiple worksheets based on a cell value on another worksheet如何根据另一个工作表上的单元格值隐藏/显示跨多个工作表的行
【发布时间】:2019-03-27 00:04:10
【问题描述】:

我正在尝试提出一种更有效、运行速度更快的方法来调整此公式,以便它根据“输入”选项卡上的 D10 值隐藏/显示多个工作表中的相同行,该宏所在的位置存储。

我已经尝试了所有能找到的方法,但看起来我必须在第一个工作表的正下方列出完全相同的行引用和新的工作表名称。

Private Sub Worksheet_Change(ByVal Target As Range)

Application.DisplayAlerts = False 'Prevents general pop-ups
Application.Calculation = xlManual 'Formulas are not calculated
Application.ScreenUpdating = False 'What the user see's on screen will not change

If Intersect(Target, Range("D10")) Is Nothing Then Exit Sub

'Hides all major city information so just the titles are shown.
If Target.Address = ("$D$10") And Target.Value = "" Then
Sheets("Weekly Report - New").Unprotect
    Sheets("Weekly Report - New").Rows("54:63").EntireRow.Hidden = True
    Sheets("Weekly Report - New").Rows("68:77").EntireRow.Hidden = True
    Sheets("Weekly Report - New").Rows("82:91").EntireRow.Hidden = True
    Sheets("Weekly Report - New").Rows("96:105").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("18:31").EntireRow.Hidden = False
            Sheets("Weekly Report - New").Rows("23:47").EntireRow.Hidden = True

'Unhides 'London' under the major cities section and keeps the rest hidden.
ElseIf Target.Address = ("$D$10") And Target = "UK" Then
Sheets("Weekly Report - New").Unprotect
    Sheets("Weekly Report - New").Rows("54").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("68").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("82").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("96").EntireRow.Hidden = False
            Sheets("Weekly Report - New").Rows("55:63").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("69:77").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("83:91").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("97:105").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("24:28").EntireRow.Hidden = False
                    Sheets("Weekly Report - New").Rows("18:23").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("29:47").EntireRow.Hidden = True

'Unhides 'French Riviera' & 'Paris' under the major cities section and keeps the rest hidden.
ElseIf Target.Address = ("$D$10") And Target = "France" Then
Sheets("Weekly Report - New").Unprotect
    Sheets("Weekly Report - New").Rows("55:56").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("69:70").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("83:84").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("97:98").EntireRow.Hidden = False
            Sheets("Weekly Report - New").Rows("54").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("68").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("82").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("96").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("57:63").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("71:77").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("85:91").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("99:105").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("30:34").EntireRow.Hidden = False
                    Sheets("Weekly Report - New").Rows("18:29").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("35:47").EntireRow.Hidden = True

'Unhides 'Barcelona' & 'Madrid' under the major cities section and keeps the rest hidden.
ElseIf Target.Address = ("$D$10") And Target = "Spain" Then
Sheets("Weekly Report - New").Unprotect
    Sheets("Weekly Report - New").Rows("57:58").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("71:72").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("85:86").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("99:100").EntireRow.Hidden = False
            Sheets("Weekly Report - New").Rows("54:56").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("59:63").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("68:70").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("73:77").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("82:84").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("87:91").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("96:98").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("101:105").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("36:40").EntireRow.Hidden = False
                    Sheets("Weekly Report - New").Rows("18:35").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("41:47").EntireRow.Hidden = True

'Unhides 'Florence', 'Maples', 'Milan', 'Rome' & 'Venice' under the major cities section and keeps the rest hidden.
ElseIf Target.Address = ("$D$10") And Target = "Italy" Then
Sheets("Weekly Report - New").Unprotect
    Sheets("Weekly Report - New").Rows("59:63").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("73:77").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("87:91").EntireRow.Hidden = False
    Sheets("Weekly Report - New").Rows("101:105").EntireRow.Hidden = False
            Sheets("Weekly Report - New").Rows("54:58").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("68:72").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("82:86").EntireRow.Hidden = True
            Sheets("Weekly Report - New").Rows("96:100").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("42:46").EntireRow.Hidden = False
                    Sheets("Weekly Report - New").Rows("18:41").EntireRow.Hidden = True
                    Sheets("Weekly Report - New").Rows("47").EntireRow.Hidden = True

End If

Sheets("Weekly Report - New").Rows("108:121").EntireRow.Hidden = True
Sheets("Weekly Report - New").Protect

Application.DisplayAlerts = True
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True

End Sub

这对于“每周报告 - 新”工作表工作正常(如果有点慢)。我现在需要它为“累积报告 - 新”工作表做同样的事情。

【问题讨论】:

  • 我会创建将被隐藏在一起的行的Unions,然后只隐藏Union's - 这将有利于可读性。另外,不要检查地址,而是检查Intersect

标签: excel vba


【解决方案1】:

首先,将您的隐藏和取消隐藏操作减少到一个用于true 和一个用于false 以加快速度。例如

ws.Range("54:54,68:68,82:82,96:96,24:28").EntireRow.Hidden = False
ws.Range("55:63,69:77,83:91,97:105,18:23,29:47").EntireRow.Hidden = True

请注意,您必须在此处使用Range 而不是Rows

并将您的代码放入一个过程中,以便您可以将其重新用于任何工作表。注意需要调整FranceSpainItaly的代码

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.DisplayAlerts = False 'Prevents general pop-ups
    Application.Calculation = xlManual 'Formulas are not calculated
    Application.ScreenUpdating = False 'What the user see's on screen will not change

    If Intersect(Target, Me.Range("D10")) Is Nothing Then Exit Sub

    ' call the function
    HideAndUnhideRows ThisWorkbook.Worksheets("Weekly Report - New"), Me.Range("D10").Value
    HideAndUnhideRows ThisWorkbook.Worksheets("Cumulative Report - New"), Me.Range("D10").Value

    Application.DisplayAlerts = True
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
End Sub

Private Sub HideAndUnhideRows(ws As Worksheet, Criteria As String)
    ws.Unprotect
    Select Case Criteria

    Case "" 'Hides all major city information so just the titles are shown.
        ws.Range("54:63,68:77,82:91,96:105,23:47").EntireRow.Hidden = True
        ws.Range("18:31").EntireRow.Hidden = False

    Case "UK" 'Unhides 'London' under the major cities section and keeps the rest hidden.
        ws.Range("54:54,68:68,82:82,96:96,24:28").EntireRow.Hidden = False
        ws.Range("55:63,69:77,83:91,97:105,18:23,29:47").EntireRow.Hidden = True

    Case "France" 'Unhides 'French Riviera' & 'Paris' under the major cities section and keeps the rest hidden.

    Case "Spain" 'Unhides 'Barcelona' & 'Madrid' under the major cities section and keeps the rest hidden.

    Case "Italy" 'Unhides 'Florence', 'Maples', 'Milan', 'Rome' & 'Venice' under the major cities section and keeps the rest hidden.

    End Select

    ws.Range("108:121").EntireRow.Hidden = True
    ws.Protect
End Sub

【讨论】:

  • 为什么我们需要使用Range而不是Rows?我也可以从中学到一些东西。
  • 该死的你们干得快,我只是在调整它的不同部分,然后我会试一试,谢谢大家的快速响应!
  • @Damian 因为Rows 不接受像54:63,68:77 这样的非连续逗号分隔地址,但Range 接受。如果地址是硬编码的,我会避免使用union 以使其更短更快。
  • 我明白了,但它怎么比Union() 更快,他们不也一样吗@Pᴇʜ?
  • 好的,刚刚完成所有工作,由于文件的其他一些元素,不得不对其进行调整,但它基本上与所写的完全一样。非常感谢(:(一切正常)
【解决方案2】:

因为有很多不同的行需要隐藏和取消隐藏,所以我做了第一个示例,您可以使用它来完成其余的操作:

Dim wb As Workbook, ws As Worksheet, SheetNames
Application.DisplayAlerts = False 'Prevents general pop-ups
Application.Calculation = xlManual 'Formulas are not calculated
Application.ScreenUpdating = False 'What the user see's on screen will not change

If Intersect(Target, Range("D10")) Is Nothing Then Exit Sub

Set wb = ThisWorkbook
SheetNames = Array("Weekly Report - New", "Cumulative Report - New")


StrValue = Target.Value
Select Case StrValue
    'Hides all major city information so just the titles are shown.
    Case vbNullString
        For i = 0 To 1
            Set ws = wb.Sheets(SheetNames(i))
            With ws
                .Unprotect
                Union(.Rows("54:63"), .Rows("68:77"), .Rows("82:91"), .Rows("96:105"), .Rows("23:47")). _
                    EntireRow.Hidden = True
                .Rows("18:31").EntireRow.Hidden = False
            End With
        Next i

    'All the other cases

End Select

我所做的是,您需要处理的每个工作表都有一个循环(假设两者都有相同的数据),并使用 urdearboy 所说的关于联合的内容来提高可读性和更快的处理过程。

希望这会为您指明正确的方向。如果您需要更多帮助,请尽管询问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多