gpt4 book ai didi

vba - 删除无法用 SpecialCells 抓取的行的最快方法

转载 作者:行者123 更新时间:2023-12-04 21:08:05 26 4
gpt4 key购买 nike

基于 on another question在这个网站上,我开始想知道删除具有特定条件的所有行的最快方法。

上面提到的问题有各种解决方案:

(1)循环遍历工作表上的所有行(向后),将所有满足条件的行一一删除。

(2) 首先将适用范围移动到数组中,然后评估数组中的条件,并在此基础上一一删除底层工作表上的所有行。

一个可能的改进可能是删除 block 中的所有行以减少访问工作表的开销。但是如果你走这条路,那么在你实际删除它们之前,你有多种选择来“存储”这些范围:

(1) 使用Intersect合并应该删除的范围。

(2) 简单写一个String所有要删除的行。

那么,最快的方法是什么?

最佳答案

一种有效的解决方案是通过对标签进行排序来标记所有行以保留并在最后移动所有行以删除。
这样,复杂性不会随着要删除的行数而增加。

此示例在不到一秒的时间内删除了 50000 行,其中列 I 的所有行等于 2 :

Sub DeleteMatchingRows()
Dim rgTable As Range, rgTags As Range, data(), tags(), count&, r&

' load the data in an array
Set rgTable = ActiveSheet.UsedRange
data = rgTable.Value

' tag all the rows to keep with the row number. Leave empty otherwise.
ReDim tags(1 To UBound(data), 1 To 1)
tags(1, 1) = 1 ' keep the header
For r = 2 To UBound(data)
If data(r, 9) <> 2 Then tags(r, 1) = r ' if column I <> 2 keep the row
Next

' insert the tags in the last column on the right
Set rgTags = rgTable.Columns(rgTable.Columns.count + 1)
rgTags.Value = tags

' sort the rows on the tags which will move the rows to delete at the end
Union(rgTable, rgTags).Sort key1:=rgTags, Orientation:=xlTopToBottom, Header:=xlYes
count = rgTags.End(xlDown).Row

' delete the tags on the right and the rows that weren't tagged
rgTags.EntireColumn.Delete
rgTable.Resize(UBound(data) - count + 1).Offset(count).EntireRow.Delete
End Sub

请注意,它不会改变行的顺序。

关于vba - 删除无法用 SpecialCells 抓取的行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36873359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com