我有一个本地存储的数据库,并使用Excel从中获取小表,然后我处理,格式化等并保存为平面文件。我需要大约7,000个文件。
这个过程开始得非常快,但随着时间的推移,它会变慢,每个文件的结束时间大约是第一个文件的10倍。这是循环:
For i = firstrow + 1 To lastrow
RemoveConnections
Application.CutCopyMode = False
'Get annual data
Sheets("data").Cells.Delete
sqlstring1 = "SELECT [compnumber],[mapcode],[amount],[reportd],[reportm],[reporty] FROM [Mergent].[dbo].[Mastertable_proc]" & _
"WHERE Compnumber = '" & Sheets("list").Cells(i, 1).Value & "' and reporttype='A';"
connstring = _
"ODBC;Driver=SQL Server;Server=MY-PC;UID=Andy;Trusted_Connection=Yes;Database=DataM"
With Sheets("data").QueryTables.Add(Connection:=connstring, Destination:=Sheets("data").Range("a1"), Sql:=sqlstring1)
.RefreshStyle = xlOverwriteCells
.Refresh BackgroundQuery:=False
End With
...
processes data and saves file
...
next i
在每个循环开始时调用以下Remove Connections宏以删除所有现有连接:
Sub RemoveConnections()
Dim xConnect As Object
On Error Resume Next
For Each xConnect In ActiveWorkbook.Connections
xConnect.Delete
Next xConnect
For Each listobj In Sheets("data").ListObjects
listobj.Delete
Next listobj
End Sub
我非常确定处理本身和保存文件不是问题所在,因为我可以在没有它的情况下运行宏,并且它会随着时间的推移而减慢。
任何人都有任何想法为什么这会减慢?我注意到随着时间的推移,SQLserver.exe会在我的计算机上占用越来越多的RAM,但是当它减慢时我仍然处于最大值内,但它告诉我我在循环中做错了就像不关闭一样连接什么的。
我还尝试过在每个循环中编辑单个连接的版本,因此每次都不会创建一个新版本,但它仍然会随着时间的推移而减慢,我不明白为什么。
答案 0 :(得分:0)
我猜想减速是由连接到数据库/从数据库断开7000次引起的......是否可以运行查询一次将整个Mastertable_proc拉入Excel,然后使用循环处理并保存每个唯一的Compnumber ?