mr Kid.. izin untuk nge-tes dan modifikasi skripnya ya ^_^
biar ketularan pinternya xixixixi ^_^

Public Sub Ikutan()
    Dim rng As Range
    Dim lArr(0 To 99999, 0 To 0) As Long, lLoop As Long
    Dim dblTime As Double
    dblTime = Timer
     Set rng = Range("z1:z100000")
    For lLoop = 1 To 100000
          lArr(lLoop - 1, 0) = lLoop
    Next lLoop
    rng.Value = lArr
    dblTime = Timer - dblTime
    MsgBox "Waktu proses : " & dblTime & " detik"
End Sub

skrip yang Jan edit ditandai dengan warna merah dan menghasilkan nilai yang
tepat untuk 100k data

skrip dari mr. Kid ini memberikan pencerahan kepada Jan bahwa:
1. setiap cell pada dasarnya tersusun sebagai array multi dimensi
2. cara menghindari proses transpose array saat akan menulis data ke cel
sehingga bisa menghemat waktu komputasi dan menghindari batasan jumlah data
yang bisa ditranspose.

skrip dari mr Kid adalah yang tercepat dari semua cara yang sudah Jan
coba.. Superb..

terima kasih, untuk pak De Premor yang sudah bersedia mengetes For Each vs
For To.. hasil tesnya memberikan wawasan baru untuk Jan.. biasanya Jan
selalu memilih For Each.. tapi sekarang akan melihat kondisi kasusnya
dulu.. karena ternyata For To lebih cepat dari For Each..

terima kasih untuk pak Hendrik.. dengan adanya thread seperti ini sangat
membantu sekali untuk mengembangkan pengetahuan Be-Exceller.. biasanya
newbie yang bertanya tapi sekarang masternya yang langsung memberikan
kasus.. ^_^

salam,


-Miss Jan Raisin-


Pada 25 Agustus 2013 01.02, hendrik karnadi <[email protected]>menulis:

> **
>
>
> Terima kasih Mr Kid.
> Untuk Looping 100000 waktunya hanya 0,063 detik, tapi angkanya 0 semua,
> bukan 1 s/d 100000.
>
> Salam,
> HK
>
>   ------------------------------
>  *From:* Mr. Kid <[email protected]>
> *To:* BeExcel <[email protected]>
> *Sent:* Sunday, 25 August 2013, 0:44
>
> *Subject:* Re: [belajar-excel] Tes Looping For ... Next dan For each ...
> Next
>
>
> Coba :
> Public sub Ikutan()
>     dim rng as range
>     dim lArr(1 to 60000,1) as long, lLoop as long
>     dim dblTime as double
>     dbltime=timer
>     set rng=range("z1:z60000")
>     for lLoop=1 to 60000
>          larr(lLoop,1)=lLoop
>     next lLoop
>     rng.value=lArr
>     dblTime=timer-dbltime
>     msgbox "Waktu proses : " & dbltime & " detik"
> end sub
>
> Katanya fungsi transpose Excel terbatasi array-nya sebanyak 2^16, ada yang
> bilang 2^24. Mungkin yang 2^16 di Office 32 bit dan 2^24 di Office 64 bit
> (tapi gak yakin juga kalau begitu). Yang jelas, tidak ada dokumentasi resmi
> tentang hal ini.
>
> Sebuah cell pada dasarnya dibentuk sebagai array 2 dimensi (1 to 1,1 to 1)
>
> Walaupun topik ini menggunakan baris kode seperti membuat nomor urut,
> sebaiknya setiap pembuatan nomor urut tidak terpaku pada proses loop
> seperti ini saja. Untuk proses komputasi yang tidak sekedar membuat nomor
> urut, maka topik ini bisa menjadi sebuah wacana untuk menyusun solusi
> masalah yang dihadapi pada dunia nyata.
>
> Wassalam,
> Kid.
>
> 2013/8/24 hendrik karnadi <[email protected]>
>
> **
>
>  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.Row atau 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
>
>
>
>
>
>
>   
>

Kirim email ke