2016-09-29 148 views
0

我寫了下面的代碼,將單元格的當前值輸入到一個字符串數組中。有52k +行,當在調試模式下運行時,如果我在第二個「執行」中放置一箇中斷,按F5後代碼運行非常快(秒)。如果不輸入中斷,則需要很長時間(6-8分鐘)。VBA excel代碼運行時間

有沒有人有任何想法爲什麼會發生這種情況,以及如何解決它?

最佳, Nasos

Do 
    ProjectIDPub(i, 0) = Cells(3 + i, 13).Value & " - " & Cells(3 + i, 3).Value 
    ProjectIDPub(i, 1) = Cells(3 + i, 7).Value 
    i = i + 1 
Loop Until i = numberRowsAXProjectsSheetPub 

i = 0 
Do 
    Cells(3 + i, 14).Value = ProjectIDPub(i, 0) 
    Cells(3 + i, 15).Value = ProjectIDPub(i, 1) 
    i = i + 1 
Loop Until i = numberRowsAXProjectsSheetPub 
i = 0 
+0

我不明白。你爲什麼不馬上做? –

+1

如果你有工作代碼只需要改進,那麼你可能在這篇文章中錯誤的地方。 [代碼評論](http://codereview.stackexchange.com/)是他們處理現有/工作代碼的地方,並且在速度,安全性,可持續性和包括最佳實踐在內的使用壽命等方面盡最大努力改進。試一試。他們很棒! – Ralph

回答

3

假設numberRowsAXProjectsSheetPub是陣列ProjectIDPub中的行數時,整個第二環路可以通過

Range(Cells(3,14),Cells(3 + numberRowsAXProjectsSheetPub - 1,15)).Value = ProjectIDPub 

幾乎總是快得多到陣列中的單個分配而傳遞到工作表被替換比在循環中。

+0

非常感謝你我約略微調整了你的代碼,這個工作很完美 – Nasos

+0

嗨,約翰,我試着用一維數組的相同方法,它只轉移30k行中的第一個元素。 '代碼範圍(單元格(3,4),單元格(3 + numberRowsEcosSheetPub - 1,4))。Value = projectIDPub' – Nasos

+0

@Nasos在Excel中,範圍對應於2維數組,即使它們只有1列。這是一個衆所周知的煩惱。有一個涉及使用工作表函數'Transpose'的解決方法 - 但我認爲它不適用於30k行。最簡單的方法是始終使用2維數組,即使1維是假的:只需將'projectIDPub'聲明爲例如。 'Dim projectIDPub(1 to 30000,1 to 1)',只需使用'projectID(i,1)'而不是'projectID(i)'。這很乏味,但有時是處理1列範圍作爲VBA陣列的最佳方式。如果是這樣,那麼分配將按原樣工作。 –

1

您是否嘗試過運行帶有屏幕更新這些循環禁用?

Application.ScreenUpdating = False 
Do 
ProjectIDPub(i, 0) = Cells(3 + i, 13).Value & " - " & Cells(3 + i, 3).Value 
ProjectIDPub(i, 1) = Cells(3 + i, 7).Value 
i = i + 1 

Loop Until i = numberRowsAXProjectsSheetPub 
i = 0 
Do 
    Cells(3 + i, 14).Value = ProjectIDPub(i, 0) 
    Cells(3 + i, 15).Value = ProjectIDPub(i, 1) 
    i = i + 1 
Loop Until i = numberRowsAXProjectsSheetPub 
i = 0 
Application.ScreenUpdating = True 

而作爲@ ali-srn問,爲什麼你需要兩次運行相同的循環?如果第二個循環訪問需要由第一個循環創建的某些數據,那麼您應該能夠根據需要對其進行一些偏移量的修改,如果需要並且只運行一次。

+0

我試圖禁用屏幕。我也嘗試過一次運行它,但它並沒有真正影響完成操作所需的時間。 – Nasos

+0

奇怪的是,修改單元格之前禁用屏幕更新並不會影響執行時間。當遍歷很多單元格並修改其內容時,我總是發現它是必需的。 – Pav