Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 基于多个条件提取项目的更好方法?_Vba_Excel_Excel Formula - Fatal编程技术网

Vba 基于多个条件提取项目的更好方法?

Vba 基于多个条件提取项目的更好方法?,vba,excel,excel-formula,Vba,Excel,Excel Formula,我有一个大约40000-60000行的数据范围,格式如下: CustomerID | Item_Code | Product 我需要选择所有的客户ID,这些ID与特定的项目(u代码)和产品(通常少于1000行)匹配 我编写了以下公式,粘贴为数组公式: =IFERROR( INDEX( MyDataRange, SMALL( IF(

我有一个大约40000-60000行的数据范围,格式如下:

CustomerID | Item_Code | Product 
我需要选择所有的客户ID,这些ID与特定的项目(u代码)和产品(通常少于1000行)匹配

我编写了以下公式,粘贴为数组公式:

=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\u CodeRange”和“ProductRange”匹配的项目,这两个项目都是使用
VBA
更改的命名范围。公式的“
小(
”和“
行(
”部分只是根据它们在数组中的位置将它们从最小到最大排列

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


是否有更好的方法查询此信息以最大限度地提高速度?

非VBA方法

您可以手动设置自动筛选。要了解有关自动筛选的详细信息,请参阅

VBA方法

假设您的工作表如下所示

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

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
输出


非VBA方法

您可以手动设置自动筛选。要了解有关自动筛选的详细信息,请参阅

VBA方法

假设您的工作表如下所示

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

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
输出


@pnuts我尝试过数据透视表解决方案,但必须循环所有可能的条件才能将其设置为“visible=false”,结果花费的时间比数组公式长。我支持Sid对自动筛选的建议。您尝试过吗?@pnuts我尝试过数据透视表解决方案,但必须循环所有可能的条件才能将其设置为“visibl”e=false'最终花费的时间比数组公式要长。我支持Sid对autofilter的建议。您尝试过吗?谢谢siddharth,autofilter是一种方法,它比数据透视表快得多!谢谢siddharth,autofilter是一种方法,它比数据透视表快得多!