使用“选择/ vlookup”功能在基于用户表单输入的查找表之间进行选择时遇到错误

时间:2019-03-22 18:45:41

标签: excel vba userform

我正在为我的工作设置VBA用户窗体功能,该功能根据零件号和批号显示剩余的可用订购数量。

当我在普通excel单元格中将“选择”功能与Vlookup结合使用时,该功能可以完美运行。当我尝试将其转换为VBA并合并组合框/文本框进行查找时,它会出错或没有向指定的文本框返回任何内容。

索引表有两列,一列带有零件号,一列带有索引号。

其他表具有别名(批次的简称),批次和数量。它们用零件号分隔。

通常,我只会收到“ 1004”错误:“无法获取WorksheetFunction类的VLookup属性”。

我了解到,当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 :(得分:0)

您提到您的查找范围包含数字。这些数字或文字是数字吗?如果它们是数字,则您的vLookup可能会失败,因为您的组合正在返回该数字的文本版本,并且无法在数字范围内查找文本。您可以尝试在第一次查找中将例如CInt()放在组合值周围。

我还将尝试进一步减少问题。

首先将组合值放入变量中,以便您可以逐步执行代码并检查该值,以确保在执行vlookup之前确定该值正确。

您声明的大多数变量都是好的,但尚未声明IndexNumber。

致谢

Paul Simon

答案 1 :(得分:0)

尝试类似选择情况,而不是选择(假设列是从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

如果您不仅仅拥有这四种产品,那么我将建议您做一些事情,首先是不要合并单元格中的标签。您可以使用“查找”来确定一列,然后使用该列号来指示其他列。上面的内容可以进一步简化为:

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

假设您有商品编号,没有产品名称,没有合并(只是为了确保在正确的列中找到正确的值)。

请注意,代码的两个位都未经测试。