Вызов макроса из другого

Я запускаю макрос, который выдает сообщение, если пользователь вводит значение в столбце E с пустым столбцом D. поэтому пользователь должен ввести значение в D, а затем в E. Как только пользователь вводит значение в D, по формуле Vlookup на листе будет отображаться число в столбце F. Второй макрос должен затем проверить, не равно ли значение столбца F значению, введенному в столбце E, если оно не равно, появится всплывающее сообщение. Первая часть работает, а вторая нет. любая идея, пожалуйста. Благодарность

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Cells(Target.Row, 5).Address And Target.Value <> "" And Cells(Target.Row, 4).Value = "" Then

       MsgBox "Input value in column D"
       Cells(Target.Row, 4).Select
       Target.Clear        
    End If        
Call Macro2

End Sub

Sub Macro2()

   If Target.Address = Sheets(1).Cells(Target.Row, 5).Address And Target.Value <> "" And Target.Value <> Sheets(1).Cells(Target.Row, 6).Value Then
    MsgBox "E and F don't match"

   End If

End Sub
1
0
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если проблема связана со вторым, то передайте ему Target:

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False                    '<--- Consider removing this line
    If Target.Address = Cells(Target.Row, 5).Address _
       And Target.Value <> "" _
       And Cells(Target.Row, 4).Value = "" Then

        MsgBox "Input value in column D"
        Cells(Target.Row, 4).Select
        Target.Clear    
    End If    

    Macro2 Target        
    Application.EnableEvents = True                      '<--- Consider removing this line
End Sub

Sub Macro2(Target As Range)

    If IsError(Target) Then
        MsgBox Target.Address & "is an error!"
    ElseIf IsError(Sheets(1).Cells(Target.Row, 6)) Then
        MsgBox Sheets(1).Cells(Target.Row, 6).Address & " is an error!"
    ElseIf Target.Address = Sheets(1).Cells(Target.Row, 5).Address _
           And Target.Value <> "" _
           And Target.Value <> Sheets(1).Cells(Target.Row, 6).Value Then
        MsgBox "E and F don't match"
    End If

End Sub

Однако возможно, что Target.Clear создает цикл внутри Worksheet_Change, потому что он снова меняет рабочий лист. В зависимости от того, нормально это или нет, вы можете рассмотреть возможность записи Application.EnableEvents = False и Application.EnableEvents = True в начале или в конце Sub.

Я получаю сообщение об ошибке «Несоответствие типа 13». Если Target.Address = Sheets (1) .Cells (Target.Row, 5) .Address _ And Target.Value <> "" _ And Target.Value <> Sheets (1) .Cells (Target.Row, 6) .Value Then

ADRSAL 11.04.2018 12:46

Перед этой строкой напишите MsgBox Target.Value. Что есть в MsgBox? Это ошибка?

Vityata 11.04.2018 12:48

Да, это сообщение об ошибке. показывая, что значение 5 не равно 6

ADRSAL 11.04.2018 13:03

@ADRSAL - затем попытайтесь зафиксировать ошибку и избежать условия if. Смотрите обновление.

Vityata 11.04.2018 13:04

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

ADRSAL 11.04.2018 13:12

@ADRSAL - какое значение Target при входе в саб Macro2? Я добавил проверку IsError на случай, если это ошибка !Div/0 или аналогичная.

Vityata 11.04.2018 13:13

ах вот почему. значение F равно # N / A до того, как значение будет введено в столбец D. Он выдает ошибку до того, как я введу что-либо в D.

ADRSAL 11.04.2018 13:39

@ADRSAL - точно. Ошибки нельзя сравнивать, их нужно «фиксировать».

Vityata 11.04.2018 13:43

@ADRSAL - отметьте ответ как принятый. Вы также можете отметить ответ на этот вопрос как принятый - stackoverflow.com/questions/49532778/…

Vityata 11.04.2018 14:44

Другие вопросы по теме