2017-08-04 79 views
2

我有一些寫入的VBA代碼運行速度很慢。我的代碼中有一系列不同的循環。我知道循環並不總是最有效的操作數據的方式,所以我認爲它們是問題。我需要如何改變循環或消除它的想法,這樣我可以加快我的代碼的運行時間。消除/改變一個循環來加速代碼

下面是我創建的最活躍的循環。它貫穿D行的所有單元格(從D2開始),並根據第1行單元格中的條目操縱它們的值。如果我可以在此循環中獲得幫助,我可能會使用類似的技術來更改我的代碼中的其他循環。任何提示都表示讚賞。

'sub work week for date range 
    Range("D2").Select 
    Do Until IsEmpty(ActiveCell.Value) 
     If IsEmpty(ActiveCell.Offset(-1, 0)) = False Then 
      ActiveCell.Value = ActiveCell.Offset(-1, 0).Value & "-" & Right(ActiveCell.Value, 4) 
     Else: ActiveCell.Value = ActiveCell.Value & "-" & Right(ActiveCell.Offset(0, -1), 4) 
     End If 
    ActiveCell.Offset(0, 1).Select 
Loop 
+2

使用數組和循環通過這些。 –

+0

正如@Scott所說 - 不是指單元格,而是將這些值拉入數組並循環。 _它正在運行D_行上的所有單元格 - 是否真的需要循環16384單元格(如果在Excel 2003上,則是256)? –

回答

1

最快,效率更高的方法,就像使用數組的註釋中所建議的那樣。

爲了讓你到這一點,雖然,我已經給你的第一個步驟,以改善與VBA的交互,並瞭解如何編寫代碼,而不選擇或激活對象:

For i = 4 To Cells(2, Columns.Count).End(xlToLeft).Column 
    With Cells(2, i) 
     If .Offset(-1, 0).Value = vbNullString Then 
      .Value = .Value & "-" & Right$(.Offset(0, -1).Value, 4) 
     Else 
      .Value = .Offset(-1, 0).Value & "-" & Right$(.Value, 4) 
     End If 
    End With 
Next 

基本上,你不不需要.Select.Activate什麼。直接使用對象並使用變量來指定列而不是激活下一個單元格。

一旦你習慣於以這種風格編寫代碼,可以考慮將範圍的值賦給2D數組,然後循環訪問數組。

0

爲了快速執行,我的第一個建議是如果自動計算和屏幕更新還需要很長時間,也可以關閉。

我同意任何涉及選擇的東西都​​會非常慢,所以您應該使用範圍對象。

最終代碼:

' Declarations 
Dim CurrentCell, LeftCell, PreviousCell As Range 
Dim Last4Chars As String 

'Initialize 
Set CurrentCell = ActiveSheet.Range("D2") 

'Optimizations 
Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 

'Loop until Current Cell in Empty 
Do Until IsEmpty(CurrentCell.Value) 
    Set AboveCell = CurrentCell.Offset(-1, 0)  'One row above 
    Set LeftCell = CurrentCell.Offset(0, -1)   'One column left 

    If IsEmpty(AboveCell) = False Then 
     CurrentCell.Value = AboveCell.Value & "-" & Right(CurrentCell.Value, 4) 
    Else 
     CurrentCell.Value = CurrentCell.Value & "-" & Right(LeftCell, 4) 
    End If 

    Set CurrentCell = CurrentCell.Offset(0, 1) 
Loop 

'Optimizations reversed for normal use 
Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True