excel VBA CopyFromRecordset导致性能极低

0x6upsns  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(559)

我尝试通过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秒。我已经运行了几次,这些数字看起来是一致的。有什么方法可以减少粘贴这些数据所花费的时间吗?

pxy2qtax

pxy2qtax1#

发现这个问题时,挣扎与遗留代码有CopyFromRecordSet。在我的经验,它是可怕的缓慢任何超过微不足道的行数。
尝试将记录集信息提取到2D变量数组中,并设置相应Excel范围的Value属性。如果您认为内存将成为一个约束,请将数据分块。这涉及到解决方案。您需要进行边界检查,并在设置Value属性之前转置数据。
我将很快添加一个代码示例。

相关问题