Macro is te traag

Status
Niet open voor verdere reacties.

Klikmaar

Gebruiker
Lid geworden
22 okt 2008
Berichten
58
Ik ben sinds kort bezig met VBA en Excel.
Ik heb m.b.v. een Macro geprobeerd van 2 diverse Excelsheets een 3de Excelsheet met de vergelijking te maken.
Dit lukt aardig, maar het is zeer traag en ik denk dat de code veel efficienter kan.

Wie kan mij helpen?
 

Bijlagen

Zet screen updating eens uit: Application.ScreenUpdating = False (en aan het eind weer aan)

Andere mogelijkheid is om eerst de sheets in arrays in te lezen en dan een derde array te genereren. Daarna het nieuwe array in sheet 3 dumpen.

Ron
 
De tip van uit en weer aanzetten lukt prima. Geen geflits meer.

Kun je mij een voorbeeldje geven van arrays?
Ik ben beginnend en met de help van Excel kom ik niet veel verder.
 
Laatst bewerkt:
Dat klopt:

Code:
Sub tst()
  With Sheets("Vergelijken").UsedRange
    c1 = Join(WorksheetFunction.Transpose(.Columns(1)), "|")
    sq = .Value
  End With
    
  For j = 1 To 2
    sn = Sheets(Choose(j, "Serva", "Prikklok")).Cells(1, 1).CurrentRegion
    For jj = 2 To UBound(sn)
      c2 = UBound(Split(Split(c1, "|" & sn(jj, 1))(0), "|")) + 2
      For jjj = 2 To 5                    '    UBound(sn, 2)
        sq(c2, 3 * (jjj - 2) + j + 1) = sn(jj, jjj)
      Next
    Next
  Next
  Sheets("Vergelijken").UsedRange = sq
End Sub

Beperk het aantal schrijfbewerkingen tot het minimum
Vermijd Select en Activate in VBA-code.
Een systematische opbouw van gegevens in werkbladen voorkomt veel VBA-code.

Jouw opzet ziet er al behoorlijk systematisch uit.
Als de volgorde van de nummers van de medewerkers ook altijd hetzelfde is kan het nog eenvoudiger:

Code:
Sub tst()
  sq=Sheets("Vergelijken").UsedRange
    
  For j = 1 To 2
    sn = Sheets(Choose(j, "Serva", "Prikklok")).Cells(1, 1).CurrentRegion
    For jj = 2 To UBound(sn)
      For jjj = 2 To 5                    '    UBound(sn, 2)
        sq(jj, 3 * (jjj - 2) + j + 1) = sn(jj, jjj)
      Next
    Next
  Next
  Sheets("Vergelijken").UsedRange = sq
End Sub
Als je in je macro slechts 1 schrijfbewerking hebt is application.screenupdating=false zelfs overbodig.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan