【问题标题】:VBA Help shorten code, introduce routines?VBA 帮助缩短代码,引入例程?
【发布时间】:2020-08-02 21:55:18
【问题描述】:

我有一段通用代码用于隐藏我正在创建的 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 新手,因此我们将不胜感激。

【问题讨论】:

  • 如果您需要重复代码,应该将类似的代码放入循环中或放入您可以使用所需参数调用的子例程中,因此重复使用具有不同参数的相同子例程。 • 请注意Range(Target.Address) 与写Target 完全相同。

标签: excel vba show-hide


【解决方案1】:

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

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

例如下面的变成一个模块:

Option Explicit

Public Enum ToggleMode
    tmYesNo
    tmOther
End Enum

Public Sub ToggleRows(ByVal Mode As ToggleMode, ByVal CheckRange As Range, ByVal Target As Range, ByVal 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 Sub

您的工作表代码中包含以下内容:

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, Me.Range("F7"), Target, "8:20"
    ToggleRows tmOther, Me.Range("B8"), Target, "9:10"
    ToggleRows tmYesNo, Me.Range("C11"), Target, "12:1"
End Sub

【讨论】:

  • 可靠的答案,很好的重写。唯一的问题是为什么ToggleRows 是一个不返回值的函数?想想Sub 会更清楚。
  • @RyanWildry Meeh,因为咖啡没了,我没注意^^。当然它必须是一个程序。
  • 不用担心。很好的答案,+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多