Terima kasih Miss Jan atas variasi codenya.
Hasil tes terakhir dengan looping 60000 adalah sebagai berikut:
16.81 detik<--TES1 'For ... Next dengan formula
1.24 detik<--TES2 'For ... Next tanpa formula
1.37 detik<--TES3 'For each ... Next tanpa formula (For each r in Rng)
1.34 detik<--TES4 'For each ... Next dengan formula (For each Rng in Rng)
0.05 detik<--TES5 (MJR) 'Tranpose Array
Code Miss Jan saya modifikasi sbb:
Sub Tes5()
Dim TStart As Single
Dim myArray(0 To 59999) As Long 'sebelumnya 9999
Dim i As Long
Dim rng As Range
TStart = Timer
For i = 1 To 60000 'sebelumnya 10000
myArray(i - 1) = i
Next i
Set rng = Range("o1:o60000") 'sebelumnya 10000
rng.Value = Application.WorksheetFunction.Transpose(myArray)
Range("E5").Value = Format(Timer - TStart, "#,##0.0000")
End Sub
Jadi code Miss Jan is the best.
Kesimpulannya:
- Tes2 lebih cepat dari Tes3 dan Tes4 (saya sependapat dengan Miss Jan) karena
ada proses pencarian r atau Rng pada code: Range("C" & r.Row) = r.Rowatau
Range("D" & Rng.Row) = Rng.Row
- Proses Array jauh lebih cepat, namun menyisakan satu pertanyaan .... (mengapa
100k atau bahkan 70k selalu gagal dengan pesan kesalahan "Type
mismatch" pada code:
rng.Value = Application.WorksheetFunction.Transpose(myArray)
Salam,
HK
________________________________
From: Jan Raisin <[email protected]>
To: [email protected]
Sent: Saturday, 24 August 2013, 14:10
Subject: Re: [belajar-excel] Tes Looping For ... Next dan For each ... Next
boleh jawab kan pak Hendrik..
sepengetahuan Jan, For Each - Next bekerja lebih cepat dibandingkan dengan For
To - Next, karena pada For Each tidak ada proses menghitung lebih dahulu
ilustrasinya adalah begini:
Di atas meja makan ada combro (kenapa combro? karena Jan senang makan combro
xixixixi ^_^)
perintah 1: Untuk setiap combro yang ada, makan sampai habis >> for each
akan lebih cepat prosesnya jika dibandingkan dengan
perintah 2: Untuk combro ke 1 sampai ke sekian makan sampai habis >> for to
karena pada perintah ke-2 ada proses menghitung dahulu sebelum Be-Exceller
memakan combro yang ada di atas meja
Tetapi hal ini akan akan berbeda jika ada pekerjaan yang harus dijalankan lagi
di dalam blok for each
pekerjaannya mana? bisa dilihat dari setiap titik yang ada dalam script
1 buah titik mewakili 1 buah pekerjaan atau proses
misal:
range("a1").select
selection.value = 1
akan diproses lebih lama dibandingkan script
range("a1").value = 1
walau pun perbedaannya di komputer sekarang hampir tidak terasa
coba lihat di prosedur Tes3 dan Tes4 saat akan memasukan nilai ada 1 buah
pekerjaan yang harus dilakukan dahulu yaitu mencari nilai barisnya terlebih
dahulu
sedangkan di prosedur Tes2 tidak ada pekerjaan tersebut
oia.. Jan mau nyumbang script.. tapi minta tolong semua batasannya diturunin
dari 100k baris menjadi 10k baris
karena pada saat proses transpose untuk 100k selalu gagal.. mungkin nanti mr
Kid atau pak Anton bisa memberikan penjelasan penyebab gagalnya transpose
tersebut.
prosesnya memanfaatkan array, karena proses baca tulis ke range lebih lambat
dibandingkan proses baca tulis melalui array
Sub Tes5()
Dim TStart As Single
Dim myArray(0 To 9999) As Long
Dim i As Long
Dim rng As Range
TStart = Timer
For i = 1 To 10000
myArray(i - 1) = i
Next i
Set rng = Range("o1:o10000")
rng.Value = Application.WorksheetFunction.Transpose(myArray)
Range("E5").Value = Format(Timer - TStart, "#,##0.0000")
End Sub
silakan coba dibandingkan hasilnya, di komputer Jan script tersebut berjalan 32
x lebih cepat dibandingkan Tes2
salam,
-Miss Jan Raisin-
Pada 24 Agustus 2013 11.25, hendrik karnadi <[email protected]> menulis:
>
>Dear Be Excellers,
>Terlampir adalah hasil uji coba (tes) Looping For ... Next dan For each ...
>Next pake timer.
>
>
>Pertanyaan:
>Mengapa dengan menggunakan For ... Next (Tes2, tanpa formula) hasilnya lebih
>cepat dibandingkan dengan For each ... Next (Tes3 dan Tes 4).
>
>
>Salam,
>HK
>
>