2

VBA、名前付き範囲、ADODB を使用する大規模な Excel アプリケーションがあります。その主な機能は、Oracle に接続し、データセットを Excel にロードし、ユーザーが編集して Oracle に保存できるようにすることです。アプリケーションは Excel 2003 ですが、しばらくの間 Excel 2007 にアップグレードするつもりでした。Excel 2003 アプリに貼り付けると、「フォーマットが多すぎます」というエラーが表示されるようになりました。これは、アップグレードする正当な理由です。

Excel 2003 を Excel 2007 として保存し、Oracle ロード VBA を実行すると、データのロードに約 2 倍の時間がかかります。Excel 2003 バージョンでは、シート内のレコードがページを圧縮するだけでしたが、実際にレコードが読み込まれていることがわかります。

ですから、私の最初の目標は、このパフォーマンスを改善することです。これを行うには2つの方法があります。

  1. Excel 2007 が Excel 2003 より遅い理由を突き止め、修正する
  2. データ読み込みルーチンを改善する

項目 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
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 に答える