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

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

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

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

  1. 解决为什么Excel 2007比Excel 2003慢并修复它
  2. 改进数据加载例程

关于第1项,我感兴趣的是其他人可以了解为什么2007年和2003年这样做需要更长的时间

在项目2上,我正在考虑使用GetString将logging集转换为string,并将其粘贴到表单上(而不是一次添加一个单元格)。 我也对之前做过这个的人感兴趣。

下面是一些从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 

首先尝试closuresscreenupdating和设置计算手动,同时填充表单。

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

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

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

数据已被复制到工作表后,date/date时间格式问题可能会被解决。

关于这个方法的更多细节在这里