• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Wat remt de uitvoer van een macro af ?

Status
Niet open voor verdere reacties.

cow18

Terugkerende gebruiker
Lid geworden
24 mei 2008
Berichten
4.277
Besturingssysteem
Windows
Office versie
Excel365
goeie morgen,
ik zit op een andere site een vraagje op te lossen, waarbij op een heel stomme manier lege rijen tussen blokken worden tussengevoegd met een insert.
Dat moet hij zo'n 240 keer doen tijdens een loop en dat gaat natuurlijk razend snel als je de screenupdating uitzet, iets tussen de 0.7 sec.
Doe ik echter vooraf een afdrukvoorbeeld (zonder echt af te drukken) en laat ik daarna de macro lopen, dan komen daar op de slag 2 sec bijeen zonder reden. Er zijn geen variabelen gedeclareerd, dus geen Publics en ook geen in de macro zelf. Er blijft misschien ergens iets in het geheugen of zo achter, maar wat precies ? Berekenen staat op handmatig, er zijn geen VO's, geen events, ...
Waarom komt er, van zodra je een afdrukvoorbeeld vraagt, zomaar 2 sec bij ?
 

Bijlagen

  • Kopie van Pour-BsAlv.xlsm
    75,1 KB · Weergaven: 7
Gokje:

Door het afdrukvoorbeeld worden paginagrenzen berekend.
Die worden ook zichtbaar in het scherm
Door de uitbreiding van de usedrange met lege rijen, moeten de paginagrenzen ook steeds opnieuw (240 keer) berekend worden.

Je kunt de TS beter suggereren de rijhoogte van de eerste rij van ieder blok te vergroten.
Of via een array lege rijen 'toe te voegen'. Die array wordt dan in 1 keer weggeschreven.
 
Laatst bewerkt:
ik dacht om slim te zijn en het printbereik te wijzigen via ActiveSheet.PageSetup.PrintArea = "a1:b1" of ="", maar dat haalt ook niets uit.
ik ga straks Optie2 (met array) eens proberen, maar die had ik er al eens in gehad maar dan met een union, dus met cellen, om in 1 keer alle rijen in te voegen, ...
 
Kwestie van nog wat meer uitzetten:
Code:
Sub Tri_C_JKP_3()     ' TRI PAR COLONNE C / DanielC

    Dim I As Long
    Application.ScreenUpdating = False
    Application.PrintCommunication = False
    ActiveSheet.DisplayPageBreaks = False
    'ThisWorkbook.Saved = True
    deb = Timer


    Range("C1", Cells(Rows.Count, 1).End(xlUp)).Resize(, 4).Sort [C1], xlAscending, Header:=xlYes
    For I = Cells(Rows.Count, 1).End(xlUp).Row - 1 To 2 Step -1
        If Cells(I, 3) <> Cells(I + 1, 3) Then Cells(I + 1, 3).EntireRow.Insert: j = j + 1
    Next I

    t1 = Timer     '1ier chronomètre
    Application.ScreenUpdating = True
    DoEvents
    t2 = Timer     '2ième chronomètre
    Application.PrintCommunication = True
    ActiveSheet.DisplayPageBreaks = True

    Debug.Print "PrintCommunication  and DisplayPageBreaks on/off, " & Format(t1 - deb, "0.00\s") & vbLf & "nombre de lignes vides :  " & j & vbLf & Format((t1 - deb) / j * 1000, "0.0\s") & " sec pour 1.000 lignes" & vbLf & vbLf & "screenupdating = " & Format(t2 - t1, "0.00\s") & vbLf & vbLf & "temps total : " & Format(t2 - deb, "0.00\s")



End Sub
 
Stel een range van 2400 rijen.
In het voorbeeld 2 kolommen.
Om de 10 rijen moet een lege rij ingevoegd worden.
Met een array (beslist sneller dan .2 seconden):

Code:
Sub M_snb()
   With Cells(1).CurrentRegion
     sn = .Resize(2401)
   End With
   For jj = 1 To UBound(sn, 2)
     sn(UBound(sn), jj) = ""
   Next
   
   st = [transpose(row(1:2400))]
   For j = 10 To UBound(sn) Step 10
     st(j) = st(j) & "," & 2401
   Next
   st = Split(Join(st, ","), ",")
   
   sp = Application.Index(sn, Application.Transpose(st), Array(1, 2))
   Cells(1, 6).Resize(UBound(sp), UBound(sp, 2)) = sp
End Sub
 
@jkPieterse, haha, inderdaad, zo werkt het netjes zonder extra tijd. Knap en bedankt !
@SNB, ook bedankt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan