Terima kasih Mr.Kid atas pencerahannya. 100% pasti ndak salah. Tadinya saya 
ingin mengambil nama sheet yang mengandumg "Wkr" tanpa bantuan sheet "Proses". 
Jadi variable Found saya "ambangkan" sebagai Variant dan Option Explicit saya 
hapus maka terjadilah kekeliruan tsb.

Sekali lagi terima kasih.

Salam,
HK



Sent from Samsung Mobile"Mr. Kid" <[email protected]> wrote: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 <[email protected]> 
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