通过ADODB将数据从Oracle加载到Excel中 - 性能问题

时间:2013-03-06 01:30:47

标签: oracle excel vba excel-2007 adodb

我们有一个大型Excel应用程序,它使用VBA,命名范围,ADODB。它的主要功能是连接到Oracle,将数据集加载到Excel中,允许用户编辑它并将其保存回Oracle。该应用程序在Excel 2003中,但我们有意义升级到Excel 2007一段时间。在粘贴到Excel 2003应用程序时,我们现在面临“格式太多”的错误,这是升级的一个很好的理由。

将Excel 2003保存为Excel 2007并运行Oracle加载VBA后,数据加载大约需要两倍的时间。我们实际上可以看到正在加载的记录,而在Excel 2003版本中,工作表中的记录只是压缩页面。

所以我的第一个目标是改善这种表现。我有两种方法可以做到这一点:

  1. 找出为什么Excel 2007比Excel 2003慢并修复它
  2. 改进数据加载例程
  3. 关于第1项,我对其他任何可以解释为什么在2007年与2003年这样做需要更长时间的人有兴趣

    在第2项中我正在考虑使用GetString将记录集转换为字符串并将其粘贴到工作表上(而不是一次添加一个单元格)。我也对之前做过这件事的人感兴趣。

    从ADODB到Excel工作表代码的传输的一些已清理代码如下:

    While Not RECSET.EOF
      ' loop thru columns returned in sql row
      sExtractRec = ""
      For i = 1 To Column_Names.Count
        vColumnName = Column_Names(i)
        vItem = RECSET(vColumnName) 
        vItem = formatIfDate(vItem, vColumnName) ' format if a date or datetime
        currCell.Value = vItem
        Set currCell = currCell.Offset(0, 1)
        If Not isNull(vItem) Then
              vItem = IIf(vItem = "", "", Replace(vItem, ";", " "))
        End If
        sExtractRec = sExtractRec & vItem & ";"
      Next i
      Set currCell = currCell.Offset(1, 0 - Column_Names.Count) ' goto first cell next row
      iRowCnt = iRowCnt + 1
      RECSET.MoveNext
    
      If bWriteExtractFile Then
          Print #iExtractFile, sExtractRec
      End If
    Wend
    

2 个答案:

答案 0 :(得分:0)

内置CopyFromRecordset方法往往比手动填充单元格快得多。用法示例:

Worksheets("Sheet1").Cells(2, 1).CopyFromRecordSet RECSET

将数据复制到工作表后,可能会修复日期/日期时间格式问题。

有关此方法的更多详细信息,请here

答案 1 :(得分:0)

首先尝试在填充工作表时关闭屏幕更新并将计算设置为手动。

我猜你现在没有这样做,因为你提到看着记录逐行填充。