首页 > 解决方案 > 在公式单元格上运行 VBA 集

问题描述

我有一些 VBA 代码(如下)来隐藏和显示基于单元格值的行,当单元格被单击然后退出或手动完成时,VBA 工作但是单元格中有一个公式我需要基于 VBA我已经尝试了几种方法,但我没有取得任何成功,也无法让它刷新和运行 VBA。我真的不希望或不需要让最终用户单击任何不必要的字段 - 任何建议将不胜感激。

 Private Sub Worksheet_Change(ByVal Target As Range)
 ActiveSheet.Activate
 Application.ScreenUpdating = False

 On Error Resume Next
 If Not Application.Intersect(Range("G20"), Range(Target.Address)) Is Nothing Then
    Select Case Target.Value

    Case Is = "0":
    Rows("27:64").EntireRow.Hidden = True


    End Select

    End If

    If Not Application.Intersect(Range("G20"), Range(Target.Address)) Is Nothing Then
    Select Case Target.Value

    Case Is = "1":
                        Rows("27:29").EntireRow.Hidden = False
                        Rows("31:42").EntireRow.Hidden = False
                        Rows("52:64").EntireRow.Hidden = False
                        Rows("43:45").EntireRow.Hidden = True
                        Rows("46:51").EntireRow.Hidden = True
                        Rows("30:30").EntireRow.Hidden = True
    End Select

   If
   On Error Resume Next
   If Not Application.Intersect(Range("G20"), Range(Target.Address)) Is Nothing Then
    Select Case Target.Value

    Case Is = "2":
                        Rows("27:29").EntireRow.Hidden = False
                        Rows("31:45").EntireRow.Hidden = False
                        Rows("52:64").EntireRow.Hidden = False
                        Rows("46:51").EntireRow.Hidden = True
                        Rows("30:30").EntireRow.Hidden = True
    End Select

  End If
  On Error Resume Next
  If Not Application.Intersect(Range("G20"), Range(Target.Address)) Is Nothing Then
    Select Case Target.Value

    Case Is = "3":
                        Rows("27:31").EntireRow.Hidden = False
                        Rows("31:42").EntireRow.Hidden = False
                        Rows("46:51").EntireRow.Hidden = False
                        Rows("43:45").EntireRow.Hidden = True
    End Select

 End If
 On Error Resume Next
  If Not Application.Intersect(Range("G20"), Range(Target.Address)) Is Nothing Then
    Select Case Target.Value

    Case Is = "4":
                        Rows("27:31").EntireRow.Hidden = False
                        Rows("32:45").EntireRow.Hidden = True
                        Rows("52:64").EntireRow.Hidden = True
                        Rows("46:51").EntireRow.Hidden = False
    End Select

 End If

 On Error Resume Next
 If Not Application.Intersect(Range("G20"), Range(Target.Address)) Is Nothing Then
    Select Case Target.Value

    Case Is = "5":
     Rows("27:64").EntireRow.Hidden = False
    End Select

End If

Application.ScreenUpdating = True
End Sub

标签: excelvba

解决方案


我假设您正在检查单元格G20以隐藏/取消隐藏行。所以我们要这样做:

首先为此更改工作表对象中的代码:

Option Explicit
Private Sub Worksheet_Calculate()

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    HideRows Me.Range("G20"), Me

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With

End Sub

这将调用另一个过程,该过程将包含在这样的模块中:

Option Explicit
Sub HideRows(CellValue As Long, ws As Worksheet)

    With ws
        Select Case CellValue
            Case 0
                .Rows("27:64").EntireRow.Hidden = True
            Case 1
                .Rows("27:29").EntireRow.Hidden = False
                .Rows("31:42").EntireRow.Hidden = False
                .Rows("52:64").EntireRow.Hidden = False
                .Rows("43:45").EntireRow.Hidden = True
                .Rows("46:51").EntireRow.Hidden = True
                .Rows("30:30").EntireRow.Hidden = True
            Case 2
                .Rows("27:29").EntireRow.Hidden = False
                .Rows("31:45").EntireRow.Hidden = False
                .Rows("52:64").EntireRow.Hidden = False
                .Rows("46:51").EntireRow.Hidden = True
                .Rows("30:30").EntireRow.Hidden = True
            Case 3
                .Rows("27:31").EntireRow.Hidden = False
                .Rows("31:42").EntireRow.Hidden = False
                .Rows("46:51").EntireRow.Hidden = False
                .Rows("43:45").EntireRow.Hidden = True
            Case 4
                .Rows("27:31").EntireRow.Hidden = False
                .Rows("32:45").EntireRow.Hidden = True
                .Rows("52:64").EntireRow.Hidden = True
                .Rows("46:51").EntireRow.Hidden = False
            Case 5
                .Rows("27:64").EntireRow.Hidden = False
        End Select
    End With

End Sub

这样,如果以相同的方式构建多个工作表,您可以将代码用于多个工作表,您只需将代码从工作表对象复制到其他工作表,它将HideRows根据值隐藏/取消隐藏行G20您可以在每张纸上更改目标的单元格。

至于你的使用,Select Case你可以看到你只需要一个与你所有的案例为价值。


推荐阅读