VBA、名前付き範囲、ADODB を使用する大規模な Excel アプリケーションがあります。その主な機能は、Oracle に接続し、データセットを Excel にロードし、ユーザーが編集して Oracle に保存できるようにすることです。アプリケーションは Excel 2003 ですが、しばらくの間 Excel 2007 にアップグレードするつもりでした。Excel 2003 アプリに貼り付けると、「フォーマットが多すぎます」というエラーが表示されるようになりました。これは、アップグレードする正当な理由です。
Excel 2003 を Excel 2007 として保存し、Oracle ロード VBA を実行すると、データのロードに約 2 倍の時間がかかります。Excel 2003 バージョンでは、シート内のレコードがページを圧縮するだけでしたが、実際にレコードが読み込まれていることがわかります。
ですから、私の最初の目標は、このパフォーマンスを改善することです。これを行うには2つの方法があります。
- Excel 2007 が Excel 2003 より遅い理由を突き止め、修正する
- データ読み込みルーチンを改善する
項目 1 については、2007 年と 2003 年でこれを行うのに時間がかかる理由を説明できる人に興味があります。
項目 2 では、GetString を使用してレコードセットを文字列に変換し、(一度に 1 つのセルを追加するのではなく) シートに貼り付けることを検討しています。また、以前にこれを行ったことがある人にも興味があります。
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