2013-03-06 25 views
2

我們有一個使用VBA的大型Excel應用程序,命名範圍爲ADODB。它的主要功能是連接到Oracle,將數據集加載到Excel中,允許用戶編輯它並將其保存回Oracle。該應用程序在Excel 2003中,但我們有意將其升級到Excel 2007一段時間。當粘貼到Excel 2003應用程序中時,我們現在面臨着「格式太多」的錯誤,這是任何升級的好理由。通過ADODB將數據從Oracle加載到Excel中 - 性能問題

將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 
+3

您是否嘗試關閉screenupdating並在填充工作表時將claration設置爲手動?我猜你沒有提到看過記錄是逐行填充的。 – 2013-03-06 01:36:07

+0

這似乎加快了相當多,謝謝!我假設原作者已經想到了這個東西。現在我遇到的問題是,下拉列表中填充了空格。我需要進一步研究,如果沒有問題,我可以在此主題中發佈進一步的問題。 – 2013-03-06 02:13:22

+0

@蒂姆威廉斯,如果您發表評論作爲答案,我會接受它,因爲它解決了我的直接問題。 – 2013-03-12 01:16:53

回答

0

首先嚐試關閉screenupdating和整定計算爲手動在填充片。

我猜你現在沒有這樣做,因爲你提到看記錄是逐行填充的。

0

內置CopyFromRecordset方法往往遠低於手動填充細胞更快。用法示例:

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

日期/日期格式問題大概可以被數據已被複制到工作表後固定。

更多關於該方法的細節是here

+0

非常好,謝謝你的建議。我已經設法通過關閉screenupdating來大幅提升性能。我想這個技巧會進一步改進。現在我正在努力,但我認爲這是一個'太多格式'的問題。 – 2013-03-06 22:42:25

+0

儘管這很有幫助,但其他答案直接解決了我的問題。不管怎麼說,還是要謝謝你。 – 2013-03-12 03:27:30