Поймать ошибку пользователя и повторно включить application.events после ошибки - PullRequest
0 голосов
/ 20 ноября 2018

Любительский кодер снова просит помощи: -)

У меня есть код, который работает хорошо, он получает переменную из выпадающего списка проверки и выполняет команду автоматически, потому что я и использую Private Sub Worksheet_Change(ByVal Target As Range),У меня проблема в том, что иногда пользователь вводит текст в поле, а не выбирает его.

Я получаю

ошибку во время выполнения 91

, поскольку он не может найти значение, введенное пользователем.

Как я могу поймать эту ошибку и сделать сообщение всплывающим, чтобы сообщить им, что они должны выбрать из выпадающего списка?А также, поскольку он нарушает код, он устанавливает для моего Application.EnableEvents значение False, поскольку он не завершает код из раздела ByVal Target As Range, который сбрасывается до True.

Как я могу сбросить Application.EnableEvents на True в случае взлома кода?

Sub Copy_From_Borrower_DBase()
    Dim myVal As String
    Dim sourceRng As Range
    myVal = Sheets("Main").Range("F2").Value ' dropdown list
    Set sourceRng = Worksheets("Borrower Database").Range("5:5").Find(What:=myVal, LookAt:=xlWhole) 'locate column where to copy from
    Worksheets("Main").Range("F5").Value = Worksheets("Borrower Database").Cells(5, sourceRng.Column).Value 'Borrower Name
    Worksheets("Main").Range("G6").Value = Worksheets("Borrower Database").Cells(6, sourceRng.Column).Value 'Income
End Sub

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Чтобы ответить на вопрос об обработке ошибок:

Public Sub MyProcedure()
    Application.EnableEvents = False

    On Error Goto ENABLE_EVENTS 'if any error occurs after this line events get enabled.

    'stuff where an error could occur

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number <> 0 Then
        MsgBox "an error occurred"
    End If
End Sub

Для получения дополнительной информации об обработке ошибок: Обработка ошибок VBA - Полное руководство .

0 голосов
/ 20 ноября 2018

Сначала я бы попытался решить проблему, не допуская возникновения проблемы, если это не удастся, то позаботьтесь об обработке ошибок.

Поскольку вы уже вызываете Worksheet_Change и используете проверку данных, выполняется проверка значения ячейки проверки.Если в нем есть значение, то ваш код будет работать.Если он пуст, он не будет.Проверка данных очищает ячейку, если кто-то печатает ее, поэтому независимо от того, что они печатают, к моменту ее нажатия на Worksheet_Change это должна быть пустая строка.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$F$2" Then         ' Your Dropdown Validation Cell
        If Not Target.Value = "" Then
            Call Copy_From_Borrower_DBase
        End If
    End If
End Sub
0 голосов
/ 20 ноября 2018

Сначала проверьте, что диапазон ничего не возвращает (т. Е. Термин не найден).Использование With в основном косметическое, но я думаю, что код немного исправляет.

Sub Copy_From_Borrower_DBase()

Dim myVal As String
Dim sourceRng As Range
myVal = Sheets("Main").Range("F2").Value ' dropdown list

With Worksheets("Borrower Database")
    Set sourceRng = .Range("5:5").Find(What:=myVal, LookAt:=xlWhole)
    If Not sourceRng Is Nothing Then
        Worksheets("Main").Range("F5").Value = .Cells(5, sourceRng.Column).Value 'Borrower Name"
        Worksheets("Main").Range("G6").Value = .Cells(6, sourceRng.Column).Value 'Income"
    Else
        MsgBox "whatever"
    End If
End With

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