我正在使用宏生成新表格。对于新工作表生成,将从超过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
提前致谢
答案 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 = xlCalculationManual
和Application.ScreenUpdating = True
之间进行代码或函数调用。
注意:我无法查找信息天气,或者您无法在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在您准备好时刷新连接。