Как запустить два макроса VBA одновременно, когда разные триггерные ячейки меняются по формуле? - PullRequest
0 голосов
/ 07 мая 2019

Я работаю над таблицей Excel, которая в основном использует стандартную формулу в ячейках, но имеет два основных макроса VBA.Эти макросы должны запускаться тремя различными ячейками, которые автоматически изменяют свое значение по формуле .

. Представьте себе, что это так:

  • 3 пары ячеек распределены полист (1 пара = 1 триггерная ячейка + 1 выходная ячейка)
  • 1 вычислительный макрос и 1 очищающий макрос
  • Если одна триггерная ячейка меняется на «x», вычислительный макрос запускается и выдаетвывод в соседнюю выходную ячейку.
  • Пока это происходит, другие триггерные ячейки переходят к «», что начинает очистку (ClearContents) их выходных ячеек.
  • Я думал об очистке выходных ячеекне требуется при расчете необходимого, но есть вероятность, что все три триггерных ячейки перейдут в "".Из-за этого я попытался реализовать очистку в отдельном макросе, чтобы избежать постоянного сохранения последнего вывода.

Я работаю с Excel 2010 в Windows 7, и это мой код, поэтомуfar:

Private Sub Worksheet_Change(ByVal target As Range)
'controls if trigger cell values change
'calls macros with trigger parameters

    Select Case target.Address

        'Trigger 1 activated
        Case "$A$1"
            With target

                If .Value = "x" Then
                    Call Calculation(1)     'calculate output cell 1
                ElseIf .Value = "" Then
                    Call Clean(1)           'clean output cell 1
                Else
                    Call Error              'error notification
                End If

            End With

        '-------------------------------------------

        'Trigger 2 activated
        Case "$A$2"
            With target

                If .Value = "x" Then
                    Call Calculation(2)     'calculate output cell 2
                ElseIf .Value = "" Then
                    Call Clean(2)           'clean output cell 2
                Else
                    Call Error              'error notification
                End If

            End With

        '-------------------------------------------

        'Trigger 3 activated
        Case "$A$3"
            With target

                If .Value = "x" Then
                    Call Calculation(3)     'calculate output cell 3
                ElseIf .Value = "" Then
                    Call Clean(3)           'clean output cell 3
                Else
                    Call Error              'error notification
                End If

            End With


    End Select

End Sub
__________________________________________________________________________

Sub Calculation(Trigger As Integer)
    'calculation process with detection which output is to fill
End Sub

__________________________________________________________________________

Sub Clean(Trigger_Clean As Integer)
    'cleaning process with detection which output is to clean    
End Sub

__________________________________________________________________________

Sub Error()
    'individual error notification
End Sub

При использовании моего кода я заметил, что он отлично работает для измененных вручную значений триггерных ячеек (записал x и нажал Enter), но не для изменения значения по формуле.Я также заметил, что не могу запустить расчет выхода 1 и очистку выходов 2 и 3 или очистку всех выходных ячеек одновременно.

Что мне нужно знать: Как запустить макрос при автоматическом изменении значения триггерной ячейки и как запустить расчет и процессы очистки сразу или подряд?

Очень надеюсь, что моя проблема заинтересует вас.Заранее благодарю за любую помощь.

RaspiManu

1 Ответ

1 голос
/ 07 мая 2019

После подсказки о Лууклаге я нашел решение от Сиддхарта Раута в этом стеке поток потока .

Я оптимизировал его для своих нужд, чтобы получить следующие коды:

в модуле:

Public PrevVal_1, PrevVal_2, PrevVal_3 As Variant

in ThisWorkbook:

Private Sub Workbook_Open()

    PrevVal_1 = Worksheets("Sheet1").Range("A1").Value
    PrevVal_2 = Worksheets("Sheet1").Range("A2").Value
    PrevVal_3 = Worksheets("Sheet1").Range("A3").Value

End Sub

в Sheet1:

Private Sub Worksheet_Calculate()

    If Range("A1").Value <> PrevVal_1 Then

        If Range("A1").Value = "x" Then
            Call Calculation(1)        
        ElseIf Range("A1").Value = "" Then
            Call Clean(1)                         
        Else
            Call Error                              
        End If

        PrevVal_1 = Range("A1").Value

    End If

    '-------------------------------------------

    If Range("A2").Value <> PrevVal_2 Then

        If Range("A2").Value = "x" Then
            Call Calculation(2)        
        ElseIf Range("A2").Value = "" Then
            Call Clean(2)                         
        Else
            Call Error                             
        End If

        PrevVal_2 = Range("A2").Value

    End If

    '-------------------------------------------

    If Range("A3").Value <> PrevVal_3 Then

        If Range("A3").Value = "x" Then
            Call Calculation(3)        
        ElseIf Range("A3").Value = "" Then
            Call Clean(3)                          
        Else
            Call Error                              
        End If

        PrevVal_3 = Range("A3").Value

    End If


End Sub

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

RaspiManu

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