Excel Userform:索引匹配条件
我有一个由供应商(combobox1)、产品(combobox2)、单价(textbox1)组成的用户表单 我希望当我在userform中选择供应商和产品时,单价将自动查找excel数据表(AddProduct)并获得单价结果 在AddProduct sheet中,我的供应商在A2:A10列,产品在B2:B10列,单价在C2:C10列 我的代码如下所示:Excel Userform:索引匹配条件,excel,vba,Excel,Vba,我有一个由供应商(combobox1)、产品(combobox2)、单价(textbox1)组成的用户表单 我希望当我在userform中选择供应商和产品时,单价将自动查找excel数据表(AddProduct)并获得单价结果 在AddProduct sheet中,我的供应商在A2:A10列,产品在B2:B10列,单价在C2:C10列 我的代码如下所示: Dim ReturnVal As Variant ReturnVal = Evaluate("=INDEX('AddProduct'!$C
Dim ReturnVal As Variant
ReturnVal = Evaluate("=INDEX('AddProduct'!$C$2:$C$10,MATCH(1,(""" & Me.ComboBox1.Value & """='AddProduct'!$A$2:$A$10)*(""" & Me.ComboBox2.Value & """='AddProduct'!$B$2:$B$10),0))")
If Not IsError(ReturnVal) Then
Me.TextBox1.Value = ReturnVal
Else
Me.TextBox1.Value = "N/A"
End If
表单的事实是它将返回N/A,尽管我在AddProduct sheet中插入了数据。我会这样做: 1) 插入辅助列。在“AddProduct”上插入新的列a。在该列中添加以下公式:
= B2 & C2
它将供应商和产品连接成一个字符串。如果需要,可以隐藏此列。如果你用这个相对公式做整列,你就不必担心新产品,它总是把值放在A列
2) 然后用此行替换上面的所有代码:
Me.textbox1.Value = WorksheetFunction.IfError(Application.VLookup(Me.combobox1.Value & _
Me.combobox2.Value, Sheets("AddProduct").Range("A2:D10"), 4, False), "N/A")
如果不在Vlookup上使用工作表功能
,它将允许错误进入IfError检查
编辑。我学到了一些新东西。我会通过索引/匹配这样做:
Me.textbox1.Value = WorksheetFunction.IfError(Application.Index(Sheets("AddProduct").Range("C:C"), _
WorksheetFunction.Match(Me.combobox1.Value & Me.combobox2.Value, Sheets("AddProduct").Range("A:A") & _
Sheets("AddProduct").Range("B:B"), 0)), "N/A")
这不需要助手列,可以使用您现有的内容。大多数
工作表功能的运行速度比循环行慢。特别是如果您能够像本例中那样跳过其中的一部分
Sub test()
Dim i As Long
With Worksheets("AddProduct")
For i = 2 To 10
If .Cells(i, 1).Value = ComboBox1.Value And .Cells(i, 2).Value = ComboBox2.Value Then TextBox1.Value = .Cells(i, 2).Value: Exit Sub
Next
End With
TextBox1.Value = "N/A"
End Sub
这个Sub
只是从第二行到第十行逐行检查。如果有匹配项,它将把单元格的值放在文本框的第三列,并退出子项。(如果找到匹配项,它将跳过TextBox1.Value=“N/A”
)
如果你需要更好的解释,就写一条评论。@user36896989学到了一些新东西,决定编辑我的答案。