Pak Hendrik, Tentang variabel Variant : 1. Variabel Found tidak dideklarasikan, berarti akan dideklarasikan oleh VB/VBA dengan tipe Variant (untung tidak ada penegasan Option Explicit, jadi tanpa deklarasi masih bisa berjalan). 2. Varibel variant akan bernilai empty (bukan Null) ketika tidak terisi apa-apa dan ketika berisi suatu nilai, maka tipe datanya mengikuti tipe data yang memungkinkan untuk si nilai. 3. Methods Find akan menghasilkan tipe data Range. 4. Memasukkan sebuah nilai hasil methods Find ke variabel bertipe Variant seperti Found, ketika tanpa set, maka found akan berisi nilai dari properti default range hasil methods Find, yaitu nilai dalam properti Value, yang membuat variabel Found bertipe data selain Object. 5. Methods Find akan menghasilkan Nothing bila tidak menemukan yang dicari, yang membuat tidak adanya properti default bernama Value, sehingga nilai dalam variabel Variant bernama Found akan di-set menjadi Empty. 6. Methods Find akan menghasilkan object Range ketika yang di-Find ditemukan, yang membuat properti default bernama Value menjadi ada dan memiliki nilai, sehingga nilai dalam variabel Variant bernama Found akan diisi dengan nilai properti Value milik range hasil methods Find, yaitu sebuah String berupa nama worksheet yang sedang diproses oleh proses For Each. 7. Jadi, variabel Found yang pada dasarnya bertipe Variant akan berubah menjadi Empty atau menjadi bertipe String.
Tentang conditional : 1. conditional dengan IF THEN ELSE akan memeriksa ekspresi kondisi bertipe numerik maupun boolean (TRUE atau FALSE) 2. nilai numerik 0, boolean FALSE, atau Empty membuat conditional berstatus FALSE 3. nilai numerik selain 0, boolean TRUE, Not Empty membuat conditional berstatus TRUE 4. pada baris berbunyi IF Found Then <A> Ketika Found menyimpan nilai property Value bertipe String dari object Range hasil methods Find berhasil menemukan range yang dicari, maka baris IF ini akan menyebabkan error. Berhubung sebelum IF ada baris On Error Resume Next, maka error di baris IF diabaikan dan masuk ke area baris kode disisi TRUE milik blok IF. Hasilnya, terkesan bahwa IF Found Then berhasil mendefinisikan bahwa hasil kondisi adalah TRUE, padahal kenyataannya, proses pengkondisiannya membuat Error. <B> Ketika Found berisi Empty yang diakibatkan oleh hasil methods Find tidak menghasilkan apa-apa (menghasilkan Nothing), maka baris IF ini akan memeriksa kondisi dengan bunyi IF Empty Then dan tidak menyebabkan error. Karena nilai Empty setara dengan boolean FALSE, maka blok IF akan mencari sisi ELSE. Jadi, hasil kedua prosedur berbeda karena 1. Pada prosedur 2 di bagian ekspresi IF Not Found Then akan menghasilkan error yang kemudian diabaikan akibat On Error Resume Next atau karena variabel Found dalam keadaan Empty yang membuat Not Found akan bernilai TRUE, yang kedua kondisi tersebut membuat baris wks.delete dijalankan. 2. Pada prosedur 1 di bagian ekspresi IF Found Then akan menuju blok FALSE (mulai ELSE) ketika Found dalam keadaan Empty saja. Sedangkan saat Found ada isinya bertipe String, maka proses akan memunculkan error yang diabaikan oleh On Error Resume Next, yang membuat blok IF mengalir ke area blok TRUE. Karena blok TRUE tidak ada yang akan dikerjakan, maka proses segera menuju ke akhir blok Conditional. Sedikit catatan, Disiplin dalam mendefinisikan variabel dengan memilih tipe data yang sesuai dengan proses akan jauh lebih menentramkan karena tidak akan muncul hal-hal yang tidak terduga karena berupa logika dibalik layar. Misal dengan melakukan hal-hal berikut secara utuh : 1. mendeklarasikan variabel secara jelas dan sesuai tipe datanya sesuai kebutuhan : *Dim Found as range* 2. memastikan ada pengabaian error dengan On Error Resume Next sebelum proses loop (kasus ini menggunakan loop dengan For Each) 3. menambahkan set di depan baris kode proses dengan methods Find *set *Found = Sheets("Proses").Range("A1").Find("Wkr", LookAt:=xlPart) 4. mengubah blok conditional (kasus ini dengan blok IF THEN ELSE) menjadi : IF* found is nothing *Then 'karena methods Find menghasilkan object range yang akan menghasilkan nothing bila tidak berhasil menemukan wks.delete endif kalo ndak salah sih gitu... tapi sebaiknya dicoba dulu deh... Wassalam, Kid. On Sat, Mar 8, 2014 at 7:57 PM, hendrik karnadi <hendrikkarn...@yahoo.com>wrote: > > > Dear Be Excellers, > > Bermula dari kasus yang diajukan Bapak ASL yang salah satunya adalah ingin > menghapus Nama2 Sheet yang tidak ada "Wkr" nya, saya mencoba membuat 2 > alternatif program yang nampaknya sama tapi hasilnya berbeda. > > Macro1 menghasilkan 6 Sheet (1 Sheet "Proses" dan 5 Sheet "Wkr"), > Sub Hapus_Wks1() > 'HK for ASL (6 Maret 2014) > Dim wks As Worksheet > Application.DisplayAlerts = False > > For Each wks In Worksheets > Sheets("Proses").Range("A1") = wks.Name > On Error Resume Next > If wks.Name <> "Proses" Then > Found = Sheets("Proses").Range("A1").Find("Wkr", > LookAt:=xlPart) > If Found Then > > Else > wks.Delete > End If > End If > Next wks > > Application.DisplayAlerts = True > End Sub > > > Macro2 hanya menyisakan Sheet "Proses", > Sub Hapus_Wks2() > 'HK for ASL (6 Maret 2014) > Dim wks As Worksheet > Application.DisplayAlerts = False > > For Each wks In Worksheets > Sheets("Proses").Range("A1") = wks.Name > On Error Resume Next > If wks.Name <> "Proses" Then > Found = Sheets("Proses").Range("A1").Find("Wkr", > LookAt:=xlPart) > If Not Found Then wks.Delete 'Found Then > > 'Else > ' wks.Delete > 'End If > End If > Next wks > > Application.DisplayAlerts = True > End Sub > > saya yakin hal tsb terjadi krn code "On Error Resume Next", padahal > secara logika manusia keduanya se-olah2 sama, > Macro1: Jika ditemukan kosong maka tidak ada langkah tetapi jika tidak > ditemukan (Else) maka wks.Delete > Macro2: Jika tidak ditemukan maka wks.Delete > > Pertanyaannya : > Mengapa hasil kedua macro tsb berbeda ? > > File terlampir. > > Salam, > HK > > >