snellere macro van maken

Status
Niet open voor verdere reacties.

sickofitall

Gebruiker
Lid geworden
29 sep 2008
Berichten
375
Hallo

ik heb een deel van een code waarbij mijn pc zeer traag gaat (dat ik denk dat hij vastzit).
Nu is hij hier al meer dan een half uur mee bezig dus dat vind ik niet normaal...

Is het mogelijk om dit te herschrijven zodat hij sneller werkt?
ik denk aan copy/pastespecial (values)?

Nota: in cel D1 staat een tellertje zodat ik weet hoever mijn macro zit.
(Rijg begint op 14)

Code:
With Worksheets("Gegevens")
 Dim rijg As Long
       rijg = 5
    Do Until rijg = 234
       If .Cells(rijg, 8).Value = "NEW" Then
            .Cells(rijg + 230, 6).Value = .Cells(rijg, 6).Value
            .Cells(rijg + 230, 7).Value = .Cells(rijg, 7).Value
            .Cells(rijg + 230, 8).Value = .Cells(rijg, 8).Value

            .Range("D1").Value = rijg + 9 'telling
            rijg = rijg + 1
        Else
            .Range("D1").Value = rijg + 9 'telling
            rijg = rijg + 1
        End If
    Loop
End With

bedankt!
 
Zie niet in waarom deze code traag verloopt. hij hoeft tenslotte maar 229 rijen door. wat is de rest van je code
 
Misschien kan dit je helpen

Een macro verloopt meestal langzamer als:
- je werkblad veel formules bevat (deze worden constant opnieuw berekend, ook tijdens het lopen van de macro)
- je werkmap veel werkbladen met formules bevat
- er veel werkmappen geopend zijn

Verder zou je voor de teller gebruik kunnen maken van de eigenschap application.statusbar voor de teller, in plaats van deze op je werkblad te plaatsen:

Code:
Dim rijg As Long
rijg = 5
With Worksheets("Gegevens")
    Do Until rijg = 234
       If .Cells(rijg, 8).Value = "NEW" Then
            .Cells(rijg + 230, 6).Value = .Cells(rijg, 6).Value
            .Cells(rijg + 230, 7).Value = .Cells(rijg, 7).Value
            .Cells(rijg + 230, 8).Value = .Cells(rijg, 8).Value
        End If
        Application.StatusBar = "Teller.. " & rijg + 9
    Loop
    Application.StatusBar = "Ready"
    .Range("D1").Value = rijg + 9  'als je dit wil laten staan
End With

soms wil Application.ScreenUpdating uitzetten ook helpen. let wel op dat je het weer aanzet als je de macro onderbreekt

Code:
Dim rijg As Long
rijg = 5
With Worksheets("Gegevens")
    
    Application.ScreenUpdating = False
    
    Do Until rijg = 234
       If .Cells(rijg, 8).Value = "NEW" Then
            .Cells(rijg + 230, 6).Value = .Cells(rijg, 6).Value
            .Cells(rijg + 230, 7).Value = .Cells(rijg, 7).Value
            .Cells(rijg + 230, 8).Value = .Cells(rijg, 8).Value
        End If
        Application.StatusBar = "Teller.. " & rijg + 9
    Loop
    .Range("D1").Value = rijg + 9  'als je dit wil laten staan
    
     Application.StatusBar = "Ready"
     Application.ScreenUpdating = True

End With

Wat ik ook soms doe in dergelijke gevallen, is een tussenstap maken tussen het schrijven van een cel naar een andere cel, bijvoorbeeld door een bereik eerst weg te zetten in een variabele(array).

Als er meer code is kan het ook zinvol zijn deze nader te bekijken, zoals Relleboer al aangaf.
 
Laatst bewerkt:
Bedankt voor je reactie

Ik heb de indruk dat mijn macro zeer traag verloopt omdat mijn werkblad vol met formules "INDIRECT" staat. Dat ga ik nu proberen anders te doen :s
Mijn werkblad bevat ook gegevens van 10000rijen lang en 20 kolommen breed. En het doel van mijn excel bestand is telkens nieuwe werkbladen te maken met diverse gegevens op, dus als ik zo uiteindelijk 10-15 werkbladen vol gegevens heb, is het missch logisch dat mijn macro traag gaat.

Ik ben nu een alternatieve oplossing aan het zoeken...
 
Al eens geprobeerd om automatisch berekenen uit te zetten tijdens het doorlopen van je macro ?
Bovenaan je code
Code:
Application.Calculation = xlcalculationmanuel
onderaan je code
Code:
Application.calculation = xlcalculationautomatic
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan