Обнаружение ошибок с помощью функций Choose / vlookup для выбора между таблицами поиска на основе ввода пользовательской формы. - PullRequest
0 голосов
/ 22 марта 2019

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

Когда я использую функцию Выбрать в сочетании с Vlookup в обычных ячейках Excel,функция работает отлично.Когда я пытаюсь преобразовать его в VBA и включить Combobox / текстовые поля для поиска, он выдает ошибку или ничего не возвращает в указанные текстовые поля.

Таблица индекса имеет два столбца, один с номером детали, а другой с номером индекса.

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

Обычно я просто получаю сообщение об ошибке «1004»: «Невозможно получить свойство VLookup класса WorksheetFunction».

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

Обычно это приводит к ошибкам при первом поиске vlookup.

Private Sub txtPPAlias_Change()

Dim lot As String
Dim qty As String
Dim itemnumber As String
Dim PPIndex As Range

Set PPIndex = Worksheets("Lookup").Range("R2:S5")


'This looks up the values for the lot number and available quantity. Close to working but not quite.

'Makes sure that the ComboBox has a value, and the length of the Alias is 2 or more
    If cboItemNumber.Value <> "" And Len(txtPPAlias) >= 2 Then

        'Pulls Index number off lookup table
        IndexNumber = WorksheetFunction.VLookup(cboItemNumber.Value, PPIndex, 2, False)

        'Looks for lot number from one of four tables based on Index Number pulled from previous argument
        lot = Choose(IndexNumber, WorksheetFunction.VLookup(txtPPAlias.Value, PET75DTable, 2, False), WorksheetFunction.VLookup(txtPPAlias.Value, PET95ATable, 2, False), WorksheetFunction.VLookup(txtPPAlias.Value, PET70DTable, 2, False), WorksheetFunction.VLookup(txtPPAlias.Value, PET60DTable, 2, False))

        'Looks for quantity based on same argument as previous lookup
        qty = Choose(IndexNumber, WorksheetFunction.VLookup(txtPPAlias.Value, PET75DTable, 3, False), WorksheetFunction.VLookup(txtPPAlias.Value, PET95ATable, 3, False), WorksheetFunction.VLookup(txtPPAlias.Value, PET70DTable, 3, False), WorksheetFunction.VLookup(txtPPAlias.Value, PET60DTable, 3, False))

        'Sets Userform lot textbox to lot value
        txtLotNumber.Value = lot

        'Sets Userform qty textbox to qty value
        txtAvailableQuantity.Value = qty

    End If

End Sub

Предполагается, что txtLotNumber.Value должен показывать полный номер лота, а txtAvailableQuantity.Value должен возвращать значение количества из таблицы.

Я не получил его вТочка, где он обеспечивает вывод еще.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Попробуйте вариант выбора, а не Выбор, аналогично (предполагается, что столбцы от A до L; также предполагается, что вы работаете только с этими 4 элементами):

Dim a as long
With Sheets("Lookup")
    Select Case ItemNumber
        Case 14901
            a = 1
        Case 14899
            a = 4
        Case 14892
            a = 7
        Case 14886
            a = 10
    End Select
    txtLotNumber.Value = application.index(.columns(a+1),application.match(txtPPAlias.Value,.columns(a),0))
    txtAvailableQuantity.Value = application.index(.columns(a+2),application.match(txtPPAlias.Value,.columns(a),0))
End With

Если у вас естьбольше, чем просто эти 4 продукта, я бы порекомендовал несколько вещей, начиная с того, что не объединяйте ячейки для ярлыков.Вы можете использовать Find для определения столбца, а затем использовать номер этого столбца для определения других столбцов.Вышесказанное можно еще больше упростить так, чтобы:

dim fnd as long
With Sheets("Lookup")
    fnd = .rows(1).find(What:=ItemNumber, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False).column
    txtLotNumber.Value = application.index(.columns(fnd+1),application.match(txtPPAlias.Value,.columns(fnd),0))
    txtAvailableQuantity.Value = application.index(.columns(fnd+2),application.match(txtPPAlias.Value,.columns(fnd),0))
End With

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

Обратите внимание, что оба бита кода не проверены.

0 голосов
/ 22 марта 2019

Вы упоминаете, что ваш диапазон поиска имеет номера.Это числовые числа или текстовые числа?Если они являются числовыми числами, то ваш vLookup может завершиться сбоем, потому что ваша комбинация возвращает текстовую версию номера, и поиск текстового номера в диапазоне числовых чисел не будет работать.Вы можете попробовать поместить, например, CInt () вокруг комбо-значения в первом поиске.

Я бы также попытался еще больше урезать проблему.

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

Вы объявляете большинство своих переменных, что хорошо, но вы не объявили IndexNumber.

С уважением

Пол Саймон

...