Userform:索引匹配条件

时间:2015-11-14 15:21:30

标签: excel excel-vba vba

我的用户表单包括供应商(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表中插入了数据。

2 个答案:

答案 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"

如果您需要更好的解释,请写下评论。