Worksheet_change 当单元格中的值被表单控件元素更改时隐藏行

Worksheet_change hide rows when value in cell is changed by form control element

我正在对其他人创建的 wb 进行一些更改,需要尽可能减少伤害,因为这个 excel 将在公司范围内使用。我的问题是,有两个表单控件按钮可根据选择将 Z1 中的值更改为 1 或 2。

选项 2 仅适用于一行,因此我需要在这一行之前隐藏几行。我正在通过更改工作表来尝试此操作,但没有运气,因为 VBA 的值未以正确的方式更改。更改宏在我手动使用 F2+enter 时有效,但在我仅通过按钮更改时无效。

我试过天桥F2+Enter通过

Range("Z1").FormulaR1C1 = Range("Z1").FormulaR1C1

但没有运气。我尝试了几个版本的代码。我最喜欢的是这个

    If Target.Address = "$Z" Then
        Range("Z1").FormulaR1C1 = Range("Z1").FormulaR1C1
        If Target = "2" Then
            Rows("5:13").EntireRow.Hidden = True
        Else
            Rows("5:13").EntireRow.Hidden = False
        End If
    End If

我的其他人是

    If Not Intersect(Target, Range("Z1")) Is Nothing Then
        Rows("5:13").EntireRow.Hidden = CBool(Range("Z1").Value = 2)
    End If

========

If Not Application.Intersect(Target, Range(Target.Address)) Is Nothing Then ', Range(Target.Address)
        Application.EnableEvents = False
        Range("Z1").FormulaR1C1 = Range("Z1").FormulaR1C1
        Select Case Target.Value
        Case Is = "2":  Rows("5:13").EntireRow.Hidden = True

        Case Is = "1":  Rows("5:13").EntireRow.Hidden = False

        End Select
        Application.EnableEvents = True
End If

========

If Intersect(Range("Z1"), Target) Is Nothing Then Exit Sub
Range("Z1").FormulaR1C1 = Range("Z1").FormulaR1C1
Select Case Range("Z1").Value
    Case Is = 2
        Set HideRows = Rows("5:13")
        Set ViewRows = Nothing
    Case Is = 1
        Set ViewRows = Rows("5:13")
End Select

On Error Resume Next
HideRows.Hidden = True
ViewRows.Hidden = False

两个都不行,我做了一个video and uploaded on YouTube

我错过了什么?我需要它让用户连接到表单控件选择。我无法追求表单控件的更改。

更改“链接的单元格”值不会触发 worksheet_change 事件。

您可以通过在 Z2 中放置(例如)=Z1 使其触发 Worksheet_Calculate 事件,然后只要 Z1 中的值发生变化,该公式就会计算。这意味着您将对 sheet 上的每个计算做出响应,因此您可以确保仅在 Z1 中的值更改时 hide/unhide:

Private Sub Worksheet_Calculate()
    Dim opt, cCache As Range
    Set cCache = Me.Range("Z3")                       'cell with last value
    opt = Me.Range("Z1").Value                        'get current value
    If opt <> cCache.Value Then                       'compare to last value
        Debug.Print "Rows toggle"
        Me.Rows("5:13").EntireRow.Hidden = (opt = 2)  'hide/unhide
        cCache.Value = opt                            'save this for next change
    End If
End Sub