基于过滤器的数组切片

Array slicing based on filter

我正在尝试按特定列过滤 20000 行和 70 列的数组。如果第 14 列中的值为 "Hard",我想将整行复制到另一个数组。我想出了一个非常简单的实现并尝试使用它但是 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

解决方案

  1. 按 Hard/Soft 列(降序或升序)对原始工作表 中的项目进行排序。如果由于某种原因无法排序,请将原始工作表复制到新工作表。

  2. 找到 Hard/Soft 项结束的行 - 只需用 COUNTIF 计算硬或软的数量,以先到者为准,并为 HardSoft 项目

  3. 获取所需的单元格范围 FROMTO
  4. 使用wsCopyTo.Range("A[FROM]:BR[TO]").Value简单的复制HardSoft的部分到数组arr_Hard 和数组 arr_Hard