VBA帮助缩短代码,介绍例程?

问题描述 投票:0回答:1

我有一些通用的代码用来隐藏我正在创建的excel文档的行,我将在此电子表格中大量使用此代码,并且到了出现“程序过大”错误的地步。有问题的代码是:

Private Sub Worksheet_Change(ByVal Target As Range)
''''''''General Selection statement'''''''
If Not Application.Intersect(Range("F7"), Range(Target.Address)) Is Nothing Then
Select Case Target.Value
Case Is = "-": Rows("8:20").EntireRow.Hidden = True
Case Is = "No": Rows("8:20").EntireRow.Hidden = False
Case Is = "Yes": Rows("8:20").EntireRow.Hidden = True
End Select
End If
If Not Application.Intersect(Range("B8"), Range(Target.Address)) Is Nothing Then
Select Case Target.Value
Case Is = "Other": Rows("9:10").EntireRow.Hidden = False
Case Is <> "Other": Rows("9:10").EntireRow.Hidden = True
End Select
End If
If Not Application.Intersect(Range("C11"), Range(Target.Address)) Is Nothing Then
Select Case Target.Value
Case Is = "-": Rows("12:19").EntireRow.Hidden = True
Case Is = "Yes": Rows("12:19").EntireRow.Hidden = False
Case Is = "No": Rows("12:19").EntireRow.Hidden = True
End Select
End If
End Sub

是否可以创建一个子例程,然后在需要时调用它?所选单元格将发生变化,但范围将保持不变,我希望这有意义吗?我是VBA的新手,所以我们将不胜感激。

excel vba show-hide
1个回答
3
投票

如果需要重复代码,则应将类似的代码放入循环或可以使用所需参数调用的子例程中,因此请重复使用具有不同参数的相同子例程。

请注意,Range(Target.Address)与只写Target完全一样。

例如,将以下内容放入模块:

Option Explicit

Public Enum ToggleMode
    tmYesNo
    tmOther
End Enum

Public Function ToggleRows(Mode As ToggleMode, CheckRange As Range, Target As Range, RowsAddress As String)

    If Not Application.Intersect(CheckRange, Target) Is Nothing Then
        Dim ToggleRange As Range
        Set ToggleRange = Target.Parent.Rows(RowsAddress).EntireRow

        If Mode = tmYesNo Then
            Select Case Target.Value
                Case "-", "Yes": ToggleRange .Hidden = True
                Case "No":       ToggleRange .Hidden = False
            End Select

        ElseIf Mode = tmOther Then
            Select Case Target.Value
                Case Is = "Other": ToggleRange .Hidden = False
                Case Is <> "Other": ToggleRange .Hidden = True
            End Select

        End If

    End If

End Function

以及工作表代码中的以下内容:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub  'exit if target is a range and not a single cell.

    ToggleRows tmYesNo, Range("F7"), Target, "8:20"
    ToggleRows tmOther, Range("B8"), Target, "9:10"
    ToggleRows tmYesNo, Range("C11"), Target, "12:1"
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.