Tecnologia, programação e muito Visual FoxPro.

domingo, 5 de junho de 2011

]] XL-mania [[ Project: Membuat UDF Lagi ( IsOpen & SheetFound )

 

[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
   Dim ws As Worksheet
   For Each ws In Worksheets
      If ws.Name = NamaSheet Then
         Adakah = True
         Exit For
      End If
   Next ws
End Function

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 1 --
Else  
 '- proses alt 2 --
End if

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

Dim SitX as Worksheet
On Error Resume Next
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 :  
On Error Resume Next
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
   Dim wb As Workbook
   On Error Resume Next
   Set wb = Workbooks(WbName)
   If Not wb Is Nothing Then IsOpen = True
End Function


Function Terbukakah(NmBook As String) As Boolean
   Dim book As Workbook
   For Each book In Workbooks
      If book.Name = NmBook Then
         Terbukakah = True
         Exit For
      End If
   Next book
End Function


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
   Dim Ws As Worksheet
   On Error Resume Next
   Set Ws = Sheets(WsName)
   If Not Ws Is Nothing Then SheetFound = True
End Function


Function Adakah(NamaSht As String) As Boolean
   Dim Sht As Worksheet
   For Each ws In Worksheets
      If Sht.Name = NamaSht Then
         Adakah = True
         Exit For
      End If
   Next Sht
End Function

'-------------------------------------------------

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

__._,_.___
Recent Activity:
+-:: XL-mania ::::::::::::::::::::----------------------------------+
| maaf baru moderate sekarang... momods kurang tidur berhari-hari   |
| jadi budak kantoooOOooorrr...                                     |
| http://www.facebook.com/group.php?gid=37671048001&ref=mf          |
+-------------------------------------------------------------------+
| DILARANG : MLM, money game, OOT, iklan tanpa izin, SARA, testing, |
| pembicaraan pribadi, one line message,  melecehkan,  tidak sopan. |
+-------------------------------------------------------------------+
| Buat subjek yang kreatif, jangan : "tanya", "help", "mohon bantu" |
| Usahakan besar attachment < 200 kb. Gunakan  winzip  jika  perlu. |
+-------------------------------------------------------------------+
| Ajak teman-teman Anda bergabung dengan mengirim e-mail kosong ke  |
| XL-mania-subscribe@yahoogroups.com atau kirimkan mereka file dari |
| http://groups.yahoo.com/group/XL-mania/files/Promotion/           |
+-------------------------------------------------------------------+
| Berikan testimoni di : http://www.friendster.com/xlmania atau...  |
| http://www.xl-mania.com/2008/06/testimoni-xl-mania.html           |
+-------------------------------------------------------------------+
| Message lama ada di :                                             |
| http://groups.yahoo.com/group/XL-mania/messages [perlu yahoo id]  |
| http://www.mail-archive.com/xl-mania@yahoogroups.com              |
+-------------------------------------------------------------------+
.

__,_._,___

Nenhum comentário:

Arquivo do blog