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.Value*
itu 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.Value*
diganti 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 [email protected]
[belajar-excel] <[email protected]>:

>
>
> 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
>
> [image: Inline image]
>
> 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 :
>
> [image: Inline image]
>
> Tetapi jika Code berwarna merah (*cKode.Add Rng.Value*) saya ganti dengan
> :
>
> *cKode.Add Trim(Rng), CStr(Rng)*
>
> maka hasilnya menjadi unique seperti ini :
>
> [image: Inline image]
>
> 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
>
> 
>

Kirim email ke