【问题标题】:Hiding rows based on cell value in different worksheet根据不同工作表中的单元格值隐藏行
【发布时间】:2020-08-23 19:54:57
【问题描述】:

我正在使用 VBA 代码根据单元格值隐藏一些行:

Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Activate
If Not Application.Intersect(Range("K3"), Range(Target.Address)) Is Nothing Then
        Select Case Target.Value
        Case Is = "Full_FC_powered":        Rows("33:33").EntireRow.Hidden = True
                                            Rows("37:38").EntireRow.Hidden = True
                                            Rows("45:46").EntireRow.Hidden = True
        Case Is = "FC_for_hotel":           Rows("33:33").EntireRow.Hidden = False
                                            Rows("37:38").EntireRow.Hidden = False
                                            Rows("45:46").EntireRow.Hidden = False
        Case Is = "DG_for_transit":         Rows("33:33").EntireRow.Hidden = False
                                            Rows("37:38").EntireRow.Hidden = False
                                            Rows("45:46").EntireRow.Hidden = False
        End Select
End If
End Sub

代码本身已经可以运行,但有一个缺点: “K3”的值链接到另一个计算它的工作表。但是,如果另一个工作表中 K3 的值发生变化,则 VBA 代码不会自动工作。我首先必须转到单元格 K3 并按 Enter。

我的问题:有没有办法将此代码直接链接到另一个工作表或在单元格值更改时刷新此代码?

提前致谢

【问题讨论】:

  • Worksheet_Change 更改为 Worksheet_Calculate 并在您的工作簿上自动计算。
  • 感谢您的快速回复,如何“在我的工作簿上自动计算”?如果我只是将 Worksheet_Change(ByVal Target As Range) 更改为 Worksheet_Calculate() 我会收到“运行时 424 错误:需要对象”
  • 您可以像这样在中间窗口(VBA 编辑器中的 ctrl+G)上进行设置:Application.Calculation = xlAutomatic。至于代码,忽略有关目标的所有内容,因此忽略条件并将Select Case Target.Value 更改为Select Case Range("K3").Value 这将在每次工作表计算时触发该过程。我建议在开始时禁用屏幕更新并在最后重新打开它。
  • 从VBE可以看出Calculate事件没有任何参数。

标签: excel vba refresh hide rows


【解决方案1】:

单细胞工作表_计算

使用单元格 I3 代替其他工作表上的单元格,即 K3 中的公式为: =I3.

enter image description here

enter image description here

必须使用所有三个代码才能正常工作。适当调整Public Const TargetSheet As String = "Sheet1"中的Sheet1

标准模块代码,例如模块1

Option Explicit

Public TargetValue As String
Public Const TargetCell As String = "K3"
Public Const TargetSheet As String = "Sheet1"

Sub HideShowRows(Sheet As Worksheet)
    Dim rng As Range
    With Sheet
        Set rng = Union(.Rows("33"), .Rows("37:38"), .Rows("45:46"))
        Select Case .Range(TargetCell).Value
            Case "Full_FC_powered": rng.EntireRow.Hidden = True
            Case "FC_for_hotel", "DG_for_transit": rng.EntireRow.Hidden = False
        End Select
        TargetValue = .Range(TargetCell).Value
    End With
End Sub

ThisWorkbook 代码

Option Explicit

Private Sub Workbook_Open()
    TargetValue = Worksheets(TargetSheet).Range(TargetCell).Value
    HideShowRows Worksheets(TargetSheet)
End Sub

工作表代码,例如Sheet1

Option Explicit

Private Sub Worksheet_Calculate()
    If Range(TargetCell).Value <> TargetValue Then
        HideShowRows Me
    End If
End Sub

' The following in this case are the same:

'    If Range(TargetCell).Value <> TargetValue Then
'        HideShowRows Me
'    End If

'    If Worksheets(TargetSheet).Range(TargetCell).Value <> TargetValue Then
'        HideShowRows Worksheet(TargetSheet)
'    End If

【讨论】:

  • 感谢您提供非常详尽的答案,但它不起作用。我将字符串更改为工作表的名称。当我运行它时,它会自行关闭。
  • 你不需要运行任何东西。它是自动的。再次检查您是否将代码放在正确的位置。它们位于三个不同的位置:Module 代码、ThisWorkbook 代码和 Sheet 代码。 Sheet ("Sheet1") 指的是选项卡中的名称,即 VBE 中括号中的名称 ()
  • @Berendvv:这里是 Google Drive 上my file 的链接。尝试时,将 G 列中的不同值复制到单元格 I3 并查看行隐藏或显示。如果输入任何其他值,则不会发生变化(省略Case Else)。
猜你喜欢
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多