Передать значение из рабочего листа в модуль - PullRequest
0 голосов
/ 24 января 2020

У меня есть это в моем рабочем листе:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim D_KeyCells As Range

    Set D_KeyCells = Range("D6:D16")

  If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

        Call D_CheckRow()


  End If
End Sub

Но мне нужно, чтобы этот прогон был только тогда, когда выбран и изменен столбец D.

Потому что мне нужно будет сделать несколько проверок в зависимости от на какой ячейке столбец изменен.

Таким образом, если ячейка

D6 изменена, вызов D_CheckRow

E6 изменяется, затем вызывается E_CheckRow

F6, затем вызывается F_CheckRow

G6 изменяется, затем вызывайте G_CheckRow

и т. Д.

Я уверен, что есть более простой способ написания кода, поэтому любая помощь очень ценится.

Обновление: цель чтобы проверить, что после заполнения ячейки запускается подмодуль

Вот диапазоны, которые я проверяю:

Set D_KeyCells = Range("D6:D16")
Set E_KeyCells = Range("E6:E16")
Set G_KeyCells = Range("G6:G16")
Set I_KeyCells = Range("I6:I16")
Set J_KeyCells = Range("J6:J16")
Set K_KeyCells = Range("K6:K16")
Set L_KeyCells = Range("L6:L16")
Set M_KeyCells = Range("M6:M16")

Так что, если ячейка D изменяется, запустите D_CheckRow, если она была E-ячейка, затем запустите E_CheckRow и т. д.

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Вы можете использовать Application.Run, как в:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim D_KeyCells As Range

Set D_KeyCells = Range("D6:G6")

If Not Application.Intersect(D_KeyCells, Target) Is Nothing Then
   Application.Run (Split(Target.Address, "$")(1) & "_CheckRow")
End If

End Sub

Или использовать подход с использованием параметров, согласно комментарию Матье, который я должен сказать, это подход, который я был бы склонен использовать, если бы у меня не было не спустился в эту конкретную кроличью нору.

1 голос
/ 24 января 2020

KISS (каламбур предназначен): D

Код легче поддерживать. Поскольку у вас очень мало чеков, вы можете попробовать это?

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Set rng = Range("D6:D16,E6:E16,G6:G16,I6:I16,J6:J16,K6:K16,L6:L16,M6:M16")

    If Not Intersect(rng, Target) Is Nothing Then
        Select Case rng.Column
            Case 4: D_CheckRow
            Case 5: E_CheckRow
            Case 7: G_CheckRow
            Case 9: I_CheckRow
            Case 10: J_CheckRow
            Case 11: K_CheckRow
            Case 12: L_CheckRow
            Case 13: M_CheckRow
        End Select
    End If
End Sub

Кроме того, поскольку вы работаете с Worksheet_Change, вы можете захотеть увидеть ЭТО

Если у вас много проверок, вы можете использовать Application.Run (Split(Target.Address, "$")(1) & "_CheckRow") как упомянуто @SJR. Но тогда вы должны понять, как работает этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...