2017-08-04 6 views
2

Ich habe einige VBA-Code geschrieben, das ganz langsam läuft. Ich habe eine Reihe von verschiedenen Schleifen in meinem Code. Ich weiß, dass Loops nicht immer der effizienteste Weg sind, um Daten zu manipulieren, also denke ich, dass sie das Problem sind. Ich brauche Ideen, wie ich die Schleife ändern oder eliminieren kann, damit ich die Laufzeit meines Codes beschleunigen kann.Beseitigung/Ändern einer Schleife zu beschleunigen Code

Unten ist die aktivste Schleife ich geschaffen habe. Es läuft durch alle Zellen in der Zeile D (ab D2) und ihre Werte zu manipulieren basiert weg von Einträgen in den Zellen in Reihe 1. Wenn ich Hilfe auf dieser Schleife bekommen kann ich wahrscheinlich ähnliche Techniken zu verwenden, werden in der Lage zu verändern Die andere Schleife in meinem Code. Irgendwelche Tipps werden geschätzt.

'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

Verwenden Arrays und Schleife durch diese. –

+0

Wie @Scott sagte - anstatt auf Zellen zu verweisen, ziehen Sie diese Werte in ein Array und durchlaufen Sie diese. _Es läuft durch alle Zellen in Zeile D_ - muss es wirklich 16384 Zellen durchlaufen (oder 256, wenn auf Excel 2003)? –

Antwort

1

Die schnellste und effizienteste Methode wäre, wie in den Kommentaren durch die Verwendung von Arrays vorgeschlagen wurde.

Sie aber zu diesem Punkt zu kommen, habe ich Ihnen die ersten Schritte gegeben Interaktion mit VBA zu verbessern und zu verstehen, wie Sie Ihren Code zu schreiben, ohne Objekte auswählen oder aktivieren:

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 

Grundsätzlich Sie don 't brauchen .Select oder .Activate nichts. Arbeiten Sie direkt mit den Objekten und verwenden Sie eine Variable, um die Spalte zu diktieren, anstatt die nächste Zelle zu aktivieren.

Sobald Sie mit dem Schreiben von Code in diesem Stil vertraut sind, sehen eine Reihe von Wert zu einer 2D-Array und dann die Schleife durch das Array statt auf zuweisen.

0

Für schnelle Ausführung, meine erste Empfehlung ist die automatische Berechnung drehen und Bildschirm-Aktualisierung auch aus, wenn es noch lange dauert.

Ich bin damit einverstanden, dass alles, was die Auswahl betrifft wird unglaublich langsam, so dass Sie Bereich statt Objekte verwendet werden sollen.

Endcode:

' 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 
Verwandte Themen