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
>
>  
>

Kirim email ke