如何加速VBA宏

时间:2010-08-17 06:36:01

标签: performance excel ms-access vba excel-vba

我正在使用宏生成新表格。对于新工作表生成,将从超过4个MS Access DB中检索数据。每个DB至少有200个字段。我的宏代码包括

  1. Cell locking
  2. Alignment and formatting
  3. One third of the cells in the sheet had a formulas
  4. Cell reference with other Workbooks

我的问题是每一张纸都需要至少一小时才能完成打孔过程。但在我看来它已经花了太长时间。

我已添加Application.ScreenUpdating = True以加快代码速度但仍需要相同的时间。怎么做加快代码,如果你有任何想法请指导我。

     `For Ip = 5 To  150
     resp = Range("B" & Ip).Value
     With ActiveSheet.QueryTables.Add(Connection:= _
    "ODBC;DSN=henkel2;DBQ=C:\Hl-RF\RSF-Temp.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;" _
    , Destination:=Range("IV4"))
    .CommandText = "select Vles from " & Shtname & " where cint(PrductID)='" & resp & "' and cint(DepotID) = '" & cnt1 & "' and Mnth = '" & mnths & "' and Type='" & typs & "'"
    .Name = "tab product"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .SourceConnectionFile = _
    "C:\Hl-RF\tabct.odc"
    .Refresh BackgroundQuery:=False
    End With`


    Is There Is any way to Reduce the loop iteration time

提前致谢

7 个答案:

答案 0 :(得分:3)

当然你的意思是

Application.ScreenUpdating = False

除此之外,您还可以在宏运行时禁用重新计算工作簿,看看是否有所作为。这当然是假设瓶颈与流程的电子表格部分一起,如果它需要很长时间才能从访问中获取可能需要查看的区域的数据

答案 1 :(得分:2)

获取Professional Excel Development的副本,其中包含一个名为PerfMon的优秀分析工具。它将允许您查看报告的哪些部分一直在进行,以便您可以分析和重写

答案 2 :(得分:2)

您可以尝试通常的vba优化方法,将计算设置为手动和禁用ScreenUpdating。

Dim calc As XlCalculation
calc = Application.Calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Application.ScreenUpdating = True
Application.Calculation = calc

Application.Calculation = xlCalculationManualApplication.ScreenUpdating = True之间进行代码或函数调用。

This is from my previous Post

注意:我无法查找信息天气,或者您无法在Access或Excel中运行代码。如果从Access创建Excel工作簿,则可能包含以下代码:

Dim xlApp As Excel.Application
Set xlApp = new Excel.Application

在这种情况下,您必须将上面代码中的Application更改为xlApp。例如:

xlApp.Calculation = xlCalculationManual

答案 3 :(得分:1)

我会尝试在数据库方面做更多的工作。在数据库端生成所需的报表,然后将结果导出到Excel。

自动化报告的访问权限比Excel更好。

答案 4 :(得分:0)

对此主题有一些讨论here

修改 好的,接下来的步骤是确定代码的哪些部分花费的时间最长。最简单的方法是复制代码,然后开始测量各种部分:

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Private mlngStrt As Long
Private mlngEnd As Long

Private Const u As Long = 10000000

Public Sub Example()
    Dim i As Long

    mlngStrt = GetTickCount
    For i = 0 To u
    Next
    mlngEnd = GetTickCount
    Debug.Print "Section1", mlngEnd - mlngStrt

    mlngStrt = GetTickCount
    ExampleSubCall
    mlngEnd = GetTickCount
    Debug.Print "ExampleSubCall", mlngEnd - mlngStrt

    mlngStrt = GetTickCount
    For i = 0 To (u * 1.5)
    Next
    mlngEnd = GetTickCount
    Debug.Print "Section2", mlngEnd - mlngStrt
    Debug.Print "Example Complete"
End Sub

Private Sub ExampleSubCall()
    Dim i As Long
    For i = 0 To (u * 0.75)
    Next
End Sub

这种方法非常简单。这里的缺点是你需要插入所有的时序语句,然后转身并删除它们。这就是为什么我要复印一份。

一旦你知道哪些部分花费的时间最长,你就会知道在哪里集中注意力以及寻求帮助的地方。

答案 5 :(得分:0)

看看克里斯的评论。我们认为,您的性能瓶颈可能与您查询数据库的方式有关,而不是在将数据应用到工作表中的VBA代码中。

关于访问性能的简单问题:   - 你的表有索引吗?   - 你使用任何类型的表加入?   - Access数据库是您的计算机本地还是远程访问?

同样,我只是在强化克里斯已经评论的内容。

答案 6 :(得分:0)

是的,在Access中创建一个表以保存您的客户端ID。然后在此处创建查询并使用外部数据连接器连接到该查询。之后,手动刷新它或使用VBA在您准备好时刷新连接。