返回列表 上一主題 發帖

[發問] 可否幫忙改善迴圈速度

本帖最後由 n7822123 於 2019-6-11 23:56 編輯

回復 1# s13030029

這段程式!? 判斷重複....且跑了100多萬列...........

    For I = 47 To Range("A47").End(xlDown).Row
        If Cells(I, "B") <> "" Then
            If Cells(I, "B") <> "" Then
                Cells(I, "F").Value = "D," & Cells(I, "A").Value + 1 & ",1"
                Cells(I, "G").Value = "D," & Cells(I, "A").Value + 1 & ",2"
                Cells(I, "H").Value = "D," & Cells(I, "A").Value + 1 & ",3"
                Cells(I, "I").Value = "D," & Cells(I, "A").Value + 1 & ",4"
                Cells(I, "J").Value = "D," & Cells(I, "A").Value + 1 & ",5"
            Else
            End If
        End If
    Next

時間主要卡在你程式碼27~38列的部分,

因為你給的檔案從A47以後都沒資料,所以不知道這段程式到底要幹嘛!

迴圈會重47列跑到1048576........且儲存格都是空白,等於白跑了100多萬列!

如果你把這段註解掉,會發現速度馬上提昇。
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2019-6-12 09:00 編輯

回復 4# s13030029


恩恩,應該每張表格都給他一個範圍去跑就好了

舉例來說你第2張表格會從A47 到A67,就把你的I固定從 47到67就可以了

如果會有第3張表格與第4張表格也類似處理,不太可能跑到1048576列的....
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2019-6-12 09:19 編輯

回復 5# n7822123


可根據一些表格固定會出現字眼,先判斷會有幾個表格,再設立範圍

舉例 :
每張表格固定跑20列(第一張從12跑到31),有30張表格(變數T),
假設每張表格的儲存格位置相差37列,可以改成如下

For T=1 to 30  '假設有30張表格
    For I = T*37-25 To T*37-6  '第一列與最後一列依據第T張表格做變動
            If Cells(I, "B") <> "" Then
                Cells(I, "F").Value = "D," & Cells(I, "A").Value + 1 & ",1"
                Cells(I, "G").Value = "D," & Cells(I, "A").Value + 1 & ",2"
                Cells(I, "H").Value = "D," & Cells(I, "A").Value + 1 & ",3"
                Cells(I, "I").Value = "D," & Cells(I, "A").Value + 1 & ",4"
                Cells(I, "J").Value = "D," & Cells(I, "A").Value + 1 & ",5"
            Else
            End If
    Next I
Next T

當然這還是可以優化的,用陣列處理可以更快。
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 6# n7822123


End(xlDown) 可適用於 確定有資料 的情況下,無資料會跑到最末列

使用前要先判斷是否有資料
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

        靜思自在 : 能幹不幹,不如苦幹實幹。
返回列表 上一主題