我的用户表单包括供应商(combobox1),产品(combobox2),单价(textbox1)
我希望当我在userform中选择供应商和产品时,单价将自动查找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
表单的事实是它将返回N / A,尽管我在AddProduct表中插入了数据。
答案 0 :(得分:1)
我这样做的方式是:
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上使用WorksheetFunction
,它将允许错误传递到IfError Check。
编辑。学到了新的东西。我会用index / match这样做:
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")
这不需要帮助列,并且可以使用您拥有的内容。
答案 1 :(得分:0)
大多数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
只是从第二行开始逐行检查直到第十行。如果匹配,则会将单元格的值放在文本框的第3列中,然后退出Sub
。 (如果找到匹配,它将跳过TextBox1.Value = "N/A"
)
如果您需要更好的解释,请写下评论。