Excel Userform:索引匹配条件

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

我有一个由供应商(combobox1)、产品(combobox2)、单价(textbox1)组成的用户表单

我希望当我在userform中选择供应商和产品时,单价将自动查找excel数据表(AddProduct)并获得单价结果

在AddProduct sheet中,我的供应商在A2:A10列,产品在B2:B10列,单价在C2:C10列

我的代码如下所示:

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学到了一些新东西,决定编辑我的答案。