Hehehe... Sepertinya dah keduluan pak Anton. Cm sayang, blm masuk email saya (tahunya lihat ke website milis).
Btw, Untuk option base 0 yg sudah jadi default vba, deklarasi array bisa : Dim arr(99999,0) as long Wassalam, Kid. On Aug 26, 2013 9:54 AM, "Jan Raisin" <[email protected]> wrote: > ** > > > 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 >> >> >> >> >> >> >> > >

