【问题标题】:Array slicing based on filter基于过滤器的数组切片
【发布时间】:2015-09-13 09:13:36
【问题描述】:

我正在尝试按特定列过滤 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

【问题讨论】:

    标签: arrays excel vba filter slice


    【解决方案1】:

    解决方案

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

    2. 找到 Hard/Soft 项目结束的行 - 只需用 COUNTIF 计算 Hard 或 Soft 的数量,以先到者为准,并获得所需的单元格范围 FROMTO 用于HardSoft 项目

    3. 使用wsCopyTo.Range("A[FROM]:BR[TO]").Value简单地将HardSoft的部分复制到数组arr_Hard和数组arr_Hard

    【讨论】:

    • 这将运行时间从每行大约 1 秒提高到 15k 行的 2-5 秒。谢谢!
    • 很高兴听到这个消息:)。
    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2019-10-14
    相关资源
    最近更新 更多