我尝试通过VBA执行一个SQL查询,然后将结果粘贴到excel文件的表中。我注意到在执行此操作时,绝大多数时间都花在了粘贴记录上,我不知道为什么。我的代码如下
Option Explicit
Sub SQLTest()
Application.Calculation = xlManual
Application.ScreenUpdating = False
'Connection variables
Dim cnn As ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cnnstr As String
'Input variables
Dim sql As String
Dim tablename As String
Dim tablelocation As String
'timer for profiling
Dim dTime1, dTime2 As Double
dTime1 = Timer
'Read in the query and the output parameters
sql = Worksheets("Queries").Range("A2").Value
tablelocation = Worksheets("Queries").Range("B2").Value
tablename = Worksheets("Queries").Range("C2").Value
'Open Connection and execute query
cnnstr = "driver={iSeries Access ODBC Driver};system=SYSTEM;translate=1;Prompt=Complete;User ID=ID;Password=PASSWORD;QueryTimeout=0"
Set cnn = New ADODB.Connection
cnn.Open (cnnstr)
rst.Open sql, cnn
'Paste profiling
dTime2 = Timer
'Paste Query results into table
Worksheets(tablelocation).ListObjects(tablename).Range(2, 1).CopyFromRecordset rst
'Output run time
MsgBox ("Total Time : " & Timer - dTime1 & " Paste Time : " & Timer - dTime2)
End Sub
当我运行这个程序时,我得到的总运行时间是93.656秒,其中CopyFromRecordset行占92.003秒。我已经运行了几次,这些数字看起来是一致的。有什么方法可以减少粘贴这些数据所花费的时间吗?
1条答案
按热度按时间pxy2qtax1#
发现这个问题时,挣扎与遗留代码有
CopyFromRecordSet
。在我的经验,它是可怕的缓慢任何超过微不足道的行数。尝试将记录集信息提取到2D变量数组中,并设置相应Excel范围的Value属性。如果您认为内存将成为一个约束,请将数据分块。这涉及到解决方案。您需要进行边界检查,并在设置Value属性之前转置数据。
我将很快添加一个代码示例。