百科问答小站 logo
百科问答小站 font logo



怎么给VBA代码提速? 第1页

  

user avatar   wu-qi-ren 网友的相关建议: 
      
  • 不需要计算的时候, 关计算。(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 处理用标签的话,标签内也要开回来。



  

相关话题

  财务工作必备的 Excel 技能有哪些? 
  为什么Powershell可以在源码中直接调用.NET类,而VBA只能调用.NET DLL? 
  2021 年了,Office 会不会逐步「消灭」掉 WPS? 
  你用过哪些强大的快捷键? 
  面向对象(OOP)是编程语言发展中的弯路吗?为什么? 
  对象和实例的在不同编程语言中的有什么区别? 
  Java 中的多态是不是违背了里氏替换原则? 
  高内聚低耦合是矛盾的吗? 
  面向对象编程中, 接口既然不能直接描述方法, 要他有何用? 
  什么时候用C而不用C++? 

前一个讨论
电动车撞人,撞完我以后跑掉了,骶骨骨折,需要休息三个月,今天交警说人找到了,请问要多少赔偿合适?
下一个讨论
如何看待女子强行入住酒店又要全额退款遭拒,临走做惊人操作破坏酒店房间?她需要承担什么责任?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利