Performance 如何加速VBA宏

Performance 如何加速VBA宏,performance,ms-access,vba,excel,Performance,Ms Access,Vba,Excel,我正在使用宏生成新的图纸。对于新的图纸生成,数据从超过4 MS的Access 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 我的问题是,每生成一张图纸,完成钻孔过程至少需要一个小时。但在我看来,这

我正在使用宏生成新的图纸。对于新的图纸生成,数据从超过4 MS的Access 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.screenUpdate=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
提前谢谢你的意思当然是

Application.ScreenUpdating = False
除此之外,您还可以在宏运行时禁用工作簿的重新计算,看看这是否会产生影响。当然,这是假设流程中的电子表格部分存在瓶颈,如果从access中获取数据需要很长时间,那么这可能是一个值得关注的领域,你的意思肯定是

Application.ScreenUpdating = False

除此之外,您还可以在宏运行时禁用工作簿的重新计算,看看这是否会产生影响。当然,这是假设流程中的电子表格部分存在瓶颈,如果从access中获取数据需要很长时间,那么这可能是一个需要查看的领域,获取一个包含优秀的分析实用程序PerfMon的副本。它将允许您查看报告的哪些部分需要花费所有的时间,以便您可以分析和重写

获取一份包含一个名为PerfMon的优秀分析实用程序的副本。它将允许您查看报告的哪些部分一直在使用,以便您可以分析和重写

您可以尝试将计算设置为手动和禁用屏幕更新的常用vba优化方法

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

Application.ScreenUpdating = True
Application.Calculation = calc
将代码或函数调用置于
Application.Calculation=xlCalculationManual
Application.ScreenUpdate=True
之间

注意:我找不到天气信息,您可以从Access或Excel中运行代码。如果从Access创建Excel工作簿,可能会有如下代码:

Dim xlApp As Excel.Application
Set xlApp = new Excel.Application
在这种情况下,您必须将上述代码中的
应用程序
更改为
xlApp
。例如:

xlApp.Calculation = xlCalculationManual

您可以尝试将计算设置为手动和禁用屏幕更新的常用vba优化方法

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

Application.ScreenUpdating = True
Application.Calculation = calc
将代码或函数调用置于
Application.Calculation=xlCalculationManual
Application.ScreenUpdate=True
之间

注意:我找不到天气信息,您可以从Access或Excel中运行代码。如果从Access创建Excel工作簿,可能会有如下代码:

Dim xlApp As Excel.Application
Set xlApp = new Excel.Application
在这种情况下,您必须将上述代码中的
应用程序
更改为
xlApp
。例如:

xlApp.Calculation = xlCalculationManual

关于这个话题有一些讨论

编辑: 好的,那么下一步是确定代码的哪些部分花费的时间最长。最简单的方法是复制代码,然后像这样开始测量各个部分:

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
这种方法相当直截了当。这里的缺点是,您需要插入所有计时语句,然后将它们转过来删除。这就是为什么我要写一本


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

关于这个话题有一些讨论

编辑: 好的,那么下一步是确定代码的哪些部分花费的时间最长。最简单的方法是复制代码,然后像这样开始测量各个部分:

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
这种方法相当直截了当。这里的缺点是,您需要插入所有计时语句,然后将它们转过来删除。这就是为什么我要写一本


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

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

有关访问性能的简单问题: -你的表有索引吗? -您是否使用任何类型的表联接? -Access数据库是本地的还是远程访问的


再一次,我只是强调Chris已经发表的评论。

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

有关访问性能的简单问题: -你的表有索引吗? -您是否使用任何类型的表联接? -Access数据库是本地的还是远程访问的


再一次,我只是强调Chris已经发表的评论。

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


Access在自动化报表方面比Excel好得多。

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


Access在自动化报表方面比Excel好得多。

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

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

您应该提供一些代码,以便我们可以看到您在宏中执行的操作。你也应该公关