【问题标题】:Hide Entire given rows if a specified cell is blank如果指定单元格为空,则隐藏整个给定行
【发布时间】:2020-11-06 16:08:26
【问题描述】:

我是 VBA 编码的新手。

我正在尝试在我的函数中实现这一点

sub Private Sub Worksheet_Change(ByVal Target As Range)

它检查一些指定的单元格值更改以运行给定的宏。我要添加的附加宏是,当单元格 a62 为空时,它将隐藏行 a56:a61。并且连续如果 a82 为空,它将隐藏行 a78:a82。

我有以下代码,但它只隐藏从第一个空单元格到工作表末尾的行。

Sub Test()
  Dim i As Long
  For i = 4 To 800
    If Sheets("Results").Cells(i, 1).Value = "" Then
      Rows(i & ":" & Rows.Count).EntireRow.Hidden = True
      Rows("1:" & i - 1).EntireRow.Hidden = False
      Exit Sub
    End If
  Next
End Sub

【问题讨论】:

  • 感谢@james Z 先生编辑
  • 但是你想要什么单元格变化来触发事件呢? “A62”和“A82”?它们中的每一个变为空都会隐藏相应的行,但如果它们有值,讨论中的行是否应该变得可见?如果这两个单元格会触发事件,我认为不需要迭代。
  • 仅当这些单元格为空时。如果它们有值,那么行应该是可见的
  • 什么会触发您发布的代码,什么会触发您需要的另外两个?手动更改一个或多个单元格还是按公式更改?如果不适用这两个额外要求,仅隐藏或显示将发生此更改的行还不够吗?
  • 如果单元格是空白的,那么我在“结果”表中有子代码Private Sub Worksheet_Change(ByVal Target As Range) 。结果表包含三个由切片器连接的数据透视表。所以现在,我所拥有的是当我在该切片器中选择一个项目时,它当然会更改三个数据透视表报告中的值,现在将触发Private Sub Worksheet_Change(ByVal Target As Range) ...此代码将检查是否有任何更改在第一个枢轴区域中给定范围内的任何单元格中,其中一个包括切片器中的项目。所以我的目标是

标签: excel vba


【解决方案1】:

请检查下一个事件代码:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$A$62" Or Target.Address = "$A$82" Then
        Select Case Target.Address
            Case "$A$62"
                If Target.Value = "" Then
                    Range("A56:A61").EntireRow.Hidden = True
                Else
                    Range("A56:A61").EntireRow.Hidden = False
                End If
            Case "$A$82"
                If Target.Value = "" Then
                    Range("A78:A81").EntireRow.Hidden = True
                Else
                    Range("A78:A81").EntireRow.Hidden = False
                End If
        End Select
  End If
End Sub

仅当您手动更改两个必需单元格之一的值时才会触发它。

如果它们的值是公式的结果,则必须使用Worksheet_Calculate 事件,但方式不同。此事件没有任何参数(无目标),您必须检查讨论中的两个单元格并根据它们的值采取行动,与触发计算事件时它们是否已更改无关。如果是这种情况,我也可以发布这样的事件代码。

已编辑:

对于不涉及手动更改值的版本,请将该事件代码复制到工作表代码模块中:

Private Sub Worksheet_Calculate()
    If Me.Range("A62").Value = "" Then
        Me.Range("A56:A61").EntireRow.Hidden = True
    Else
        Me.Range("A56:A61").EntireRow.Hidden = False
    End If
    If Me.Range("A82").Value = "" Then
        Me.Range("A78:A82").EntireRow.Hidden = True
    Else
        Me.Range("A78:A82").EntireRow.Hidden = False
    End If
    'Edited:
    'The part for both analyzed ranges being empty:
    If Me.Range("A62").Value = "" And _
                     Me.Range("A82").Value = "" Then
        'Do here what you need...
    End If
End Sub

【讨论】:

  • 谢谢!!!我希望这能起作用,因为它在某种程度上类似于我当前的现有代码,如下所示。两个必需单元格的值将因数据透视表报表筛选器而改变。因此,如果单元格为空,则意味着数据透视表报表为空。所以我猜它是手动的,没有包含公式,也没有由 VBA 代码触发。我试图将它嵌套在我现有的Worksheet_Change 代码中,但它不仅不起作用,现在它甚至停止了我现有的代码的工作。所以我认为我缺少非常基本的项目。
  • 非常感谢您,先生!这是我现有的代码:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("b1:p5")) Is Nothing Then 'here lies my code to unhide all previously hidden rows ' and here to hide all rows below the first pivot table that are blank. ' then i have a code here to format a specific cell's number to date if it is date and number if column is number End If End If End Sub
  • 所以我试过了@faneDuru先生,枢轴刷新不被认为是手动的..所以是的,使用你提到的代码它不会工作。但我想知道,因为我在当前代码中使用了相同的子函数并且它正在工作。嗯..但是当我尝试通过硬编码手动更新单元格时它确实有效
  • @BoyDespasito:我问过这个问题,我也在我的回答文本中指定了它。我将准备一个使用Calculation 事件的解决方案。我会在几分钟后发布它...
  • @BoyDespasito:我编辑了答案并发布了应该可以在不手动更改值的情况下工作的变体。如果使用公式更改值当然可以,但我没有针对数据透视表的情况对其进行测试。从理论上讲,它应该触发Calculate even,这足以让代码在必要时运行。请对其进行测试并发送一些反馈。
猜你喜欢
  • 2022-01-16
  • 2014-09-06
  • 2016-03-31
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多