我正在为我的工作设置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应该返回表中的数量值。
我还没有达到它提供输出的地步。
答案 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
假设您有商品编号,没有产品名称,没有合并(只是为了确保在正确的列中找到正确的值)。
请注意,代码的两个位都未经测试。