【问题标题】:INDEX MATCH VBA (return a value based on two criteria)INDEX MATCH VBA(根据两个条件返回一个值)
【发布时间】:2015-06-17 13:15:43
【问题描述】:

我正在为一位客户做一些工作,他们会收到一份关于客户和地区的每周报告(工作表中的两列,A 代表客户,B 代表地区)。 * 为了清楚起见,我省略了此电子表格中的其他列

他们需要将此电子表格上的价格与参考电子表格(我们称之为价格)相匹配。每个客户和区域组合都会产生一个存储在上述参考电子表格中的特定价格(在此参考工作表 [价格] 中,A 列是客户,B 列是区域,C 列是 B 区域中 A 客户的价格) .

我想做的是:

基于 A1(客户)和 B1(地区),C1 应该是(参考工作表上的价格查找值)。

传统的 vlookup 功能不起作用,因为需要满足多个条件(即我们可能对不同地区的同一客户有不同的价格)。

我尝试了以下没有成功

Dim ULastRow As Long
ActiveWorkbook.Worksheets(ActiveSheet.Name).UsedRange
ULastRow = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row

Range("C2").FormulaR1C1 = _
"=Index(Range("C:C"), Match(Range("Prices!C1"), Range("Prices!C2:B34"), 0), 0)"
Selection.AutoFill Destination:=Range("C2:C2" & ULastRow)

有关数据示例,请参阅以下链接(不幸的是,我无法在线添加它们:

客户得到什么:https://copy.com/EBABGl2EFjyFWcIH

“价格”或参考数据https://copy.com/oSSJuu7Dk4ox84tz

任何建议将不胜感激。

提前致谢!

【问题讨论】:

  • 我理解正确吗?:您有一个包含 A、B 和 C 列及其各自信息的工作表。而你想根据A和B来选择C的值?
  • 为什么需要 VBA 而不仅仅是 Excel 中的一些查找函数?
  • 您可以输入带有索引/匹配的数组公式,以根据多个条件进行查找。这将是公式,您可以将其转换为 VBA。我只是弥补并说您试图在 F 列中返回一些内容:=index(F:F,match(A1&B1,CustomerRange&RegionRange,0)) 并使用 CTRL+SHIFT+ENTER 输入
  • daZza,好问题,我会在编辑中澄清。谢谢!
  • 仍然不完全确定我是否正确理解了您的情况:P 因此,您有 1 个工作表,其中只有 A 列和 B 列,除此之外,您还有另一个名为“价格”的工作表,它是 A 列,B和C?在这种情况下,第一个工作表将完全没用,因为您将所有信息都存储在“价格”中。从该列中选择 C ​​列应该像我下面的答案一样工作。你试过了吗?

标签: vba excel lookup formulas


【解决方案1】:

恕我直言,这是“使用数据库而不是 Excel”的经典案例,尤其是如果您想定期进行此类查询。

但是,这样的事情应该可以在 VBA 中实现您想要的:

Dim customer As String
Dim region As String
Dim price as Double

For r = 2 To ThisWorkbook.Worksheets("Client").UsedRange.Rows.Count

        customer = ThisWorkbook.Worksheets("Client").Cells(r, 1).Value
        region = ThisWorkbook.Worksheets("Client").Cells(r, 2).Value
        price = 0.00

    For s = 2 To ThisWorkbook.Worksheets("Prices").UsedRange.Rows.Count


        If ThisWorkbook.Worksheets("Prices").Cells(s, 1).Value = customer And ThisWorkbook.Worksheets("Prices").Cells(s, 2).Value = region Then

            price = ThisWorkbook.Worksheets("Prices").Cells(s, 3).Value
            Exit For

        End If

    Next

        If price = 0.00 Then
            ThisWorkbook.Worksheets("Client").Cells(r, 3).Value = "This customer/region combination is not stored in the reference sheet"
        Else
            ThisWorkbook.Worksheets("Client").Cells(r, 3).Value = price
        End If
Next

相应地更改您的工作表和起始行 (r)

【讨论】:

  • 谢谢@daZza。我收到错误:编译错误:对于已在使用的控制变量。如果我删除第二个 for 语句,我会收到错误:For r = 2 To ThisWorkbook.Worksheets("Client").UsedRange.Rows.Count 的“运行时错误 '9':下标超出范围”。有什么建议吗?
  • 猜你复制我的语句太快了:P 复制 for 子句后不小心没有更改计数器变量。现在应该解决这个问题。对于超出范围的错误:我很确定在实际数据下方存在“不可见内容”的行。这是使用相当简单的UsedRange.Rows.Count 的缺点。尝试手动选择实际数据结束的行下方的几行,然后右键单击并删除行。这也可能是由无效的工作表名称引起的(您是否将其更改为实际名称?您也可以使用数字代替)
  • 非常感谢!我通过使用获取最后一行的不同方法解决了超出范围错误:Dim LastRow As Long Set sht = ActiveWorkbook.Worksheets(ActiveSheet.Name) ActiveWorkbook.Worksheets(ActiveSheet.Name).UsedRange LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row 并将ThisWorkbook 更改为ActiveWorkbook
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 2013-11-07
  • 2019-10-09
  • 2023-03-15
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
相关资源
最近更新 更多