Обработка ошибок с помощью поля со списком VLOOKUP в VBA - PullRequest
1 голос
/ 16 октября 2019

Я создал пользовательскую форму, которая принимает список ссылок на задания (jobRefCbo) и заполняет текстовые поля на основе выбора. Я еще не понял ошибок, и если вы выберете пустое или нажмете escape в поле со списком, он вернется к экрану ошибок VBA.

Как я могу реализовать способ просто «ничего не делать», если выбор ссылки на задание недействителен?

Полагаю, разумным способом было бы иметь заблокированный список, но я пытаюсь извлечь список cbo из списка активных заданий в столбце.

Private Sub UserForm_Initialize()
Sheets("Lists ").Activate
Dim xRg As Range

Application.ScreenUpdating = False

Call Lists_sort


    Set xRg = Worksheets("Lists ").Range("I2:P21")
    Me.jobRefCbo.List = xRg.Columns(1).Value

    Application.ScreenUpdating = True

End Sub

Вот код поля со списком:

Private Sub jobRefCbo_Change()
Application.ScreenUpdating = False


Call Lists_sort


Sheets("Tracker").Activate


    'Formatting Issue
    jobCloseFrm.date2Txt.Value = Format(Range("W1").Value, "dd/mm/yyyy")


    Me.nameTxt.Value = Application.VLookup(Me.jobRefCbo.Value & "", Worksheets("Lists ").Range("I3:P21"), 2, False)
     'Me.acNoTxt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 2, False)
    Me.jobDesc2Txt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 3, False)
    Me.date2Txt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 4, False)
    Me.month2Txt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 5, False)
    Me.timeOnJobTxt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 6, False)
    Me.StatusTxt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 7, False)
    Me.startTime2Txt.Value = Format(CDate(Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 8, False)), "hh:mm:ss AM/PM")
    jobCloseFrm.date2Txt.Value = Format(Range("W1").Value, "dd/mm/yyyy")

    Application.ScreenUpdating = True

End Sub

Любая помощь, которую вы можете оказать, высоко ценится!

Крейг

1 Ответ

1 голос
/ 16 октября 2019

Вы можете сделать это одним из двух способов. Первый заключается в реализации обработчика ошибок в вашем коде jobRefCbo_Change, который будет перехватывать сбой функции VLOOKUP.

Private Sub jobRefCbo_Change()
    Application.ScreenUpdating = False
    Call Lists_sort
    Sheets("Tracker").Activate

    'Formatting Issue
    jobCloseFrm.date2Txt.Value = Format(Range("W1").Value, "dd/mm/yyyy")

    On Error GoTo VLookup_Error
    Me.nameTxt.Value = Application.VLookup(Me.jobRefCbo.Value & "", Worksheets("Lists ").Range("I3:P21"), 2, False)
    'Me.acNoTxt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 2, False)
    Me.jobDesc2Txt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 3, False)
    Me.date2Txt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 4, False)
    Me.month2Txt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 5, False)
    Me.timeOnJobTxt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 6, False)
    Me.StatusTxt.Value = Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 7, False)
    Me.startTime2Txt.Value = Format(CDate(Application.WorksheetFunction.VLookup(Me.jobRefCbo.Value, Worksheets("Lists ").Range("I3:P21"), 8, False)), "hh:mm:ss AM/PM")
    jobCloseFrm.date2Txt.Value = Format(Range("W1").Value, "dd/mm/yyyy")
    Application.ScreenUpdating = True

VLookup_Error:
    '--- nothing to do, just exit

End Sub

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

Option Explicit

Private Type InternalData
    jobRefs As Variant
End Type
Private this As InternalData

Private Sub jobRefCbo_Change()
    Dim cbValue As Variant
    cbValue = Me.jobRefCbo.Value
    If ValueInList(cbValue) Then
        Debug.Print "the value is valid! (" & cbValue & ")"
    Else
        Debug.Print "the value is invalid! (" & cbValue & ")"
    End If
End Sub

Private Sub QuitButton_Click()
    Me.Hide
End Sub

Private Function ValueInList(ByVal thisValue As Variant) As Boolean
    Dim i As Long
    ValueInList = False
    For i = LBound(this.jobRefs) To UBound(this.jobRefs)
        If this.jobRefs(i, 1) = thisValue Then
            ValueInList = True
            Exit For
        End If
    Next i
End Function

Private Sub UserForm_Initialize()
    this.jobRefs = Worksheets("Lists ").Range("I2:P21").Columns(1).Value
    Me.jobRefCbo.List = this.jobRefs
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...