Wednesday, July 3, 2013

BelajarVBA 003 - Scope seri 1

Coretan Mr. Kid

Setelah satu kesulitan minimal ada dua kemudahan

Tujuan bahasan kali ini adalah memahami cara memilih dan menggunakan keyword Public, Private, dan Dim dalam sebuah deklarasi prosedur atau variabel yang akan secara intensif digunakan pada bahasan selanjutnya. Pembahasan tentang scope ini akan dipecah menjadi 2 seri agar bisa lebih mudah dipahami. Pada seri 1 ini, akan dibahas sampai dengan keyword Dim dan Private.

Sekilas info tentang module

Sampai di coretan ini sudah sering dijumpai kata object class. Object class yang dimaksud adalah object (benda) yang dapat diberi kode program, yang juga sering disebut module. Module yang sering digunakan adalah :

  1. Object dari class ThisWorkbook yang berupa workbook kerja (dalam folder Microsoft Excel Objects)
  2. Setiap object dari class Sheet yang bisa berupa worksheet atau chart (dalam folder Microsoft Excel Objects)
  3. Setiap object dari class UserForm yang berupa GUI Form (dalam folder Forms)
  4. Setiap general module (dalam folder Modules)
  5. Setiap class module yang membentuk suatu class baru sebagai blueprint object (dalam folder Class Modules)

Module-module yang disebutkan di atas adalah yang dibentuk untuk tinggal bersama VBProject yang sedang dikerjakan dan dapat diberi kode program. Kode-kode program yang dituliskan dalam sebuah module dari yang tersebut di atas adalah berupa prosedur dan variabel dan akan menambah potensi dari module tersebut.

Tips praktis untuk mengingatnya adalah :

  1. Nomor 1 sampai 3 sering disebut sebagai Object Module karena selalu ada wujud bendanya, seperti sebuah UserForm, sebuah Sheet, sebuah Chart, atau sebuah Workbook. Semua object module bersifat tertutup, sehingga seluruh kemampuan yang dimilikinya bisa diakses dengan memanggil nama si object module tersebut terlebih dulu.
  2. Nomor 4 adalah sering disebut Code Module, yaitu sebagai wadah seluruh prosedur atau variabel yang bisa digunakan oleh module yang lainnya juga, selama prosedur atau variabel tersebut dideklarasikan dengan Public. Code module pada dasarnya bersifat terbuka alias bisa diakses dengan mudah.
  3. Nomor 5 adalah wadah pendefinisi (blueprint) sebuah object buatan. Module ini akan diperlakukan layaknya sebuah object module dengan karakteristik yang lebih tertutup dibanding object module.

Gambaran umum scope

Scope adalah tingkat ketersediaan sebuah prosedur atau variabel yang ada dalam module untuk dapat digunakan oleh prosedur atau variabel lain, baik yang ada dalam module itu sendiri ataupun yang ada di module lain. Jadi, scope memberikan definisi bagi prosedur atau variabel tentang :
  1. Area kerjanya (dipengaruhi oleh level tempat dideklarasikannya)
  2. Batasan usianya dalam memori komputer (terikat dengan usia tempat dideklarasikannya)
  3. Tingkat aksesnya (terikat dengan karateristik keyword yang digunakan dalam pendeklarasiannya)
Ada 4 level scope, yaitu : (dari part terkecil sampai terbesar)
  1. Procedure : Variabel yang digunakan secara lokal dalam prosedur itu saja dan tidak bisa diakses oleh prosedur dari module lain secara langsung. Usia pakai variabel adalah selama prosedur itu diproses. Jika prosedur telah selesai diproses, maka variabel dibuang dari memori komputer.
  2. Module : Prosedur atau variabel yang digunakan oleh seluruh prosedur yang ada dalam module tersebut dan tidak dapat diakses secara langsung oleh prosedur dari module lain. Usia pakainya adalah sejak module tersebut di-load ke memori sampai module tersebut dibuang dari memori. Contohnya userform akan memiliki usia pakai ketika di-load ke memory komputer, yaitu sesaat sebelum perintah Show, sampai ketika dibuang dari memori komputer, yaitu saat proses Unload.
  3. Project : Prosedur atau variabel yang digunakan oleh seluruh prosedur yang ada dalam VBAProject tersebut. Usia pakainya adalah sejak VBAProject di-load ke memori komputer, yaitu sesaat setelah melewati security macro, sampai saat workbook selesai ditutup.
  4. Global : Prosedur, variabel, atau class yang digunakan oleh seluruh prosedur dari VBAProject lain. Pintu penggunaannya adalah dengan membuat referensi ke VBAProject yang dibutuhkan. Misal, VBAProject1 memiliki prosedur, variabel, atau class yang ber-scope global. VBAProject2 bisa menggunakan apa yang ada di VBAProject1 jika VBAProject2 menambahkan VBAProject1 dalam referensinya.
Scope dideklarasikan dengan keyword (kata-kata yang dimiliki oleh bahasa pemrograman, dalam hal ini adalah Visual Basic) :
  1. Public : pada dasarnya bisa digunakan oleh siapa saja
  2. Private : pada dasarnya, hanya bisa digunakan oleh module tempat si kata private digunakan
  3. Dim (khusus untuk variabel) : pada dasarnya, hanya bisa digunakan oleh kode program yang ada setelah baris deklarasi variabel
  4. Friend (khusus untuk object dan class module saja) : digunakan oleh VBProject tempat si kata Friend digunakan
Pada umumnya, terutama untuk tahap awal belajar, keyword yang digunakan adalah Public, Private, dan Dim dengan cara praktis pemakaiannya adalah sebagai berikut :
  1. Gunakan Dim untuk variabel didalam prosedur saja.
  2. Gunakan Private untuk variabel atau prosedur yang hanya boleh digunakan (dipanggil) didalam module tersebut saja.
  3. Gunakan Public untuk variabel atau prosedur yang boleh digunakan dimana saja didalam VBProject tersebut.

Dongeng per keyword

Untuk bisa memahami yang agak detilnya, maka buat sebuah workbook baru (sekalian review materi yang lalu). Lakukan Save As dan pilih folder BelajarVBA. Beri nama file dengan BelajarVBA001.xlsm. Hapus seluruh sheet kecuali Sheet1. Kemudian ke VBE. Lakukan Insert UserForm satu kali, kemudian Insert Module sebanyak 2 kali. Save workbook. Sekarang, dalam Project Explorer sudah ada 1 object sheet, thisworkbook, 1 UserForm, dan 2 buah code module. Jika bingung, silakan baca kembali :
Cerita agak detil tentang scope-nya begini : 
Dim
  • Keyword Dim digunakan untuk mendeklarasikan variabel saja. Level yang bisa diperoleh dari penggunaan Dim adalah level Procedure dan level Module
  • Penggunaan di dalam prosedur akan membuat variabel memiliki scope level Procedure. Biasakanlah untuk menggunakan Dim hanya didalam prosedur dan tepat dibaris-baris awal prosedur, yaitu setelah baris deklarasi prosedur.
  • Penggunaan diluar prosedur, tepatnya di baris-baris awal setelah Option Explicit, yang disebut area General Declaration (karena combo object menunjukkan general dan combo Prosedur menunjukkan Declaration), akan membuat variabel memiliki scope level Module.
Contoh level Procedure :
  • Aktifkan Module1 (double click Module1 dari Project Explorer)
  • Tulis prosedur berikut :
     Public Sub TentangDim_di_LevelProcedure()
        Dim lUmur As Long
        lUmur=17
     End Sub

  • Sampai disini, variabel bernama lUmur, yang ada di dalam prosedur TentangDim_di_LevelProcedure, memiliki level scope Procedure dan usia pakainya hanya selama prosedur TentangDim_di_LevelProcedure diproses. Begitu proses telah mencapai End Sub, maka variabel lUmur akan dibuang dari memori komputer. Variabel lUmur hanya bisa digunakan oleh kode-kode program di dalam prosedur TentangDim_di_LevelProcedure yang ada setelah baris Dim, seperti baris berbunyi lUmur=17. Prosedur TentangDim_di_LevelProcedure bisa dijalankan tanpa error.
  • Jika baris lUmur=17 diletakkan sebelum baris Dim lUmur As Long, maka ketika prosedur TentangDim_di_LevelProcedure, yang tinggal didalam module yang ada teks Option Explicit, dijalankan akan menghasilkan error. Hal ini disebabkan karena variabel lUmur belum dideklarasikan saat proses sampai di baris lUmur=17.
  • Lanjutkan dengan menulis baris kode berikut ini, tepat dibawah Option Explicit :
     Dim sNama As String
  • Buat prosedur berikut dibawah blok prosedur TentangDim_di_LevelProcedure
     Public Sub TentangDim_di_LevelModule()
         sNama="Kid"
     End Sub

  • Sampai disini, variabel sNama, yang dideklarasikan di area general declaration, memiliki level scope Module. Variabel sNama dapat digunakan oleh seluruh prosedur dalam Module1.
  • Setiap prosedur di Module1 yang membutuhkan variabel sNama tidak perlu dan sebaiknya tidak mendeklarasikan variabel bernama sNama lagi. Contohnya seperti prosedur TentangDim_di_LevelModule yang mengisi variabel sNama dengan suatu teks berbunyi 'Kid'. Jika prosedur TentangDim_di_LevelModule dijalankan, maka prosedur berjalan dengan baik tanpa error.
  • Berbeda halnya ketika baris Dim sNama As String dipindahkan ke baris setelah baris End Sub milik prosedur TentangDim_di_LevelProcedure dan sebelum baris deklarasi prosedur TentangDim_di_LevelModule yang berbunyi Public Sub TentangDim_di_LevelModule(). Jika prosedur TentangDim_di_LevelModule dijalankan, sedangkan prosedur tersebut  berada di module yang memiliki Option Explicit, maka akan menghasilkan error meskipun kode program pemakai variabel sNama ada setelah baris Dim sNama As String. Hal ini disebabkan karena lokasi penulisan Dim sNama As String bukanlah di area general declaration.
  • Sekarang ditulis lagi di area general declaration (dibawah Option Explicit)
     Dim iVarDiModule1 As Integer
  • Kemudian aktifkan Module2 (double click Module2 dari Project Explorer)
  • Tulis prosedur berikut ini
     Public Sub TentangDim_CobaPakaiVariabelDiModule1()
         iVarDiModule1 = 7
     End Sub

  • Variabel bernama iVarDiModule1, yang dideklarasikan di area general declaration milik Module1, memiliki level scope Module di Module1. Jadi hanya bisa digunakan di Module1.
  • Prosedur yang ada di Module2 dan Module2 mengaktifkan Option Explicit tidak bisa menggunakan variabel iVarDiModule1 yang ada di Module1. Hal ini disebabkan karena variabel iVarDiModule1 dideklarasikan di area general declaration Module1 dengan keyword Dim yang menghasilkan level scope Module.
  • Jika prosedur bernama TentangDim_CobaPakaiVariabelDiModule1 yang ada di Module2 tersebut dijalankan, maka akan menghasilkan error. Hal ini disebabkan karena variabel iVarDiModule1 hanya berlaku di Module1, sehingga di Module2 dinyatakan belum pernah ada proses deklarasi

Private
Keyword Private dapat digunakan untuk deklarasi variabel ataupun prosedur. Deklarasi dengan Private akan memiliki scope level Module. Sebaiknya seluruh deklarasi variabel yang ditujukan untuk mendapatkan level module menggunakan keyword Private daripada Dim. Setidaknya bisa didapatkan pola yang tetap bahwa setiap Dim adalah scope level procedure dan seluruh Private adalah scope level module.

Contoh penggunaan keyword Private :
  • Aktifkan Module2 (double click Module2 di Project Explorer)
  • Tulis deklarasi variabel berikut ini tepat dibawah Option Explicit
     Private bVarPrivate As Boolean
  • Tulis prosedur berikut dibawah blok prosedur terakhir yang ada di Module2.
     Private Sub TentangPrivate()
         bVarPrivate = TRUE
     End Sub

  • Variabel bVarPrivate dan prosedur TentangPrivate memiliki scope level module. Variabel bVarPrivate dan prosedur TentangPrivate bisa digunakan oleh seluruh kode program yang ada di Module2.
  • Jika prosedur TentangPrivate dijalankan dengan menekan F5 saat kursor ada didalam blok prosedur tersebut, maka prosedur akan berjalan dengan baik dan tidak muncul error.
  • Tulis prosedur berikut ini di Module2, misal diletakkan dibaris kosong paling akhir yang ada dalam code window
     Public Sub PanggilTentangPrivate()
         'mengisi nilai bVarPrivate dengan nilai FALSE
         bVarPrivate = False
   
         'tampilkan pesan isi nilai bVarPrivate setelah diisi FALSE
         MsgBox "Nilai bVarPrivate saat sebelum " & _
             "panggil TentangPrivate adalah " & bVarPrivate
   
         'menjalankan prosedur TentangPrivate yang ber-scope level Module
         TentangPrivate
   
         'menampilkan pesan isi nilai bVarPrivate setelah menjalankan
         'prosedur TentangPrivate
         MsgBox "Nilai bVarPrivate saat sebelum " & _

             "panggil TentangPrivate adalah " & bVarPrivate
     End Sub

  • Prosedur PanggilTentangPrivate adalah contoh prosedur dalam Module2 yang bisa menggunakan variabel maupun prosedur ber-scope level module yang ada di Module2. Prosedur PanggilTentangPrivate bisa menggunakannya secara langsung karena prosedur ini juga berada di Module2. Prosedur PanggilTentangPrivate bisa dijalankan dan tidak menghasilkan error.
  • Coba buat Module3 dengan klik kanan ProjectExplorer -> Insert -> Module
  • Aktifkan Module3 (jika belum aktif)
  • Tulis prosedur berikut ini didalam Module3
     Public Sub PanggilTentangPrivateModule2()
         'menjalankan prosedur TentangPrivate yang
         'ada di Module2 secara langsung
         TentangPrivate
   
         'mengisi variabel bVarPrivate yang ada
         'di Module2 secara langsung
         bVarPrivate = TRUE
     End Sub

  • Prosedur PanggilTentangPrivateModule2 yang ada di Module3 jika dijalankan akan menghasilkan error. Hal ini disebabkan karena prosedur PanggilTentangPrivateModule2 ingin menjalankan prosedur dengan scope level module yang ada di Module2 yang bernama TentangPrivate. Jadi, prosedur di Module3 tidak dapat menggunakan prosedur di Module2 yang memiliki scope level module. Penggunaan secara langsung variabel ber-scope level module yang ada di Module2 oleh prosedur yang ada di Module2 juga akan memunculkan error.

Insya Allah, pembahasan setelah ini adalah scope tentang keyword Public dan Friend yang memiliki karakteristik khusus karena sangat tergantung pada cara memandang sebuah scope. Harapannya, seri 1 ini bisa dipahami terlebih dulu sebelum memasuki seri 2.

File yang bisa diunduh :


No comments:

Post a Comment