2014-12-04 62 views
-1

我有一个电子表格,可以从3种不同类型的文件中导入一堆数据。它将其格式化为使所有三个输出都相同,在一种情况下,需要根据该行的单元格中的内容删除行。问题是,这需要花费大约1.5到2分钟的时间,而其他文件的格式化所花费的时间(没有删除梯级的时间)需要花费几秒钟。工作表开始大约4000行,并删除其中约1600。我目前的做法工作正常,一切正常,但有没有办法做到这一点会跑得更快?需要关于如何加快这一位代码的建议

rw = 1 
Lastrow = 2600 
NewRow = 0 

NxtChk2: 
    If (Worksheets("ARCSRT.CND").Cells(rw, "c") >= "0") And (Worksheets("ARCSRT.CND").Cells(rw, "d") = "") Then 
     Worksheets("ARCSRT.CND").Rows(rw).EntireRow.Delete 
     rw = rw - 1 
    End If 
    If (Worksheets("ARCSRT.CND").Cells(rw, "b") = "0.0") And (Worksheets("ARCSRT.CND").Cells(rw, "c") = "") Then 
     Worksheets("ARCSRT.CND").Rows(rw).EntireRow.Delete 
     rw = rw - 1 
    End If 
    If rw = Lastrow Then GoTo LATER 
    rw = rw + 1 
GoTo NxtChk2 
+1

首先,关闭screenupdating,将计算设置为手动,并禁用事件。如果这样做不够快,可以尝试使用数组和集合来完成VBA中的所有工作,以避免多次读取/写入工作表。请参阅Chip Pearson的网站,了解如何在单个步骤中将数组读取和写入一个范围。 – 2014-12-04 13:24:29

+0

一切已经关闭,这就是为什么其他两种文件类型运行得足够快。我没有尝试过阵列,并会检查出芯片网站。谢谢。 – oshoguno 2014-12-04 14:00:15

+0

David,我看不出你的链接或下面的答案与我的问题有什么关系。我正在问如何加快在Excel中删除横档,而不是在Word中替换单词。我不知道你们两个在说什么,除非我有什么遗漏。 – oshoguno 2014-12-04 18:21:42

回答

0

,请尝试以下
这个循环之前去:
Dim rng As Range

Set rng = Nothing

的循环,而不是排

删除做到这一点:

If rng = Nothing Then
rng = Cells(rw, "A")
Else
rng = Union(rng, Cells(rw, "A"))
End If

再经过循环完成:

rng.EntireRow.Delete

记住我不知道它是如何将在1600非连续的行运行,在备份副本上运行

+0

我最终使用了你的答案变体和Chris Neilsen提供的答案。你在标记线路然后将其添加到一个范围内,然后一次删除整个范围的速度会更快。我知道根据我现有的标准标记我的线,然后使用Siddharth Rout答案中的代码来设置和删除范围。我的宏运行周期已经下降到大约1分钟。感谢您的帮助。 – oshoguno 2014-12-08 15:06:31

0

如果列表的排序是一种选择,而不是逐个删除一行只是将它们标记有“旗帜”,在一个单独的列,即字母“X”,一旦周期结束后,让你的代码要对该列上的数据进行排序,并一次删除整批标记的行,它将执行一次删除操作而不是1600次。从我的评论如下

+0

非常有趣,我仍然需要逐行使用代码来确定是否需要删除行并将其标记。这比直接删除该行更快吗? (是否将X放入单元格的过程比删除行更快?)如果我需要维护其他两个文件的格式,则在删除行之后,如果不按照相同的顺序放回数据,我无法对其进行排序。我的另一个想法是如何一次删除1600个不相邻的行?我很欣赏投入! – oshoguno 2014-12-04 19:22:50

+0

英里更快。它与删除数百行的比较类似,在某些不连续的标准上筛选出来,与删除相同的行相比较,但首先在筛选的标准上进行排序。 P.S.我试图尝试构建需要删除的所有行的联合,但它不会保留那么多行来删除,粗略计数,它将达到100个上限。 P.P.S如何做相反的循环:从下往上删除行也是更快? – Raugmor 2014-12-04 19:50:32

+0

实际上尝试了下面的方法,'dim rng as Range','set rng = Nothing',然后代替行删除尝试以下内容: '如果rng = Nothing然后 rng = Cells(rw,“A”) 其他 RNG =联盟(RNG,细胞(RW,“A”)) 结束如果 ' 再经过整个循环跑这样做:'rng.EntireRow.Delete ' 请注意我不知道它怎么会在1600个非连续范围上工作,所以在备份文件上也是如此 PS嗯,我真的应该弄清楚如何用换行符以更好的方式进行评论,将在一个单独的答案中发布代码 – Raugmor 2014-12-04 20:05:16