用户窗体:索引匹配条件

我有我的用户表单,包括供应商(combobox1),产品(combobox2),单价(textbox1)

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

在AddProduct工作表中,我的供应商是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 

虽然我已经在AddProduct表单中插入数据,但是表单的事实是它将返回N / A。

我会这样做的方式是:

1)插入一个帮手列。 在“AddProduct”上插入一个新的列A. 在该列中添加以下公式:

 = B2 & C2 

将供应商和产品连接成一个string。 如果需要,可以隐藏此列。 如果你用这个相对公式来制作整个专栏,你将不必担心新产品,它总会把A值放在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上的WorksheetFunction,它将允许错误传入IfError Check。

编辑。 学到了新的东西。 我会这样做索引/匹配:

  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") 

这不需要一个帮手专栏,将与你有什么。

大多数WorksheetFunction比较慢,然后简单地循环行。 特别是如果你能跳过这个例子中的一部分。

 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只是从第二行到第十行逐行检查。 如果有匹配,它会将单元格的值放在文本框的第三列中并退出Sub 。 (如果find匹配,它将跳过TextBox1.Value = "N/A"

如果你需要更好的解释,只需写一条评论。