运行 使用 Choose/vlookup 函数出错以根据用户表单输入在查找表之间进行选择

Running into errors with Choose/vlookup functions to choose between lookup tables based on Userform Input

我正在为我的工作设置一个 VBA 用户表单函数,它根据零件号和批号显示剩余的可用数量。

当我在普通 excel 单元格中结合使用 Choose 函数和 Vlookup 时,该函数运行良好。当我尝试将其转换为 VBA 并合并 Combobox/textboxes 进行查找时,它会出错或不会 return 任何指定的文本框。

索引table有两列,一列是部件号,一列是索引号。

其他 table 有别名(批次的简称)、批次和数量。它们由零件号分隔。

通常我只会收到“1004”错误:"Unable to get the VLookup property of the WorksheetFunction class"。

我知道这是一个非常典型的错误,因为当 vlookup 找不到它正在寻找的值时,但我一直在专门测试我知道 tables 上的值我'已经成立。一旦我让它实际工作,我知道如何放入函数来测试该值是否确实存在并放置错误消息等等。

它通常会在第一次 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应该return来自table的数量值。

我还没有达到它提供输出的地步。

您提到您的查找范围有数字。这些数字是数字还是文本数字?如果它们是数字,那么您的 vLookup 可能会失败,因为您的组合正在返回数字的文本版本,并且在数字范围内查找文本数字将不起作用。您可以尝试在第一次查找时将例如 CInt( ) 放在组合值周围。

我也会尽量减少问题。

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

您声明了大部分变量,这很好,但您还没有声明 IndexNumber。

此致

保罗·西蒙

尝试 select 案例,而不是选择,类似于(假设列是 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

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

请注意,这两段代码都未经测试。