- 不需要计算的时候, 关计算。(Application.Calculation = xlCalculationManual)。中间需要calculate的话,可以用sheet.calculate range.calculate 做局部计算。
- 运行关screen update (Application.ScreenUpdating = False)
- 运行关event (Application.EnableEvents = False)
- 减少写入单元格的次数,尽量批量写入,loop尽量在array里面做。例子:
'不要用循环将数据加到数组里面去,这样速度跟在表里面做处理没有什么区别 ReDim arrRng(3 To FinalRow, 5 To FinalColumn) ReDim arrISO(7 To FinalRow, 1 To colISO.Count) For r = 3 To FinalRow For c = 5 To FinalColumn arrRng(r, c) = Cells(r, c) Next c Next r '一次处理写入和输出 arrRng = .Range("A1:E1000") Range("F1").Resize(UBound(arrRng), UBound(arrRng, 2)) = arrRng
- Filter 数组,join然后用instr 搜查速度极快.
- 不用select,尽量避免activate。
- Copy直接可以用 range(a).value=range(b).value, 如果value不是日期,还可以用value2代替 value。配合使用resize设定目标单元格区域比较方便,例子:
Set S = Sheets(1).Range("A9:C9") Sheets(2).Range("B1").Resize(S.Rows.Count, _ S.Columns.Count).Value2 = S.Value2
- 尽量用autofilter, advancedfilter, find 代替循环。 用循环的话,for each item in object 型的循环 又比其他循环要好一些。
'慢 For i = 1 to 1000 if Cells(i,1) = 1 then Cells(i,2).Value = 2 Next i '快 For...Each配合offset 用,就可以处理对应单元格前后左右的数据 Dim tmpCell as Range For Each tmpCell in Range("A1:A1000") if tmpCell=1 then tmpCell.offset(0,1) = 2 next i '更快 用countif先确定Loop多少次 Dim L As Integer Dim R As Range Dim I As Integer L = WorksheetFunction.CountIf(Columns(1), 1) Set R = Range("A1") For i = 1 To L Set R = Columns(1).Find(What:=1, After:=R, _ LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=True) R.offset(0,1) = 2 Next i
- 预先排序在做搜索(match, vlookup),速度会快很多。
- Define 变量种类
- Excel 的自动Table计算和操作都比较慢。 暂时想到这么多。1,2,3 记得最后程序结束的时候要开回来。还有error 处理用标签的话,标签内也要开回来。