[Kategori: Makro] [Kelas: Pemula]
©sskk (serial siti kurang kerjaan) edisi 201106)
Di dalam aplikasi anda, baik yg cukup mengandalkan fitur dan formula di worksheet maupun yg harus dibantu makro dari balik pagar-nya, mungkin sekali waktu akan
bertemu dengan 2 keperluan spt ini:
- apakah sebuah sheet (diketahui nama-sheet-nya) ADA di workbook ?
- apakah sebuah workbook (diketahui nama-book-nya) sudah TERBUKA ?
Kedua pertanyaan itu kita inginkan jawabannya berupa Logical value: True atau False.
Kelak, Jika jawaban sudah ditangan, jalan di depan kita terbuka kembali, yaitu jalan
bercabang: Kalau TRUE mau "ngapain", kalau FALSE mau "ngapain" pulak ?
"Suka suka" anda: proses-proses apa yg akan anda tuliskan berikutnya. Ya 'kan ?
( Ya Iyyya Lah !!)
Di Worksheet maupun di VBA, dengan terus berkembangnya versi Excel, mudah
mudahan Oom Bill Gentholett (sodara jau - nya Oom Bill Gates) berkenan menambahkan
fungsi-fungsi baru seperti itu.
Andaikan belum ada, mengapa kita tidak "BIKING SENDIRI" saja fungsinya Jo !.
Apabila kita akan berurusan dgn suatu worksheet-tertentu, maka untuk menunjuk
hidungnya kita perlu meraba worksheet (dlm koleksi Worksheets) satu persatu.
Manakala kriterianya sesuai, maka woksheet yg sedang teraba itulah Malingnya.
Pekerjaan seperti ini perlu sebuah KALANG / LOOP, misalnya:
For Each xSheet in Worksheets - proses - Next
Dalam hal mencari sheet yg kemungkinan = TIDAK ADA, maka dlm loop tsb
jika ada workseet yg sesuai dgn kriteria, sebuah variable boolean kita isi TRUE
sambil kita hentikan loopnya.
Jika sampai loop berakhir tanpa ada worksheet yg sesuai dgn kriteria, artinya
variable boolean tsb masih berisi FALSE
Dua keadaan ini (TRUE atau FALSE) baru akan diketahui ketika keluar dari Loop.
Proses mencari sebuah workbook di dalam koleksi Workbooks: tidak berbeda.
karena hanya lain nama objectnya saja, prinsipnya tetap sama = mencari sebuah
object dlm koleksi-object (apakah memenuhi kriteria tertentu)
Sheet-tertentu atau Worksheet-tertentu adalah sebuah object, sedangkan
Sheets atau Worksheets (ada ES nya lho..) adalah Koleksi Object.
Penggemar makro jangan samapai tidak mencataat hal seperti ini
Mungkin struktur pemrogramannya seperti ini
Function Adakah(NamaSheet As String) As Boolean
For Each ws In Worksheets
If ws.Name = NamaSheet Then
Pemakaiannya di prosedur lain:
If Adakah("Sheet1001") = True Then
'- proses alt 1 --
Else
'- proses alt 2 --
End if
karena adakah(argument) sendiri sudah berupa Logical Value
maka penulisannya bisa diringkas seperti ini
If Adakah("Sheet1001") Then
'- proses alt 2 --
Pemakaian di worksheet, mungkin seperti ini
=IF(Adakah("Laporan2011"),Laporan2011!C11,F16)*10000
Algoritma seperti UDF di atas itu, cukup sukses dan banyak yg menggunakannya.
Kekurangannya adalah : loop bisa berlangsung lama (perlu banyak waktu) terutama
jika anggota koleksi object yg akan diraba cukup banyak.
(bayangkan jika mencari satu sheet yg tidak ada atau yg indexnya paling akhir
di sebuah koleksi worksheets yg anggota sheet nya = 999999 lembar, ada ndak ya?)
Kacian deh Loop !
Membuat prosedur yg sama kerjanya, tetapi tanpa Loop (Mempercepat Makro)
Walaupun untuk ukuran mesin sekarang, hal seperti dijelaskan di atas itu tidak terasa
lagi, tetapi kita masih wajib mencari cara lain yg (mudah-mudahan) lebih cepat.
Kita ketahui bahwa meng-assigned sebuah variable object dengan sebuah sheet
yg sebetulnya TIDAK ADA, akan menimbulkan error.
Jangan lupa ya... meng-assign variable object harus dengan Statement Set
Set ObjVar = ObjectTertentu
sedangkan mengisi variable data cukup dengan: NmVariable = Data
Atau kalau mau : Let NmVariable = Data
Dim SitX as Worksheet
Set SitX = Sheets("LaporanAsalLapor")
Jika sheet bernama "LaporanAsalLapor" ternyata euweuh alias "ndak ada"..
maka terjadi error. Tetapi sebelum itu kita 'kan bisa pasang kuda-kuda agar si error
(walaupun muncul) kita SURUH diam-diam saja, jangan brisikk!.
Set SitX = Shets("LaporanAsalLapor")
'-- perintah berikutnya --
Manakala kuda-kuda sudah terpasang seperti itu; jika terjadi error (karena sheet
bernama "LaporanAsalLapor" = tidak ada) maka program pointer langsung ngacir
ke baris perintah berikutnya tanpa berisik...
Dan kita sebagai "XL-maniawan / XL-maniawati sejati" yg sedang belajar menjadi
"programmer ulung" (hayyyahhh!!), janganlah sampai melewatkan HAL YG SEPELE ini.
Dengan terlaluinya perintah :
Set SitX = Shets("LaporanAsalLapor")
maka di baris berikutnya, variable SitX sudah jelas punya status yaitu berupa
dua kemungkinan:
(*1) SitX = sudah mewakili object sheet bernama "LaporanAsalLapor"
atau (jika terjadi error yg diam-diam dilewatkan)
(*2) SitX tidak mewakili apapun; atau dapat dikatakan: SitX is Nothing !
Memang konon ceritaknya, di sono-nya variable object itu sejak dideklarasikan sampai
sesaat sebelum di assigned, akan bernilai Nothing
Variable Boolean sejak dideklarasikan sampai sesaat sebelum di ISI nilai Logical
sudah membawa nilai defaultanya yaitu = FALSE.
(di vba, tidak seperti di fortran atau c, semua variable sudah punya nilai default
ketika dia dideklarasikan)
Nah kalau begitu Perintah selanjutnya hanya perlu satu baris statement:
If Not SitX Is Nothing Then SUATU_VARIABLE = True
Ndak Boong, Ndak Ribet.... banyak untungnya !
Dengan demikian pekerjaan mendeteksi apakah suatu worksheet memang ADA
sudah selesai sampai di sini, yaitu dengan diyakininya sebuah variable mendapat
nilai False atau True itu tadi...
Berikut ini dicontohkan coding lengkap 4 prosedur Fungsi (UDF)
1 Apakah sebuah sheet (diketahui nama-sheet-nya) ADA di workbook
dalam dua versi : Tanpa looping -vs- Menggunakan looping
Function IsOpen(WbName As String) As Boolean
Set wb = Workbooks(WbName)
If Not wb Is Nothing Then IsOpen = True
Function Terbukakah(NmBook As String) As Boolean
For Each book In Workbooks
If book.Name = NmBook Then
2 Apakah sebuah workbook (diketahui nama-book-nya) sudah TERBUKA
dalam dua versi : Tanpa looping -vs- menggunakan looping
Function SheetFound(WsName As String) As Boolean
If Not Ws Is Nothing Then SheetFound = True
Function Adakah(NamaSht As String) As Boolean
For Each ws In Worksheets
If Sht.Name = NamaSht Then
'-------------------------------------------------
Pelajaran yg mungkin didapat dari project ini:
* bahwa selain ada Prosedur Sub, ada juga prosedur Function
* hasil suatu komputasi di sebuah Prosedur Function, akhirnya selalu
/ harus diberikan kepada Variable NamaFungsi
* looping didalam sebuah koleksi object
* menyaring data / object dgn kriteria tertentu selama Looping berjalan.
* upaya mempercepat tercapainya tujuan (mempersingkat running time)
* Kadang proses yg memerlukan looping, bisa digantikan oleh trick lain
* Penggunaan On Error Resume Next
* Perbedaan mengAssign /mengisi variable Object vs Variable data
* VBA mengenal adanya Nilai Default sebuah variable sejak dideklarasikan.
** bagi members yg memerlukan fil tsb, kapan saja masih bisa mendownload dari:
Bluewater, 4 Juni 2011
"hormat kami",
STDEV(i)
attachment *.zi_ agar di-rename dulu menajdi *.zip untuk kemudian di extract (dgn winzip) menjadi *.xls
Nenhum comentário:
Postar um comentário