Arrays 基于滤波器的阵列切片

Arrays 基于滤波器的阵列切片,arrays,excel,vba,filter,slice,Arrays,Excel,Vba,Filter,Slice,我试图通过一个特定的列过滤20000行和70列的数组。如果第14列中的值为“硬”,我想将整行复制到另一个数组。我提出了一个非常简单的实现,并尝试使用它,但Excel并没有在每次崩溃时都做出响应。然后我在循环中添加了DoEvents,这样excel就不会崩溃。目前我的代码如下所示。如果社区能帮助我优化它,那会有很大帮助。现在花的时间太多了 我是否可以使用其他函数来切片数组,而不是索引,这样可以更快地工作 Dim arr_all() As Variant Dim arr_Hard(1 To 2000

我试图通过一个特定的列过滤20000行和70列的数组。如果第14列中的值为“硬”,我想将整行复制到另一个数组。我提出了一个非常简单的实现,并尝试使用它,但Excel并没有在每次崩溃时都做出响应。然后我在循环中添加了DoEvents,这样excel就不会崩溃。目前我的代码如下所示。如果社区能帮助我优化它,那会有很大帮助。现在花的时间太多了

我是否可以使用其他函数来切片数组,而不是索引,这样可以更快地工作

Dim arr_all() As Variant
Dim arr_Hard(1 To 20000) As Variant
Dim arr_Soft(1 To 20000) As Variant
Dim arr_Travel() As Variant



arr_all = wsCopyTo.Range("A2:BR20000").Value
m = 1
n = 1
For i = LBound(arr_all) To UBound(arr_all)

    DoEvents

    Select Case arr_all(i, 14)

        Case "Hard"

            arr_Hard(m) = Application.Index(arr_all, i)
            m = m + 1

        Case "Soft"

            arr_Soft(n) = Application.Index(arr_all, i)
            n = n + 1

    End Select


Next i
解决方案
  • 按硬/软列对原始工作表中的项目进行排序(不管是desc还是asc)。如果由于某种原因无法排序,请将原始工作表复制到新工作表

  • 查找硬/软项目结束的行-只需使用
    COUNTIF
    (以先到者为准)计算硬项目或软项目的数量,并获得
    硬项目和
    软项目所需的单元格范围

  • 使用
    wsCopyTo.Range(“A[FROM]:BR[TO]”。值
    只需将
    的部分复制到数组
    和数组


  • 这使得运行时间从每行大约1秒增加到15k行的2-5秒。谢谢很高兴听到:)。