Sabtu, 05 Agustus 2017

[belajar-excel] Digest Number 4261

1 Message

Digest #4261
1a
Re: Masalah "fungsi" Collection dalam VBA by "hendrik karnadi" hendrikkarnadi

Message

Fri Aug 4, 2017 11:05 pm (PDT) . Posted by:

"hendrik karnadi" hendrikkarnadi

Terima kasih Mr. Kid atas penjelasannya....ternyata "key" nya ketinggalan di rmh, jadi masuknya "main paksa".
Salam,HK

Sent from Yahoo Mail on Android

On Fri, Aug 4, 2017 at 23:39, 'Mr. Kid' mr.nmkid@gmail.com [belajar-excel]<belajar-excel@yahoogroups.com> wrote:  

Pak HK,

1. Tentang object Collection ya...
Lepaskan dari rencananya mau cari data unique lebih dulu.
Mulai dari konsep yang namanya collection.

Saya punya koleksi film seri yang kalau ditabelkan begini :
No.  Film_Seri                      Keterangan
1.    Friends                          Ada lengkap
2.    GOT                              6 seasons, sekarang season 7 episode 3
3.    Designated Survivor     Season 1 sudah, nunggu season 2
4.    MacGyver 2016            Season 1 sudah, nunggu season 2
5.    Shooter                         1 seasons, sekarang season 2 episode 4
6.    MacGyver lama            Ada lengkap

Lalu kalau ada teman nanya tentang koleksi film seri yang saya miliki, nanyanya pakai kalimat mana ?
   a. punya film seri yang 'Ada lengkap' itu gak ?   (maksudnya merujuk ke film seri Friends)
atau
   b. punya film seri 'Friends' gak ?

Sepertinya, yang umum adalah pertanyaan yang b bukan ?
Itu sebabnya, suatu koleksi, yang penting adalah nama koleksinya.
Nama koleksinya adalah kalimat yang tipenya string.
Isinya koleksi bisa macam-macam, pada koleksi di atas adalah string tentang keterangan.
Bisa jadi 'keterangan' itu berisi keping DVD atau video files setiap episodenya (object)
dan sebagainya.

Apapun isinya si koleksi, tetap saja yang dirujuk oleh siapapun adalah nama koleksi yang unique.

Sekarang, pakai cerita di atas, lalu kembali ke object collection milik VB/VBA.
Syntax untuk Add ke collection object adalah :

object.Add item, [key], [before], [after]
Jadi dari object Collection, yang penting adalah [Key] (BUKAN item)
Key yang harus unique.
Kalau key dikosongkan, maka akan dibuatkan oleh VBA yang bersifat unique disetiap penambahan koleksi.

Pakai baris kode Anda :
     cKode.Add Rng.Valueitu namanya, mengandalkan item yang berupa nilai si yang disimpan range dalam properti Value.
Key nya si collection mana ?
Karena gak diisi, maka dibuatkan oleh VB/VBA yang unique.
Jadi, pasti semua proses Add akan diterima karena key-nya dibuatkan unique oleh VB/VBA.
Hasilnya, ketika ditampilkan nilai-nilai itemnya, dapetnya ya semua nilai yang di-Add ke collection.
Anda sebut : hasilnya gak unique
Padahal itu unique, karena Key-nya dibuat unique oleh VB/VBA.
Anda dengan VBA masih kurang belum berteman namanya. Karena masih mudah salah paham.

2. Tentang pakai Trim()
Maksudnya baris kode :
     cKode.Add Rng.Valuediganti menjadi :
     cKode.Add Trim(Rng), CStr(Rng)
penulisan idealnya kalau pakai trim dan cstr bagini :
     cKode.Add Trim(Rng.value), CStr(Rng.value)
karena yang di-trim dan di-cstr adalah isi properti Value dari si range. (disiplin itu kesannya susah dan gak praktis, tetapi bermanfaat)

Baris kode itu sudah mengisi nilai Key, yaitu dengan isi properti Value si range yang dibuat jadi bertipe string (cstr).
Ini kan sesuai konsep koleksi di cerita yang ada di atas sana... Orang kalau mau nunjuk koleksi itu pakai kalimat namanya koleksi. Pasti bertipe string.

Kebetulan pada baris kode ini, item si koleksi diisi pakai tipe string juga, yaitu hasil trim dari nilai properti value milik si range.
Bagian item ini, kalau di cerita di atas sana, seperti isinya 'keterangan'
Apa harus di-trim ?
Tentu tidak...

Kalau itemnya memang string (seperti bunyi kalimat keterangan di contoh di atas sana), maka isilah si item dengan string nilai tersebut.
Kalau itemnya adalah object range, ya isilah dengan object range.
Kalau itemnya adalah nilai buku penjualan suatu perusahaan, isilah apa adanya si nilai buku itu.
Kalau itemnya adalah persentase dengan angka dibelakang koma yang banyak sekali, ya isilah sesuai kebutuhan
Bahkan, kalau isinya adalah array, ya isi saja dengan array.
Pokok e, bagian item diisi dengan nilai yang semestinya biar mudah dan selamat. Gak usah di tram trim bikin ruwet dan nambah kerjaan buat si VB/VBA.

Ya to...
Jadi gak repot to...
hidup sekali kok mikirin yang merepotkan...

3. Coba begini deh...
Ada tabel begini
           A                      B                     C
1     NAMA             ALAMAT             kota
2     Agung            Jl S Parman        JKT
3     Seno              Jl S Parman        JOG
4     Agung            Jl S Parman        SMG
5     Seno              Jl S Parman        JOG
Unique berdasar kolom A, 4 records (mulai baris 2), header di baris 1 mulai kolom A, total ada 3 kolom.
dim rng as Range, col as Collection,lRec as long
'nyusun collection berdasar kolom A, berarti hanya diambil kolom A yang unique, pertama kali ditemukan karena bacanya dari A2 sampai A5
set coll=new collection
on error resume next
for each rng in range("a2:a5")
     'item yang disiman adalah object range kolom A (range A1, range A2, dst), key-nya unique berdasar nilai kolom A yang sudah string
     coll.add rng , rng.value    
next rng
err.clear
on error goto 0

'tampilkan tabel yang unique record berdasar kolom A saja, di kolom K:M (3 kolom) mulai baris 2
for lrec=1 to coll.count
      range("K" & lrec+1).resize(1,3).value = coll.item(lrec).resize(1,3).value
next lrec
range("K1:M1").value=array("NAMA","ALAMAT","kota")

'manggil pakai nama koleksinya (berdasar key yang berasal dari kolom A)
msgbox "Key : Agung" _
        & "Alamat koleksi di range : " & coll.item("Agung").address      'bisa juga ditulis coll("Agung").address     tapi lebih baik coll.item("Agung").address

> dari contoh ini, gak pakai cstr dan trim bukan ?
> key diisi tanpa pakai cstr karena memang kolom A isinya sudah string. Kalau kolom A bukan string, maka perlu diubah jadi bertipe string pakai Cstr. Lebih cepat lagi kalau pakai LTrim atau malah LTrim$.
> item diisi tanpa trim, karena yang mau disimpan tidak harus string, justru malah dicontoh itu, yang disimpan di item adalah object range.
> karena item berisi object range, maka bisa dipakai layaknya menggunakan object range seperti baris yang di-biru
> yang baris msgbox, itu mengikuti kebiasaan bahwa suatu koleksi disebut berdasar nama koleksinya (key).

So, contohnya mirip konsep fitur remove duplicate berdasar 1 key bukan ?
Berarti bisa bikin mirip fitur remove duplicate berdasar lebih dari 1 key dong... hehehe... ada yang mo urun script untuk hal ini ?

Regards,
Kid

2017-08-04 17:43 GMT+07:00 hendrik karnadi hendrikkarnadi@yahoo.com [belajar-excel] <belajar-excel@yahoogroups.com>:

 

Dear Be-Excel,
Waktu ngebedah file2 milis tempo dulu, saya menemukan "fungsi" Collection dalam VBA.Kalo ndak salah, Collection pertama kali dikenalkan oleh Pak De Premor, ketika menjawab soal filtering data berdasarkan nama perusahaan.
Ada hal yang menarik dan belum saya dapatkan jawabannya mengenai collection tersebut (baik dalam bentuk string maupun Value.
Untuk test case saya mengambil contoh dalam bentuk value.Ceritanya begini :
Saya mempunyai data dalam bentuk Value di kolom A

Saya membuat macro seperti ini :
Sub UnikAngka()
    
    Dim SrcData As Range, Rng As Range
    Dim cKode As New Collection
    Dim LRow As Long
      
    Set SrcData = Range("A1", Range("A1").End(xlDown))
    
    On Error Resume Next
    For Each Rng In SrcData
          cKode.Add Rng.Value
    Next
    
    For LRow = 1 To cKode.Count
        Range("B" & LRow) = cKode.Item(LRow)
    Next

End Sub

Ketika saya jalankan macronya, hasilnya seoerti ini :

Tetapi jika Code berwarna merah (cKode.Add Rng.Value) saya ganti dengan :
cKode.Add Trim(Rng), CStr(Rng)

maka hasilnya menjadi unique seperti ini :

Ada beberapa hal yang menarik (menurut saya) yang ingin saya tanyakan :- Mengapa Value harus pakai Trim() dan Cstr() ?- Mengapa jika dipakai salah satu maka hasilnya tampil semua (bukan unique valuenya saja) ?- Mengapa jika dipakai keduanya ( Trim() dan Cstr() ) maka hasilnya Unique Value ?
Semoga para sesepuh yang masih bertapa ditempat sunyi maut turun gunung untuk membantu menjawabnya.
Terima kasih.
Salam,HK

#yiv7228600677 #yiv7228600677 -- #yiv7228600677ygrp-mkp {border:1px solid #d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;}#yiv7228600677 #yiv7228600677ygrp-mkp hr {border:1px solid #d8d8d8;}#yiv7228600677 #yiv7228600677ygrp-mkp #yiv7228600677hd {color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px 0;}#yiv7228600677 #yiv7228600677ygrp-mkp #yiv7228600677ads {margin-bottom:10px;}#yiv7228600677 #yiv7228600677ygrp-mkp .yiv7228600677ad {padding:0 0;}#yiv7228600677 #yiv7228600677ygrp-mkp .yiv7228600677ad p {margin:0;}#yiv7228600677 #yiv7228600677ygrp-mkp .yiv7228600677ad a {color:#0000ff;text-decoration:none;}#yiv7228600677 #yiv7228600677ygrp-sponsor #yiv7228600677ygrp-lc {font-family:Arial;}#yiv7228600677 #yiv7228600677ygrp-sponsor #yiv7228600677ygrp-lc #yiv7228600677hd {margin:10px 0px;font-weight:700;font-size:78%;line-height:122%;}#yiv7228600677 #yiv7228600677ygrp-sponsor #yiv7228600677ygrp-lc .yiv7228600677ad {margin-bottom:10px;padding:0 0;}#yiv7228600677 #yiv7228600677actions {font-family:Verdana;font-size:11px;padding:10px 0;}#yiv7228600677 #yiv7228600677activity {background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;}#yiv7228600677 #yiv7228600677activity span {font-weight:700;}#yiv7228600677 #yiv7228600677activity span:first-child {text-transform:uppercase;}#yiv7228600677 #yiv7228600677activity span a {color:#5085b6;text-decoration:none;}#yiv7228600677 #yiv7228600677activity span span {color:#ff7900;}#yiv7228600677 #yiv7228600677activity span .yiv7228600677underline {text-decoration:underline;}#yiv7228600677 .yiv7228600677attach {clear:both;display:table;font-family:Arial;font-size:12px;padding:10px 0;width:400px;}#yiv7228600677 .yiv7228600677attach div a {text-decoration:none;}#yiv7228600677 .yiv7228600677attach img {border:none;padding-right:5px;}#yiv7228600677 .yiv7228600677attach label {display:block;margin-bottom:5px;}#yiv7228600677 .yiv7228600677attach label a {text-decoration:none;}#yiv7228600677 blockquote {margin:0 0 0 4px;}#yiv7228600677 .yiv7228600677bold {font-family:Arial;font-size:13px;font-weight:700;}#yiv7228600677 .yiv7228600677bold a {text-decoration:none;}#yiv7228600677 dd.yiv7228600677last p a {font-family:Verdana;font-weight:700;}#yiv7228600677 dd.yiv7228600677last p span {margin-right:10px;font-family:Verdana;font-weight:700;}#yiv7228600677 dd.yiv7228600677last p span.yiv7228600677yshortcuts {margin-right:0;}#yiv7228600677 div.yiv7228600677attach-table div div a {text-decoration:none;}#yiv7228600677 div.yiv7228600677attach-table {width:400px;}#yiv7228600677 div.yiv7228600677file-title a, #yiv7228600677 div.yiv7228600677file-title a:active, #yiv7228600677 div.yiv7228600677file-title a:hover, #yiv7228600677 div.yiv7228600677file-title a:visited {text-decoration:none;}#yiv7228600677 div.yiv7228600677photo-title a, #yiv7228600677 div.yiv7228600677photo-title a:active, #yiv7228600677 div.yiv7228600677photo-title a:hover, #yiv7228600677 div.yiv7228600677photo-title a:visited {text-decoration:none;}#yiv7228600677 div#yiv7228600677ygrp-mlmsg #yiv7228600677ygrp-msg p a span.yiv7228600677yshortcuts {font-family:Verdana;font-size:10px;font-weight:normal;}#yiv7228600677 .yiv7228600677green {color:#628c2a;}#yiv7228600677 .yiv7228600677MsoNormal {margin:0 0 0 0;}#yiv7228600677 o {font-size:0;}#yiv7228600677 #yiv7228600677photos div {float:left;width:72px;}#yiv7228600677 #yiv7228600677photos div div {border:1px solid #666666;min-height:62px;overflow:hidden;width:62px;}#yiv7228600677 #yiv7228600677photos div label {color:#666666;font-size:10px;overflow:hidden;text-align:center;white-space:nowrap;width:64px;}#yiv7228600677 #yiv7228600677reco-category {font-size:77%;}#yiv7228600677 #yiv7228600677reco-desc {font-size:77%;}#yiv7228600677 .yiv7228600677replbq {margin:4px;}#yiv7228600677 #yiv7228600677ygrp-actbar div a:first-child {margin-right:2px;padding-right:5px;}#yiv7228600677 #yiv7228600677ygrp-mlmsg {font-size:13px;font-family:Arial, helvetica, clean, sans-serif;}#yiv7228600677 #yiv7228600677ygrp-mlmsg table {font-size:inherit;font:100%;}#yiv7228600677 #yiv7228600677ygrp-mlmsg select, #yiv7228600677 input, #yiv7228600677 textarea {font:99% Arial, Helvetica, clean, sans-serif;}#yiv7228600677 #yiv7228600677ygrp-mlmsg pre, #yiv7228600677 code {font:115% monospace;}#yiv7228600677 #yiv7228600677ygrp-mlmsg * {line-height:1.22em;}#yiv7228600677 #yiv7228600677ygrp-mlmsg #yiv7228600677logo {padding-bottom:10px;}#yiv7228600677 #yiv7228600677ygrp-msg p a {font-family:Verdana;}#yiv7228600677 #yiv7228600677ygrp-msg p#yiv7228600677attach-count span {color:#1E66AE;font-weight:700;}#yiv7228600677 #yiv7228600677ygrp-reco #yiv7228600677reco-head {color:#ff7900;font-weight:700;}#yiv7228600677 #yiv7228600677ygrp-reco {margin-bottom:20px;padding:0px;}#yiv7228600677 #yiv7228600677ygrp-sponsor #yiv7228600677ov li a {font-size:130%;text-decoration:none;}#yiv7228600677 #yiv7228600677ygrp-sponsor #yiv7228600677ov li {font-size:77%;list-style-type:square;padding:6px 0;}#yiv7228600677 #yiv7228600677ygrp-sponsor #yiv7228600677ov ul {margin:0;padding:0 0 0 8px;}#yiv7228600677 #yiv7228600677ygrp-text {font-family:Georgia;}#yiv7228600677 #yiv7228600677ygrp-text p {margin:0 0 1em 0;}#yiv7228600677 #yiv7228600677ygrp-text tt {font-size:120%;}#yiv7228600677 #yiv7228600677ygrp-vital ul li:last-child {border-right:none !important;}#yiv7228600677
============================================================
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