Ok (pak Kid) nanti malam, akan aku buatkan seprti contoh yg bapak berikan.
If lNilaiD > lNilaiK Then -- If Soh1.Cells(rc, 1) <> Soh2.Cells(rx, 1) Then ----> aku jumlahkan per tanggal. Kalau seperti yg bapak berikan ----- hasil nya aku mesti simpan dimana ? kalau di sheet2 (Soh2.) berarti mesti pakai formula ? (match) rx ---> row dari Soh2. rc ---> row dari Soh1 kolom B : ---banyak nya data per tanggal ---> shett bantu --- apakah ada nya ada nga ada (kelupaan -- input) Kolom C --- awal row -- per tanggal ----> sheet bantu -untuk di pakai formula Vlookup , match Kolom D --- akhir row -- per tanggal -----> shett bantu sda Kolom E ~ G ---- hanya di jumlah per tanggal lalu di bagi 1.000.000 (mungkin di bagi dulu -- baru di jumlahkan ) Kolom H ---- perkalian (H * N ) --- lalu di jumlah pertanggal -- terakhir di bagi 1.000.000 terima kasih . salam Lukman NB : saat ini -- memang aku buka 2 sheet, 2017-03-13 7:13 GMT+07:00 'Mr. Kid' mr.nm...@gmail.com [belajar-excel] < belajar-excel@yahoogroups.com>: > > > Nah tuh kan... > > Loop datanya memang 1 kali, tapi loop kriterianya jadi sebanyak jumlah > baris data. > Itu kan seperti ini : > > > Loop yang umumnya disusun oleh kebanyakan orang adalah : (loop 2 blok > nested) -> dugaan saya, Anda pakai susunan loop yang ini (sila cek lagi > file Anda) > Dim lRowD As Long, lRowK As Long > Dim lNilaiD As Long, lNilaiK As Long > > *For lRowD = 2 To 900001* > lNilaiD = Cells(lRowD, 1).Value > *for lrowk=2 to 1001* > lNilaiK = Cells(lRowK, 5).Value > if lNilaiK=lNilaiD then > 'lakukan proses terhadap data di baris lRowD > endif > *next lrowk* > *Next lRowD* > > *** Blok for next (loop dengan for next) yang dibiru, memiliki *worst > case* terjadi proses pembacaan 900ribu * 1000 kali proses karena setiap 1 > baris data di sheet D akan melakukan pembacaan 1000 baris kriteria. Case > tercepatnya adalah 900ribu * 1 kali proses (karena *semua data di D > sesuai dengan kriteria ke-1 saja*). Padahal realitasnya adalah diantara 2 > case tersebut. > *** Tercepat : 900ribu proses > *** Terlambat : 900JUTA proses > *** Pertengahannya : 900ribu < proses < 900JUTA proses > > > Namanya kan gak sekali jalan, karena si kriteria dibaca berulang-ulang > oleh setiap record data. > > > Coba bandingkan dengan yang ini : > > Loop 1 kali baca seperti ini : > Dim lRowD As Long, lRowK As Long > Dim lNilaiD As Long, lNilaiK As Long > lRowK = 2 > lNilaiK = Cells(lRowK, 5).Value > *For lRowD = 2 To 900001* > lNilaiD = Cells(lRowD, 1).Value > If lNilaiD > lNilaiK Then > lRowK = lRowK + 1 > lNilaiK = Cells(lRowK, 5).Value > If lNilaiD = lNilaiK Then > 'lakukan proses terhadap data di baris lRowD > End If > ElseIf lNilaiD = lNilaiK Then > 'lakukan proses terhadap data di baris lRowD > End If > If lRowK > 1001 Then Exit For > *Next lRowD* > > Berapa kali 1 bijik nilai kriteria dibaca ? > > > > > > Regards, > Kid > > > > > > > > 2017-03-13 6:09 GMT+07:00 lkm jktind lkmjkt...@gmail.com [belajar-excel] < > belajar-excel@yahoogroups.com>: > >> >> >> Pak Kid. >> >> Komputer yg digunakan : I5 4 core , 3 Ghz >> >> Sudah aku sekali lagi --- memang sekali jalan saja. >> >> mungkin menjadi cepat , karena di VB bapak . kan belum ada perhitungan >> sama sekali . >> >> Set Woh = Workbooks("OHLC.xlsm") >> Set Soh1 = Workbooks("OHLC.xlsm").Worksheets("OHLC") >> Set Soh2 = Workbooks("OHLC.xlsm").Worksheets("Record") >> >> Soh1.Activate >> Roh = Soh1.Cells(Rows.Count, 1).End(xlUp).Row >> Set Voh = Soh1.Range(Cells(1, 1), Cells(Roh, 1)) >> >> OHLC_Sort_tgl_Tic ' Diurut ,bisa sekali jalan saja. >> >> Application.Calculation = xlCalculationManual >> >> On Error Resume Next >> With Application.WorksheetFunction >> >> Soh2.Cells(1, 10).Clear >> Soh2.Activate >> >> For rc = 2 To Soh1.Cells(Rows.Count, 1).End(xlUp).Row >> >> If Soh1.Cells(rc, 1) <> Soh2.Cells(rx, 1) Then >> For rx = 2 To Soh2.Cells(Rows.Count, 1).End(xlUp).Row >> >> If Soh1.Cells(rc, 1) = Soh2.Cells(rx, 1) Then >> Soh2.Cells(rx, 5).Value = Soh1.Cells(rc, 10) / 1000000 >> Soh2.Cells(rx, 6).Value = Soh1.Cells(rc, 11) / 1000000 >> Soh2.Cells(rx, 7).Value = Soh1.Cells(rc, 12) >> Soh2.Cells(rx, 8).Value = Soh1.Cells(rc, 14) * >> Soh1.Cells(rc, 8) / 1000000000 >> Soh2.Cells(rx, 3).Value = rc >> Soh2.Cells(rx, 2).Value = 1 >> Exit For >> End If >> Next >> Else >> >> Soh2.Cells(rx, 2).Value = Soh2.Cells(rx, 2) + 1 >> Soh2.Cells(rx, 5).Value = Soh2.Cells(rx, 5) + (Soh1.Cells(rc, >> 10) / 1000000) >> Soh2.Cells(rx, 6).Value = Soh2.Cells(rx, 6) + (Soh1.Cells(rc, >> 11) / 1000000) >> Soh2.Cells(rx, 7).Value = Soh2.Cells(rx, 7) + Soh1.Cells(rc, >> 12) >> Soh2.Cells(rx, 8).Value = Soh2.Cells(rx, 8) + (Soh1.Cells(rc, >> 14) * Soh1.Cells(rc, 8) / 1000000000) >> >> If Soh1.Cells(rc, 1) <> Soh1.Cells(rc + 1, 1) Then >> Soh2.Cells(rx, 4).Value = rc >> End If >> >> End If >> >> Next >> End With >> >> >> Salam >> >> >> >> >> Lukman >> >> Nilai dari rc --- bertambah terus -- nga pernah mundur . >> >> >> >> >> >> 2017-03-13 5:33 GMT+07:00 'Mr. Kid' mr.nm...@gmail.com [belajar-excel] < >> belajar-excel@yahoogroups.com>: >> >>> >>> >>> Hai Lukman, >>> >>> Dugaan saya, loop Anda masih ada proses yang dibaca berulang. 900ribu >>> baris sampai lebih dari 1 menit pada komputer jaman sekarang. Dengan >>> prosesor generasi pertama core i3 yang speed terendahnya 1.3Gz saja, >>> mestinya proses loop mungkin maksimal sekitar 50 sampai 60 detik. Apalagi >>> jika pakai generasi tahun 2012an atau malah pakai generasi 3 atau 4 core i3 >>> clock terendah, mungkin hanya sekitar 30 sampai 40 detik saja. Apalagi >>> kalau sudah pakai generasi 5 ke atas, mestinya hanya sekitar 20 sampai 25 >>> detik sudah selesai. >>> >>> Seperti pada contoh lalu : >>> sheet data kolom A mulai baris 2 ada 900ribu record sorted ascending. >>> sheet kriteria kolom E mulai baris 2 ada 1000 kriteria sorted ascending. >>> Asumsinya bertipe numerik. Setiap baris sheet data di Kolom A yang sama >>> dengan setiap baris di sheet kriteria kolom E akan diproses. >>> >>> Loop 1 kali baca seperti ini : >>> Dim lRowD As Long, lRowK As Long >>> Dim lNilaiD As Long, lNilaiK As Long >>> lRowK = 2 >>> lNilaiK = Cells(lRowK, 5).Value >>> *For lRowD = 2 To 900001* >>> lNilaiD = Cells(lRowD, 1).Value >>> If lNilaiD > lNilaiK Then >>> lRowK = lRowK + 1 >>> lNilaiK = Cells(lRowK, 5).Value >>> If lNilaiD = lNilaiK Then >>> 'lakukan proses terhadap data di baris lRowD >>> End If >>> ElseIf lNilaiD = lNilaiK Then >>> 'lakukan proses terhadap data di baris lRowD >>> End If >>> If lRowK > 1001 Then Exit For >>> *Next lRowD* >>> >>> *** Hanya ada 1 blok for next (loop dengan For Next) disana, yaitu >>> terhadap sheet data saja. Proses selalu akan membaca 900ribu kali saja. >>> Jadi worst case nya, memproses 900ribu baris data D. case tercepatnya juga >>> 900ribu baris. >>> *** Tercepat : 900ribu proses >>> *** Terlambat : 900ribu proses >>> *** Pertengahannya : 900ribu proses >>> >>> Loop yang umumnya disusun oleh kebanyakan orang adalah : (loop 2 blok >>> nested) -> dugaan saya, Anda pakai susunan loop yang ini (sila cek lagi >>> file Anda) >>> Dim lRowD As Long, lRowK As Long >>> Dim lNilaiD As Long, lNilaiK As Long >>> >>> *For lRowD = 2 To 900001* >>> lNilaiD = Cells(lRowD, 1).Value >>> *for lrowk=2 to 1001* >>> lNilaiK = Cells(lRowK, 5).Value >>> if lNilaiK=lNilaiD then >>> 'lakukan proses terhadap data di baris lRowD >>> endif >>> *next lrowk* >>> *Next lRowD* >>> >>> *** Blok for next (loop dengan for next) yang dibiru, memiliki *worst >>> case* terjadi proses pembacaan 900ribu * 1000 kali proses karena setiap >>> 1 baris data di sheet D akan melakukan pembacaan 1000 baris kriteria. Case >>> tercepatnya adalah 900ribu * 1 kali proses (karena *semua data di D >>> sesuai dengan kriteria ke-1 saja*). Padahal realitasnya adalah diantara >>> 2 case tersebut. >>> *** Tercepat : 900ribu proses >>> *** Terlambat : 900JUTA proses >>> *** Pertengahannya : 900ribu < proses < 900JUTA proses >>> >>> Regards, >>> Kid >>> >>> >>> >>> >>> >>> >>> 2017-03-12 15:30 GMT+07:00 lkm jktind lkmjkt...@gmail.com >>> [belajar-excel] <belajar-excel@yahoogroups.com>: >>> >>>> >>>> >>>> Pak Kid . >>>> >>>> Terima kasih. >>>> >>>> atas penjelasan nya . --- jadi ada pilihan --- mengapa aku nga pakai >>>> fungsi SUM saja -- dari pada pakai SUMIF >>>> >>>> >>>> Tapi rasanya aku tetap pakai loop saja . waktunya dibawah 2 menit . >>>> (111.05 detik) >>>> >>>> besar kemungkinan : walaupun sumif --- aku ganti menjadi fungsi sum >>>> dengan bantuan dari komlom L (sebagai data awal) dan kolom M (sebagai >>>> data akhir) dari perjumlahan , besar kemungkin waktu nya di atas 2 >>>> menit , apalagi kalau pakai sumproduck formula kelas berat . >>>> >>>> memang didalam loop --- itu cuma sekali jalan saja . (walaupun row nya >>>> banyak ) >>>> >>>> >>>> Salam >>>> >>>> >>>> Lukman. >>>> >>>> >>>> >>>> NB : baru coba fungsi countif saja -- sudah diatas 2 menit . >>>> (kolom K) saja. >>>> >>>> >>>> >>>> >>>> >>>> 2017-03-12 9:17 GMT+07:00 'Mr. Kid' mr.nm...@gmail.com [belajar-excel] >>>> <belajar-excel@yahoogroups.com>: >>>> >>>>> >>>>> >>>>> Hai Lukman, >>>>> >>>>> Tentang : >>>>> 1. bagaimana untuk mendapatkan >>>>> market cap (sheet record) = jumlah pada hari yg sama dari = >>>>> close * Listed Share (sheet OHLC) >>>>> > jika dengan formula, maka bisa memanfaatkan fungsi SumProduct. >>>>> > yang perlu diingat adalah karakteristik SumProduct yang bekerja pada >>>>> array, sehingga berpotensi akan lambat ketika tidak membatasi area range >>>>> yang dikalkulasi. >>>>> >>>>> 2. mengapa pakai looping (111.05 ) , lebih cepat dari pada pakai >>>>> formula di macro (673.38) ? >>>>> Selisih waktu nya sangat jauh. >>>>> > Mengkalkulasi sesuatu dengan VBA bisa melalui perhitungan tiap item >>>>> yang dikalkulasi dengan proses loop, memanfaatkan worksheet function dalam >>>>> VBA, atau dengan memasang formula dengan VBA, maupun meng-evaluate suatu >>>>> bunyi formula dengan VBA. >>>>> > Jadi, ada baiknya Anda pahami dulu perbedaannya. >>>>> > Biasanya, kalkulasi tiap item dengan loop berusaha untuk sesedikit >>>>> mungkin proses loop itu sendiri. Contohnya, akan menjumlahkan data >>>>> berdasar >>>>> kriteria tertentu dengan kriteria tersebut ada di suatu tabel tersendiri. >>>>> Maka proses loop diusahakan cukup melakukan loop 1 kali pada data saja >>>>> jika >>>>> memungkinkan. >>>>> > Kalkulasi dengan worksheet function (berbeda dengan formula loh ya), >>>>> ciri umumnya adalah menggunakan fungsi-fungsi yang biasa dipakai di dalam >>>>> worksheet untuk menyusun formula. Contohnya seperti worksheetfunction.SUM >>>>> yang menggunakan fungsi SUM. >>>>> > Kalkulasi dengan formula dalam VBA biasanya berupa memanfaatkan >>>>> pemasangan formula ke dalam sheet dan menyerahkan proses kalkulasi formula >>>>> tersebut kepada Excel Calculation. Proses ini biasanya tidak membutuhkan >>>>> loop apapun. Contoh : range("b1:b5").formula="=Row()" >>>>> > Kalkulasi dengan evaluate mirip dengan kaklkulasi dengan formula >>>>> dalam VBA, hanya saja, proses kalkulasi dilakukan langsung tanpa proses >>>>> menulis formula ke dalam cells. Tidak banyak kasus yang bisa secara >>>>> leluasa >>>>> menggunakan cara ini seutuhnya. >>>>> >>>>> Apa beda penggunaan formula dengan worksheet function ? >>>>> > Penggunaan formula akan lebih luwes dan luas, karena penulisan >>>>> formula bisa dicoba dulu dalam worksheet dan digunakan apa adanya bunyi >>>>> formula yang terbentuk. >>>>> > Selain itu, penggunaan nested function dan array formula sangat >>>>> dimungkinkan ketika menggunakan formula dan tidak mudah atau tidak >>>>> dimungkinkan jika menggunakan worksheet function. Contohnya adalah formula >>>>> =Sum( Index( data!A:A , report!b3 ):Index( data!A:A , report!C3 ) >>>>> ) >>>>> yang merupakan penjumlahan dinamis dengan area range yang diproses >>>>> dibuat terbatas seperlunya agar tidak memberatkan kerja kalkulasi Excel. >>>>> Andai di sheet report cells B3 bernilai 11 dan di sheet report C3 >>>>> bernilai 23, maka formula di atas setara =Sum( data!A11:A23 ) >>>>> Formula tersebut tidak mudah disusun dengan worksheet function. >>>>> >>>>> Contoh lain : =Small( IF( A1:A7 ="kid", B1:B7 ) , Row(1:7) ) yang >>>>> merupakan array formula filtering. >>>>> Formula seperti ini tidak bisa disusun dengan worksheet function. >>>>> >>>>> Jadi, menggunakan baris kode berbunyi : >>>>> range("a1").value=worksheetfunction.sum( range("z7:z9") ) >>>>> bukanlah proses formula dengan VBA, tetapi proses kalkulasi dengan >>>>> fungsi yang disediakan untuk digunakan dalam cells. >>>>> >>>>> >>>>> Worksheet function vs formula (memasang formula dalam cells) >>>>> > kecepatan kerja keduanya dapat dikatakan seimbang. >>>>> > terkadang, pada bentuk formula yang rumit, memasang formula akan >>>>> memudahkan penyusunan baris kode walau agak lama proses kalkulasinya. >>>>> >>>>> Khusus loop, >>>>> cara ini adalah yang tercepat, tetapi membutuhkan logika penyusunan >>>>> proses yang terus terasah. >>>>> Beberapa hal yang patut dipertimbangkan dalam loop : >>>>> 1. lakukan loop melalui array-nya sebanyak mungkin dibanding >>>>> menggunakan object (cells, worksheet, dsb) >>>>> > kalau bisa, hindari for each next >>>>> 2. simpan nilai ke suatu variabel (skalar maupun array) jika >>>>> dibutuhkan berulang-ulang atau akan dikalkulasi berulang-ulang, jangan >>>>> membaca ulang object >>>>> 3. pilih dan susun loop agar tidak melakukan loop yang sama >>>>> berulang-ulang dengan mengurutkan data dan kriteria >>>>> contoh : sheet data kolom A mulai baris 2 ada 900ribu record >>>>> sorted ascending. sheet kriteria kolom E mulai baris 2 ada 1000 kriteria >>>>> sorted ascending. Asumsinya bertipe numerik. Setiap baris sheet data di >>>>> Kolom A yang sama dengan setiap baris di sheet kriteria kolom E akan >>>>> diproses. >>>>> Dim lRowD As Long, lRowK As Long >>>>> Dim lNilaiD As Long, lNilaiK As Long >>>>> lRowK = 2 >>>>> lNilaiK = Cells(lRowK, 5).Value >>>>> For lRowD = 2 To 900001 >>>>> lNilaiD = Cells(lRowD, 1).Value >>>>> If lNilaiD > lNilaiK Then >>>>> lRowK = lRowK + 1 >>>>> lNilaiK = Cells(lRowK, 5).Value >>>>> If lNilaiD = lNilaiK Then >>>>> 'lakukan proses terhadap data di baris lRowD >>>>> End If >>>>> ElseIf lNilaiD = lNilaiK Then >>>>> 'lakukan proses terhadap data di baris lRowD >>>>> End If >>>>> If lRowK > 1001 Then Exit For >>>>> Next lRowD >>>>> >>>>> Kira-kira demikian, >>>>> >>>>> Regards, >>>>> Kid >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> 2017-03-11 19:46 GMT+07:00 lkm jktind lkmjkt...@gmail.com >>>>> [belajar-excel] <belajar-excel@yahoogroups.com>: >>>>> >>>>>> >>>>>> >>>>>> 1. bagaimana untuk mendapatkan >>>>>> market cap (sheet record) = jumlah pada hari yg sama dari = >>>>>> close * Listed Share (sheet OHLC) >>>>>> >>>>>> 2. mengapa pakai looping (111.05 ) , lebih cepat dari pada pakai >>>>>> formula di macro (673.38) ? >>>>>> Selisih waktu nya sangat jauh. >>>>>> >>>>>> sheet OHLC : row hampir 900.000 >>>>>> sheet Record : row : 2819 >>>>>> >>>>>> >>>>>> >>>>>> Salam >>>>>> >>>>>> >>>>>> Lukman >>>>>> >>>>>> >>>>> >>>> >>> >> > >