Minggu, 12 Maret 2017

[belajar-excel] Digest Number 4123

7 Messages

Digest #4123
1a
Re: formula makro dan lambat by "lkm jktind" lkmjkt
1b
Re: formula makro dan lambat by "lkm jktind" lkmjkt
1c
Re: formula makro dan lambat by "Mr. Kid" nmkid.family@ymail.com
1d
Re: formula makro dan lambat by "lkm jktind" lkmjkt
1e
Re: formula makro dan lambat by "lkm jktind" lkmjkt
3a
Re: Update data kontak (file vcf) by "Heru Safrudin" heru.safrudin

Messages

Sun Mar 12, 2017 4:09 pm (PDT) . Posted by:

"lkm jktind" lkmjkt

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.nmkid@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 lkmjktind@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.nmkid@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 lkmjktind@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
>>>>
>>>>
>>>
>>
>
>

Sun Mar 12, 2017 4:43 pm (PDT) . Posted by:

"lkm jktind" lkmjkt

oh iya : di dalam ada perintah mengurutkan sheet 1 (OHLC)
dan hasil nya di sheet 2.

Hasil :

Loop saja -- nga pakai sort = 32,37
Loop saja -- pakai sort = 33,81
B,C,D = 33,71
B,C,D,E = 50,96
B,C,D,E,F = 68,33
B,C,,D,E,F,G = 85,46
B,C,D,E,F,G,H = 104,08 ---Lebih kecil (111,05)
---- mungkin saat ini cuma terbukan 1 workbook saja.

B,C,D - nga ada perhitungan.
E,F,G - perjumlahan
H - Perkalian dulu --> lalu di jumlahkan

Salam

Lukman

2017-03-13 6:09 GMT+07:00 lkm jktind <lkmjktind@gmail.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.nmkid@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 lkmjktind@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.nmkid@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 lkmjktind@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
>>>>>
>>>>>
>>>>
>>>
>>
>>
>
>

Sun Mar 12, 2017 5:13 pm (PDT) . Posted by:

"Mr. Kid" nmkid.family@ymail.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 lkmjktind@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.nmkid@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 lkmjktind@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.nmkid@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 lkmjktind@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
>>>>>
>>>>>
>>>>
>>>
>>
>
>

Sun Mar 12, 2017 6:20 pm (PDT) . Posted by:

"lkm jktind" lkmjkt

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.nmkid@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 lkmjktind@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.nmkid@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 lkmjktind@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.nmkid@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 lkmjktind@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
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
>

Sun Mar 12, 2017 6:28 pm (PDT) . Posted by:

"lkm jktind" lkmjkt

tambahan : sebelum loop ---- data nya aku sort sesuai yg di butuhkan ---
biar bisa sekali proses.

untuk kasus ku -- di sort berdasarkan tanggal.

salam

Lukman

2017-03-13 8:20 GMT+07:00 lkm jktind <lkmjktind@gmail.com>:

> 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.nmkid@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 lkmjktind@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.nmkid@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 lkmjktind@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.nmkid@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 lkmjktind@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
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>>
>
>

Sun Mar 12, 2017 6:00 pm (PDT) . Posted by:

"lkm jktind" lkmjkt

Kalau mau pakai formula :

=IF(COUNTIFS($A$3:$A3;$A3;$B$3:$B3;$B3;$C$3:$C3;$C3)=1;$B3;"")

contoh file terlampir .

tapi urutannya tidak seperti yg bapak kehendaki .

salam

Lukman

2017-03-11 8:55 GMT+07:00 ANTONIUS TEGUH PRASETYA qsetya@yahoo.co.id
[belajar-excel] <belajar-excel@yahoogroups.com>:

>
>
> Dear Para Master Excel,
>
> Mohon Bantuan untuk membuat Formula yang dapat menampilkan List data yang
> sesuai dengan beberapa Kriteria.
>
> File Contoh dan Hasil yg di inginkan terlampir.
>
> Pertanyaan ini sudah pernah saya emailkan sebelum nya, namun hari ini saya
> cari dalam Sent/Inbox email saya sudah tidak ada, maka saya email ulang.
>
> Mohon bantuan nya. Terima Kasih
>
> Best Regards
>
> Antonius Teguh Prasetya
> Internal Audit
> 08113595741
> 087856491360
>
>
>

Sun Mar 12, 2017 6:29 pm (PDT) . Posted by:

"Heru Safrudin" heru.safrudin

Alamdulillah …. Setelah bersabar menunggu akhirnya dapat jawaban,

Terima kasih banyak Mr. responnya, akan saya pelajari dulu

<ymsgr:sendIM?heru.safrudin> Heru SafrudinBISI,Heru Safrudin,YM online

From: belajar-excel@yahoogroups.com [mailto:belajar-excel@yahoogroups.com]
Sent: 12 Maret 2017 10:12
To: BeExcel
Subject: Re: [belajar-excel] Update data kontak (file vcf)

Hai Heru,

Bisa.

vCard file (.vcf) adalah plain text file dengan struktur yang standar. Sila dilihat standarisasinya disini <https://en.wikipedia.org/wiki/VCard#Properties> , dengan contohnya disini <https://en.wikipedia.org/wiki/VCard#Example_of_vCard_files> .

Jadi, pada tabel contacts di sebuah sheet, disertakan kode properti yang sesuai. Kemudian di sebuah kolom, susun dengan formula blok vCard setiap record contact yang ada. Setiap contact selalu mulai dengan BEGIN:VCARD dan diakhir dengan END:VCARD. Jangan lupa, item ke-2 adalah VERSION

Setelah di kolom baru tersebut di dapat bunyi blok vCARD untuk contact di baris itu, barulah dilakukan penulisan ke text file yang diberi ekstensi .vcf

Contoh menulis isi range ke sebuah plain text file bisa dilihat disini <https://app.box.com/s/7urcxbqc33vu7sk8m9t5qnmmf7hi1ja1> .

Regards,

Kid

2017-03-04 9:59 GMT+07:00 'Heru Safrudin' fcprocessing.bisikediri@bisi.co.id [belajar-excel] <belajar-excel@yahoogroups.com>:

Dear B-Exceller,

Saya punya data kontak di excel, dengan beberapa kali konversi akhirnya data file excel bisa jadi file contact (vcf)

Pertanyaan saya bisakah vba menghubungkan file contact tersebut di ke dan dari excel ?

Mohon pengetahuannya

Terima kasih

Heru SafrudinBISI,Heru Safrudin,YM online

============================================================
Pojok Lowongan Kerja yang disediakan milis :
http://milis-belajar-excel.1048464.n5.nabble.com/Pojok-Lowongan-Kerja-f5725753.html
*** Posting lowongan kerja : ke link tersebut dan klik New Topic
============================================================
bergabung ke milis (subscribe), kirim mail kosong ke: belajar-excel-subscribe@yahoogroups.com
posting ke milis, kirimkan ke: belajar-excel@yahoogroups.com
berkunjung ke web milis : http://tech.groups.yahoo.com/group/belajar-excel/messages
melihat file archive / mendownload lampiran : http://www.mail-archive.com/belajar-excel@yahoogroups.com/
atau (sejak 25-Apr-2011) bisa juga di : http://milis-belajar-excel.1048464.n5.nabble.com/
menghubungi moderators & owners: belajar-excel-owner@yahoogroups.com
keluar dari membership milis (UnSubscribe), kirim mail kosong ke : belajar-excel-unsubscribe@yahoogroups.com
---------------------------------------------------------------------

Tidak ada komentar:

Posting Komentar