2

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

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

所以我的第一个目标是提高这个性能。有两种方法可以做到这一点:

  1. 找出 Excel 2007 比 Excel 2003 慢的原因并修复它
  2. 改进数据加载例程

关于第 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
4

2 回答 2

0

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

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

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

有关此方法的更多详细信息在这里

于 2013-03-06T12:01:27.473 回答
0

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

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

于 2013-03-12T01:51:25.537 回答