Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

versnellen van VBA-code

120 views
Skip to first unread message

Amedee Van Gasse

unread,
May 10, 2004, 6:07:49 AM5/10/04
to
Onderstaande sub doet 54" over een blad met 426 rijen. Ik ben er zeker
van dat dit sneller kan, wie kan me tips geven?

Sub MaakPivotLijst()
' Zet de gegevens in een lijst die geschikt is
' om een draaitabel van te maken.
Dim LeesRijTeller As Integer, SchrijfRijTeller As Integer
Dim CategorieTeller As Integer, KolomTeller As Integer
Dim BronCel As Range, DoelCel As Range
Dim StartTijd As Single

StartTijd = Timer

Set BronCel = Sheets("Lijst").Range("A1")
Set DoelCel = Sheets("PivotLijst").Range("A1")

' Kolomtitels
For KolomTeller = 0 To 5
DoelCel.Offset(0, KolomTeller).Value = _
BronCel.Offset(0, KolomTeller).Value
Next KolomTeller
DoelCel.Offset(0, 6).Value = "Categorie"
DoelCel.Offset(0, 7).Value = "Uren"

' Gegevensrijen
SchrijfRijTeller = 1
For LeesRijTeller = 1 To Sheets("Lijst").UsedRange.Rows.Count - 1
For CategorieTeller = 1 To 3
' Kolommen A-F
For KolomTeller = 0 To 5
DoelCel.Offset(SchrijfRijTeller, KolomTeller).Value = _
BronCel.Offset(LeesRijTeller, KolomTeller).Value
Next KolomTeller
' Kolom G uit rij 1
DoelCel.Offset(SchrijfRijTeller, 6).Value = _
BronCel.Offset(0, 5 + CategorieTeller).Value
' Kolom H uit kolommen G-I
DoelCel.Offset(SchrijfRijTeller, 7).Value = _
BronCel.Offset(LeesRijTeller, 5 + CategorieTeller).Value
SchrijfRijTeller = SchrijfRijTeller + 1
Next CategorieTeller
Next LeesRijTeller

MsgBox Timer - StartTijd
End Sub

--
Amedee

Excel is een rekenbladprogramma; Excell is een computerwinkel.
Excel kan je dus kopen bij Excell.

Jan Karel Pieterse

unread,
May 10, 2004, 6:50:48 AM5/10/04
to
Hi Amedee,

> Onderstaande sub doet 54" over een blad met 426 rijen. Ik ben er zeker
> van dat dit sneller kan, wie kan me tips geven?

1. Voor start berekenen op manueel zetten:

Application.Calculation=xlManual

(niet vergeten terug te zetten aan het einde)

2. Scherm verversen uitzetten:

Application.Screenupdating=False

Groetjes,

Jan Karel Pieterse
Excel MVP
www.jkp-ads.com

Amedee Van Gasse

unread,
May 10, 2004, 7:05:32 AM5/10/04
to
Jan Karel Pieterse <jkpie...@netscape.net> wrote in
news:VA.0000024...@netscape.net:

Dedoeme, da's de klassieker natuurlijk! Dat ik die vergeten ben, doe ik
anders altijd. Nu is 't maar 4,3" meer, of 100 rijen/seconde. Mercikes
hee!

Ik bedoelde eigenlijk ook structurele verbeteringen.
Is er een manier om het nóg sneller te doen?
Mijn definitieve gegevens kunnen enkele duizenden rijen bevatten en dan
duurt het toch nog vrij lang.

PeterS

unread,
May 10, 2004, 7:11:52 AM5/10/04
to
Een snellere PC aanschaffen, Amedee? ;-)

Uitgetest met 9 kolommen van 875 rijen: resulteert in 2623 regels in "PivotLijst"
Duur op m'n labtop: 1.8 seconden
Met calculatie op handmatig: 1.2 seconden.

--
Peter

"Amedee Van Gasse" wrote in message ...

Jan Karel Pieterse

unread,
May 10, 2004, 8:21:51 AM5/10/04
to
Hoi Amedee,

> Is er een manier om het nóg sneller te doen?
>

Ja, je macro herschrijven. Je kunt hele bereiken tegelijk toewijzen:

Worksheets("Sheet1").Range("A1:H1400")=Worksheets("Sheet2").Range("A2:H
1401")

Maar dat is een heel gepuzzel, dat ik graag aan jou overlaat <vbg>.

Amedee Van Gasse

unread,
May 10, 2004, 8:35:40 AM5/10/04
to
Jan Karel Pieterse <jkpie...@netscape.net> wrote in
news:VA.0000025...@netscape.net:

Wordt moeilijk, want 1 rij op Sheet1 wordt telkens 3 rijen op Sheet2.
Dus de grootte van de ranges verschilt. Effe denken...

DoelSheet.Range(DoelCel.Offset(SchrijfRijTeller, 0), _
DoelCel.Offset(SchrijfRijTeller, 5)).Value = _
BronSheet.Range(BronCel.Offset(LeesRijTeller, 0), _
BronCel.Offset(LeesRijTeller, 5)).Value

Yesssss! Werkt 2x sneller dan

For KolomTeller = 0 To 5
DoelCel.Offset(SchrijfRijTeller, KolomTeller).Value = _
BronCel.Offset(LeesRijTeller, KolomTeller).Value
Next KolomTeller

Bedankt he!
;-)

0 new messages