作者sarcasm ()
看板Visual_Basic
标题[VBA ] 提升Excel逐行判断执行效率
时间Tue Jul 28 01:24:43 2015
为了跑公司资料分析自己透过vba简单写了一段整理raw data格式
目前已可正常执行省下大量人工处理的时间
但其中有一段做逐行判断会跑特别久
即便是在最新的i7四核笔电上跑,有时还是会跑到无回应...
因此想请教是否有较有效率的写法
经过分段测试,跑最久的是这段
资料量约近万笔(列)、每笔约100+栏位(栏)
---------------------------------------------------------
Sub Clear_Row()
'
' Delete blank row
'
Dim LastRow As Integer, r As Integer
Sheets("raw_data").Select
Range("A1").Select
Selection.End(xlDown).Select
LastRow = ActiveCell.Row
Application.ScreenUpdating = False
For r = LastRow To 2 Step -1
If Application.WorksheetFunction.Sum(Range(Cells(r, 4),_
Cells(r,100))) = 0 Or Cells(r, 2) = "WW" Then
Rows(r).Delete
End If
Next r
Application.ScreenUpdating = True
End Sub
---------------------------------------------------------
基本上做的事情就是
1.找到整串资料的最後一笔
2.由下而上判断该笔资料是否第二拦是WW 或 第4~100栏位是0
3.若是则删除该笔资料、否则跳过
---------------------------------------------------------
另外那行If中
其实第一个条件是想判断第4~100栏是否全为0,但我不知道怎麽写...
因raw data暂时不会出现负数相抵就先用sum的方式偷吃步
但还是想问问正确的做法,以免未来要处理负数的情况
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.240.178.251
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Visual_Basic/M.1438017887.A.EA4.html
1F:→ MOONRAKER: 没什麽好办法,你顶多可以改用loop...until 07/28 02:49
2F:→ MOONRAKER: 抱歉上面跳过,那没什麽用 07/28 02:52
3F:→ MOONRAKER: 顶多把cells(r,2)="WW"放前面 或乾脆分开写 看会不会比 07/28 02:53
4F:→ MOONRAKER: 较快 你要检查4-100行是不是都0 唯一的办法就是全都看 07/28 02:54
5F:→ MOONRAKER: 过一次 一万列就是97万格 不可能多快 07/28 02:54
6F:→ MOONRAKER: 又者我很怀疑叫用工作表函数的效率 你可以多用一个for 07/28 02:56
7F:→ MOONRAKER: 来检查是不是都0 看是快还是慢 07/28 02:56
8F:→ hulapig: 可以加abs()函数,让所有4至100栏的数字必为正值 07/28 06:01
9F:推 knstt: 你需要的是加Application.Calculation=xlCalculationManual 07/28 13:10
10F:→ knstt: 应该可大符提升速度 07/28 13:10
原来我弄错了?!
11F:推 ClubT: 你可以先把要删除的列数记下来,最後再一次删除应该会快点 07/28 15:56
12F:→ ClubT: Sheet1.Range("2:3,5:5").Delete shift:=xlUp 07/28 16:00
13F:→ ClubT: 另外可以用CountIF的函数 07/28 16:08
14F:→ ClubT: 我认为慢的部分应该是删除的部分而不是判断式的部分 07/28 16:08
交叉测试了一下"删除"这动作本身应该是最久的...
※ 编辑: sarcasm (114.34.85.249), 07/29/2015 14:20:40
15F:→ biglongtoday: 用specialcells 07/30 09:18
16F:→ hulapig: 如果不删,将该列复制到另一个工作表,最後删除原始工作表 07/30 11:30
17F:→ hulapig: 不知道会不会比较快 07/30 11:36
18F:推 Yaiba: 先移动到最下面再一次删除应该可以省时间?! 07/30 16:53
19F:推 olycats: 多加入一栏,下公式判断是否要删除,最後针对该栏筛选 08/08 13:14
20F:→ olycats: 筛选出来後一次删除 这样或许会比较快 08/08 13:15
21F:→ olycats: 判断全为零 min=0 and max=0 如果资料都是数值的话 08/08 13:16