返回列表 上一主題 發帖

[發問] 求救如何縮短VBA執行時間

本帖最後由 quickfixer 於 2020-12-10 09:54 編輯

回復 7# lilizzzz

猜測可能是資料太多,用字串處理長度太長
改用range集合來刪,請測試

    Sub test()

    Dim dr As Range
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.EnableEvents = False

    Sheets("工作表1").Select
    Range("A2").Select

    Set dic = CreateObject("scripting.dictionary")
    For i = Range("A2000").End(3).Row To 1 Step -1
        If dic.exists(Cells(i, "A").Value) Then
            If dr Is Nothing Then
                Set dr = Rows(i)
            Else
                Set dr = Union(dr, Rows(i))
            End If
        Else
            dic(Cells(i, "A").Value) = ""
        End If
    Next i

    dr.EntireRow.Delete
   
    Set dr = Nothing
    Set dic = Nothing
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Application.DisplayStatusBar = True
    Application.EnableEvents = True

End Sub

TOP

回復 10# samwang


    您好,附檔即是我的資料,只是我實務上再運用的資料筆數從1500-30000都有可能,

不好意思麻煩您了,謝謝,我會用心去吸收這段程式

TOP

回復 9# samwang


    請問這一段,
Dim xD, Arr, i&, j%, N& '

為甚麼會用 i&  j% n& ' 來宣告 ?

TOP

回復 11# quickfixer


    非常謝謝您,今日下班我再回去測試看看您這段程式碼,

但是有點深奧我需要多花一點時間來吸收qq

TOP

回復 13# lilizzzz


    為甚麼會用 i&  j% n& ' 來宣告 ?
-->可參考如下網址解釋,還蠻詳細的,謝謝。
http://forum.twbts.com/viewthrea ... amp;page=1#pid22366
Dim i%就是Dim i As Integer的簡寫
一些常用的代表符號如下
Integer 的型態宣告字元是百分比符號 %
Long 的型態宣告字元為 &
Double 的型態宣告字元是數字符號 #
Single 的型態宣告字元為 !
String 的型態宣告字元為 $

TOP

回復 11# quickfixer


    您好,這一份可以執行效率比我的快超多,非常感謝您,我來去吸收這一段,

另想跟您請教,我這裡有一段錄製的巨集,功能是篩選,我在錄製時候搜尋都很快,

可是自己在執行巨集時,搜尋效率要將近一分鐘,請問是我資料檔問題嗎 ?

    Sheets("3P-INSPPROD").Range("A1:AK300000").AdvancedFilter Action:=xlFilterCopy _
        , CriteriaRange:=Range("A1:C3"), CopyToRange:=Range("A7:AK7") _
        , Unique:=False

    ActiveWindow.SmallScroll Down:=-27
    Cells.Select

TOP

回復 15# samwang


    您好,我有看到這一個說明了,原來是簡寫!非常謝謝您

另想跟您請教,我這裡有一段錄製的巨集,功能是篩選,我在錄製時候搜尋都很快,

可是自己在執行巨集時,搜尋效率要將近一分鐘,請問是我資料檔問題嗎 ?

    Sheets("3P-INSPPROD").Range("A1:AK300000").AdvancedFilter Action:=xlFilterCopy _
        , CriteriaRange:=Range("A1:C3"), CopyToRange:=Range("A7:AK7") _
        , Unique:=False

    ActiveWindow.SmallScroll Down:=-27
    Cells.Select

TOP

回復 17# lilizzzz


Range("A1:AK300000")   

範圍太大了,30萬列?,建議先判斷範圍再做篩選,可減少多餘的計算。
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

        靜思自在 : 太陽光大、父母恩大、君子量大,小人氣大。
返回列表 上一主題