【问题标题】:VBA - Index / Match function with multiple criteriaVBA - 具有多个条件的索引/匹配功能
【发布时间】:2013-08-30 01:05:39
【问题描述】:

尝试在 VBA 中编译多标准索引/匹配代码时遇到问题。这可能很简单 - 但我对 VBA 还很陌生,我在这里发现的任何东西都没有。

示例: 我在指定范围内有大量数据:Sheets("CustomerAccounts").Range(CustomerSheetRange)) - 我需要 VBA 通过检查三个条件从标题为“值”的列返回数据:客户 = X、类型 = 外部、起源国 = 阿联酋(列在原始电子表格) 标准存储在宏用户预先设置的单独变量中。

Customer   | Type      | Origin        | Destination        |  Values
X          | Internal  | UAE           |  SA                |  Value 1
Y          | Internal  | UAE           |  SA                |  Value 2
X          | External  | UAE           |  SA                |  Value 3
X          | External  | ZA            |  UAE               |  Value 4

目前我有以下(相当庞大的)代码,它使用一个标准 - OriginCountry 变量来查找值。 代码在预先指定的列 - OriginCountryColumn 中搜索它。

ResultString = Application.Index(Sheets("CustomerAccounts").Range(CustomerSheetRange), Application.Match(OriginCountry, Sheets("CustomerAccounts").Range(OriginCountryColumn), 0), Application.Match("Values", Sheets("CustomerAccounts").Range(TitleRowCust), 0))

我想修改代码以匹配类型和客户。 是否可以扩展上述 Index/Matxh 函数 - 或者我应该使用不同的方法?

感谢任何建议。

【问题讨论】:

  • 为什么不使用数据透视表或自动过滤器?

标签: vba excel


【解决方案1】:

首先,将包含数据的范围格式化为表格(请参阅http://office.microsoft.com/en-001/excel-help/quick-start-create-an-excel-table-HA010359200.aspx 了解如何执行此操作)。完成后,使用以下 VBA 代码:

SomeCustomer = Range("...").Value
SomeType = Range("...").Value
SomeOrigin = Range("...").Value
ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=1, Criteria=SomeCustomer
ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=2, Criteria=SomeType
ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=3, Criteria=SomeOrigin

注意事项:

  • 您可能需要根据您的特定需求自定义此宏
  • 可以通过公式>名称管理器找到/修改表的名称
  • ActiveSheet 可能会修改为您正在使用的实际工作表

【讨论】:

    【解决方案2】:

    您可以逐行检查匹配项:

    Dim row as Long
    With Sheets("CustomerAccounts").Range(CustomerSheetRange))
        For row = 2 To .Rows.Count 'Starts in 2 to ignore header!
            If .Cells(row, costumerCol).Value Like costumerCriteria And .Cells(row, typeCol).Value Like typeCriteria And .Cells(row, originCol).Value Like originCriteria Then
                'This is a match!
                Debug.Print .Cells(row, valueCol)
            End if
        Next
    End With
    

    您必须将costumerColtypeColoriginColvalueCol 替换为相应的列号,并将costumerCriteriatypeCriteriaoriginCriteria 替换为指定的条件。

    如果列索引也是可变的,请在遍历行之前在第一行中搜索它们。

    【讨论】:

    • 谢谢,这种方法正是我需要的。
    • 这是一个很棒的方法!万分感谢。它完全取代了我的硬代码 :) 这就是我以前的: Range("E15").FormulaArray = "=INDEX('EMPLOYEE LIST'!A:P,MATCH(1,('EMPLOYEE LIST'!A: A=D5)*('员工名单'!B:B=I5),0),12)"
    猜你喜欢
    • 2019-06-15
    • 2016-09-24
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2017-10-22
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多