簡體   English   中英

Excel VBA:有沒有辦法使它更有效?

[英]Excel VBA: Is there a way to make this more efficient?

我有一個VBA腳本,它將數據從SoapUI - Single Sheet中的行復制到STpremcalc Sheet,然后將最終計算結果復制回SoapUI - Single Sheet。 它工作正常,但我有10000行數據,大約需要30秒才能完成一行。 當我測試1000行時,它在一分鍾內完成。

是什么原因造成的? 是因為VBA腳本在復制值之前正在讀取整個工作表。

Sub SingleRating()
Dim i As Long
Dim iteration As Variant
Dim seleciton As Variant
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Worksheets("SoapUI - Single")
Set ws2 = Worksheets("STpremcalc")

iteration = 0
iteration = InputBox("Please Select Row Iteration", "", "1000")
seleciton = iteration + 2

    For i = 3 To seleciton
        ws2.Range("B3").Value = ws1.Range("B" & i).Value

        ws2.Range("B4").Value = ws1.Range("C" & i).Value

        ws2.Range("B5").Value = ws1.Range("D" & i).Value

        ws2.Range("B6").Value = ws1.Range("E" & i).Value

        ws2.Range("E3").Value = ws1.Range("F" & i).Value

        ws2.Range("E4").Value = ws1.Range("G" & i).Value

        ws2.Range("E5").Value = ws1.Range("H" & i).Value

        ws2.Range("E6").Value = ws1.Range("I" & i).Value

        ws2.Range("G3").Value = ws1.Range("J" & i).Value

        ws2.Range("G4").Value = ws1.Range("K" & i).Value

        ws2.Range("G5").Value = ws1.Range("L" & i).Value

        ws2.Range("J3").Value = ws1.Range("N" & i).Value

        ws2.Range("J4").Value = ws1.Range("O" & i).Value

        ws2.Range("J6").Value = ws1.Range("P" & i).Value

        ws2.Range("B9:E9").Value = ws1.Range("Q" & i, "T" & i).Value

        ws2.Range("B10:E10").Value = ws1.Range("U" & i, "X" & i).Value

        ws2.Range("B11:E11").Value = ws1.Range("Y" & i, "AB" & i).Value

        ws2.Range("B12:E12").Value = ws1.Range("AC" & i, "AF" & i).Value

        ws2.Range("B13:E13").Value = ws1.Range("AG" & i, "AJ" & i).Value

        ws2.Range("B14:E14").Value = ws1.Range("AK" & i, "AN" & i).Value

        ws2.Range("B15:E15").Value = ws1.Range("AO" & i, "AR" & i).Value

        ws2.Range("B16:E16").Value = ws1.Range("AS" & i, "AV" & i).Value

        '''''''''''''''''''''''''''''''''''''''''''''''''
        ws1.Range("AW" & i).Value = ws2.Range("M4").Value

        ws1.Range("AX" & i).Value = ws2.Range("M5").Value

        ws1.Range("AY" & i).Value = ws2.Range("M6").Value

        Application.StatusBar = "Current iteration: " & (i - 2) & "/" & iteration
    Next i
End Sub

如果那是您的整個代碼,建議您在初始化變量后立即插入此代碼:

screenUpdateState = Application.ScreenUpdating

statusBarState = Application.DisplayStatusBar

calcState = Application.Calculation

eventsState = Application.EnableEvents

Application.ScreenUpdating = False

Application.DisplayStatusBar = False

Application.Calculation = xlCalculationManual

Application.EnableEvents = False

在代碼的最后(End Sub上方)將其反轉:

Application.ScreenUpdating = screenUpdateState

Application.DisplayStatusBar = statusBarState

Application.Calculation = calcState

Application.EnableEvents = eventsState

根據我的經驗,尤其是ScreenUpdating部分在復制/插入行時極大地提高了性能。 如果禁用它后仍然存在性能問題,我們需要查看實現本身。

我認為這應該對您有幫助,因為我已經在工作表之間復制了數萬行,並且從未遇到性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM