VBA Помогите сократить код, ввести подпрограммы? - PullRequest
1 голос
/ 20 апреля 2020

У меня есть общий c бит кода, который я использую, чтобы скрыть строки для документа 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, поэтому любая помощь будет оценена.

1 Ответ

5 голосов
/ 20 апреля 2020

Если вам нужно повторить код, аналогичный код должен быть помещен либо в al oop, либо в подпрограммы, которые вы можете вызвать с нужным параметром, поэтому повторно используйте ту же подпрограмму с другими параметрами.

Обратите внимание, что 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
...