根据多个标准提取项目的更好方法是什么?

时间:2013-12-10 14:51:41

标签: excel vba excel-vba excel-formula

我有一系列大约40,000-60,000行的数据,格式如下:

CustomerID | Item_Code | Product 

我需要选择所有 CustomerID ,它们与特定 Item_code 产品相匹配,通常少于1,000行。

我写了下面的公式,它被粘贴为数组公式:

=IFERROR(
         INDEX(
               MyDataRange,
               SMALL(
                     IF(
                           (Item_Code=Item_CodeRange)*(Product=ProductRange),
                           ROW(Item_Code)-ROW($C$2)+1,
                           ROW($C$100000)
                       ),
                     ROW()-1
                    ),
               1
              ), 
        0)

为我的数据编制索引并返回与“ Item_CodeRange ”和“ ProductRange ”匹配的项目,这些项目的命名范围已更改为VBA。公式的“Small(”和“row(”部分只是根据它们在数组中的位置从最小到最大按顺序排列。

我每分钟都会粘贴这个公式几次 Item_codeRange DayRange 我需要迭代,其中大约有250种组合。正是这个数组公式在我的程序中占用了大部分时间。

有没有更好的方法来查询此信息以最大化速度?

1 个答案:

答案 0 :(得分:1)

非VBA方法

您可以手动设置自动过滤器。要了解有关自动筛选的详情,请参阅THIS

VBA方法

让我们说你的工作表看起来像这样。

enter image description here

使用此代码。请注意,这只是一个示例代码,您必须根据自己的情况对其进行编辑。

Sub Sample()
    Dim ws As Worksheet
    Dim MyRange As Range
    Dim CustomerID As String, Item_Code As String, Product As String

    Dim lRow As Long

    CustomerID = "100"
    Item_Code = "ABC"
    Product = "Blah Blah"

    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        Set MyRange = .Range("A1:C" & lRow)

        '~~> Remove any filters
        .AutoFilterMode = False

        With MyRange
            .AutoFilter Field:=1, Criteria1:="=" & CustomerID
            .AutoFilter Field:=2, Criteria1:="=" & Item_Code
            .AutoFilter Field:=3, Criteria1:="=" & Product
        End With

        '~~> Remove any filters
        '.AutoFilterMode = False
    End With
End Sub

<强>输出

enter image description here