Ошибка несоответствия типов с помощью VLookup

Я получаю ошибку несоответствия типа для строки If first_unit = "N/A" Then. Я пытаюсь изменить текст раскрывающегося меню (B26:C26) в зависимости от выбора в другом раскрывающемся меню (B10). Для следующего кода:

Dim check_change As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo 0


If check_change = False Then

If Target.Address = Range("B10").Address Then
    Dim first_unit As Variant
    Dim second_unit As Variant
    Dim third_unit As Variant

    check_change = True
    first_unit = Application.WorksheetFunction.VLookup(Range("B10:E10"), Sheet3.Range("Jurisdictions_table"), 5, False)
    second_unit = Application.WorksheetFunction.VLookup(Range("B10:E10"), Sheet3.Range("Jurisdictions_table"), 6, False)
    third_unit = Application.WorksheetFunction.VLookup(Range("B10:E10"), Sheet3.Range("Jurisdictions_table"), 7, False)

    Range("D5").Value = first_unit
    Range("E5").Value = second_unit
    Range("F5").Value = third_unit

    If first_unit = "N/A" Then
        Range("B26:C26").Value = "Certified"
    End If

    check_change = False
    Exit Sub
End If

If Not Intersect(Target, Range("B19")) Is Nothing Then
    check_change = True
    Call ft_to_m(Range("D19"), Range("B19"))
    check_change = False
    Exit Sub
End If

If Not Intersect(Target, Range("D19")) Is Nothing Then
    check_change = True
    Call m_to_ft(Range("D19"), Range("B19"))
    check_change = False
    Exit Sub
End If

End If

End Sub

person user2620359    schedule 23.10.2015    source источник
comment
См. stackoverflow.com/questions/17177709/; обратите внимание на разницу между Application.WorksheetFunction.VLookup() и Application.VLookup()   -  person D_Bester    schedule 24.10.2015


Ответы (2)


Используйте Application.VLookup вместо Application.WorksheetFunction.VLookup(), чтобы не возникала ошибка в случае сбоя поиска. Затем вы можете проверить IsError(), чтобы определить, есть ли у вас действительный результат или ошибка. В Excel отображается ошибка #N/A, если значение не найдено в таблице поиска. Использование IsError() уловит ошибку.

Также первым аргументом является искомое значение, а не диапазон. Excel преобразует ячейку в значение функции. Поэтому, чтобы быть ясным, вы должны использовать Range("B10").Value в качестве первого аргумента. И вы не можете использовать для этого диапазон из нескольких ячеек.

first_unit = Application.VLookup(Range("B10").Value, Sheet3.Range("Jurisdictions_table"), 5, False)
second_unit = Application.VLookup(Range("C10").Value, Sheet3.Range("Jurisdictions_table"), 6, False)
third_unit = Application.VLookup(Range("D10").Value, Sheet3.Range("Jurisdictions_table"), 7, False)

If Not IsError(first_unit) Then Range("D5").Value = first_unit
If Not IsError(second_unit) Then Range("E5").Value = second_unit
If Not IsError(third_unit) Then Range("F5").Value = third_unit

If IsError(first_unit) Then
    Range("B26:C26").Value = "Certified"
End If

CPearson: обработка ошибок с помощью функций рабочего листа

person D_Bester    schedule 24.10.2015
comment
Если этот ответ поможет вам, примите его, поставив галочку слева. Если это не сработает, дайте мне знать. - person D_Bester; 30.10.2015

Первый аргумент в Vlookup - это значение поиска, а не диапазон, я думаю, что это «B10», а не диапазон («B10: E10»)

Вам нужно использовать обработку ошибок для Vlookup 'Включить обработку ошибок с помощью "При ошибке возобновить дальше" вместо при ошибке Перейти к 0

Sub test1()
On Error Resume Next 

    first_unit = Application.WorksheetFunction.VLookup(Range("B10").value, Sheet3.Range("Jurisdictions_table"), 5, False)
        'first_unit = Application.WorksheetFunction.VLookup(Range("B10:E10"), Sheet3.Range("Jurisdictions_table"), 5, False )

    If IsError(first_unit) = False Then
    ' Example
    first_unit = "N/A"

    Else

    first_unit = "Otherwise"

    End If

End Sub
person PASUMPON V N    schedule 24.10.2015
comment
Ваше объяснение непонятно. Первый аргумент — это искомое значение, а не диапазон. Excel преобразует ячейку в значение функции. Поэтому, чтобы быть ясным, вы должны использовать Range("B10").Value в качестве первого аргумента. И вы правы, вы не можете использовать для этого диапазон из нескольких ячеек. - person D_Bester; 24.10.2015
comment
@D_bester Почему вы голосуете против моего ответа? даже после того, как я предоставлю надлежащий обзор вашего кода? - person PASUMPON V N; 24.10.2015