Performance 如何加速VBA宏
我正在使用宏生成新的图纸。对于新的图纸生成,数据从超过4 MS的Access DB中检索。每个数据库至少有200个字段。我的宏代码包括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 我的问题是,每生成一张图纸,完成钻孔过程至少需要一个小时。但在我看来,这
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刷新连接。您应该提供一些代码,以便我们可以看到您在宏中执行的操作。你也应该公关