Ikutan lagi....

Dalam VB/VBA, mestinya sudah tahu bahwa ada kelompok-kelompok kelas.
Misal pada VBA Excel saja, ada kelompok di VBE (VB Editor)
1. object dari kelasnya Excel seperti Sheet1, Sheet2, ThisWorkbook
2. object dari kelasnya userform seperti UserForm1, UserForm2, dsb
3. object dari kelasnya general module seperti Module1,Module2, dsb
4. object dari kelasnya user class seperti Class1,class2, dsb

Untuk awalan, fokus dulu pada no 1 sampai 3 saja.
No 1 dan 2, pada dasarnya adalah object-object yang pendiam dan penyendiri,
yang sering disebut private.
No 3, pada dasarnya adalah object yang suka bersosialisasi, jadi enak
diajak ngobrol yang sering disebut public.

Sampai sini, sudah ada bayangan bahwa ada benda (object) yang memiliki
karakteristik private dan public.
Jadi, sebenarnya apa sih Public dan Private itu ? Apakah sekedar ruang
lingkup kerja ?
Kalau contoh diatas, maka yang tampak adalah private dan public itu
cenderung ke karakteristik sesuatu (object) dalam menyikapi lingkungannya.
Kalau begitu, apakah lingkungan dari contoh diatas ?
Lingkungannya adalah VBA Excel.
Maka, untuk memanfaatkan object itu, harus disertai memanggil namanya,
supaya si benda nengok dulu baru bisa diberi perintah.

Contoh :
Untuk mengaktifkan sebuah userform, maka bunyinya :
*UserForm1 *Show
>> Memerintahkan melalui Excel (lingkungan) yang jadi bosnya UserForm1
sehingga tahu cara memerintah si userform1 untuk tampil keatas panggung.

atau mau menggunakan range yang ada di sheet1 :
*sheet1*.range("x1:z9").activate
>> memerintah secara langsung kepada si sheet1 supaya memberi kesempatan
kepada pemanggil untuk mengaktifkan range x1:z9 yang dimiliki si sheet1.

Untuk hal seperti ini akan terkait erat dengan yang namanya object dan
karakteristiknya. Tapi ndak usah dipedulikan, karena bahasannya kali ini
tentang private, public dan dim yang cenderung dikenal sebagai ruang
lingkup kerja.
Tapi, dari contoh diatas, tampak jelas bahwa penggunaan apapun yang
dimiliki si object, harus pakai manggil namanya dulu. Mau pakai rangenya
sheet1, harus panggil dulu namanya sheet1. Setelah nengok, baru bisa beri
perintah. Itulah karakteristik private.

Untuk karakteristik public, ndak perlu pake panggil-panggil segala.

Setelah tahu ada kelompok yang demikian, maka yang perlu diketahui
berikutnya adalah adanya bentuk-bentuk blok program yang sering disebut
routine atau prosedur.

Prosedur ada yang jenisnya Sub atau Function (yang sering dipakai). Jadi
bukan Public Sub, Public Function, Private Sub, Private Function.
Masing-masing jenis prosedur, bisa diberi karakteristik respon terhadap
lingkungan jenis Private atau Public.
Dengan begitu, maka sering ditemui :
>> karakteristik Private
-- prosedur dengan karakteristik private tidak dapat dipergunakan oleh
siapapun selain pemiliknya (object tempat tinggalnya)
contoh 1 : (prosedur yang tinggal di sheet1, maka hanya bisa digunakan oleh
si sheet1 saja ~ bener-bener barang pribadinya si sheet1)
Private Sub Worksheet_Change(byval target as range)
yang sering dikenal sebagai prosedur event sub.
Disebut event karena prosedur ini juga akan aktif ketika ada kejadian
minimal sebuah cell di dalam worksheet yang mengalami pengubahan nilai.

contoh 2 : (prosedur yang tinggal di module umum seperti module1 yang
karakterisk si module itu public, tetapi tetap saja gak bisa dipakai oleh
selain module1)
Private Sub PersiapanCetak( rngData as range , lStatus as long )

>> karakteristik Public
Contoh 1 : (prosedur yang diletakkan di sheet1 misalnya berbunyi seperti
berikut ini)
Public Sub SetNilaiPesananSheetInput()
-- Prosedur ini diletakkan pada sebuah object sheet (misal di sheet1) yang
pada dasarnya berkarakteristik private.
-- Pemberian karakteristik public pada si prosedur, akan membuat prosedur
ini bisa digunakan oleh yang lainnya (misal oleh module1 atau userform1
dsb), selama yang mau make itu (module1 dsb itu) manggil yang punya dulu.

Contoh lengkapnya begini deh :
di sheet1, tulis :
public sub ProsedurPunyanyaSheet1()
      msgbox "Aku adalah prosedur karakteristik public di lokasi sheet1
yang berkarakteristik private"
end sub

kemudian, di module1 (Insert Module kalau belum ada), tulis :
public sub PanggilProsedurDiSheet1Ahhh()
      sheet1.ProsedurPunyanyaSheet1
end sub
jalankan prosedur PanggilProsedurDiSheet1Ahhh

Jika tulisan sheet1. dihapus dari baris  sheet1.ProsedurPunyanyaSheet1 maka
si VBA akan protes.

Contoh 2 : (pada sebuah module umum lainnya -- misal module2 -- insert
module kalau belum ada)
public sub PanggilPunyanyaModule1Ahh()
       PanggilProsedurDiSheet1Ahhh
end sub
lalu jalankan.

Akan tampak bahwa prosedur PanggilProsedurDiSheet1Ahhh yang diberi
karakterisik public dan tinggal di object module1 yang juga
karakteristiknya public, bisa dipanggil dan dipakai sewaktu-waktu.


Untuk jenis prosedur Function maka yang berubah adalah bentuk bloknya yang
tadinya sub jadi function disertai penetapan tipe data hasil dari function.
Baris End Sub akan jadi End Function.

Setelah rada bingung campur sedikit mudeng tentang public dan private pada
sebuah benda seperti module atau form atau sheet, kemudian rada paham
tentang public dan private pada sebuah prosedur baik sub atau function,
maka mulailah cerita tentang public dan private pada sebuah variabel.

Variabel juga bisa diberi karakteristik Public dan Private. Tapi, hanya
untuk variabel yang dideklarasikan diluar prosedur.
Untuk deklarasi variabel dalam sebuah prosedur, digunakan Dim.
Dim juga bisa digunakan untuk diluar prosedur, yang karakteristiknya akan
mirip dengan penggunaan Private. Tapi, sebaiknya tetap menggunakan Private
daripada Dim.

Cara deklarasi secara umum :
karakteristiknya nama_variabelnya AS tipedatanya

contoh : disebuah module umum bernama module1 (kalau belum ada module1,
lakukan Insert Module)
Option Explicit
Public rngKriteria as range
Public lNum AS Long
Private lRec AS Long

Public Sub CetakFaktur()
       Dim rngData as Range
       ' ada baris perintah banyak disini, misal :
       lNum = 1945
end sub

Maka,
A. variabel rngKriteria dan lNum akan dapat dipergunakan secara langsung
oleh siapapun dimanapun berada oleh prosedur apa saja selama tidak ada
module umum yang mendeklarasikan sama seperti yang dideklarasikan oleh
module1 karena :
1. module1 berkarakteristik Public
2. variabel dideklarasi dengan karakteristik Public

B. variabel lRec hanya dapat digunakan di module1 saja, pada seluruh
prosedurnya karena :
1. variabel dideklarasi dengan karakteristik Private

C. variabel rngData hanya dapat digunakan di prosedur CetakFaktur di
module1 saja. Prosedur lain, baik yang dalam module1 apalagi yang diluar
module1 tidak dapat menggunakannya karena :
1. variabel dideklarasi dengan karakteristik Dim dalam sebuah prosedur.


Bagaimana jika di Sheet1 ada prosedur berikut berikut ini :

Option Explicit

'ada prosedur untuk set nilai lnum juga
Public Sub SetVarLNumOlehSheet1()
       lnum=1990
end sub

Pertanyaannya, lNum yang mana yang diset oleh prosedur SetVarLNumOlehSheet1
?
Tentu saja variabel lNum yang dideklarasi di Module1 di atas sana.

Jika isi sheet1 diubah menjadi : (lihat bagian bold)
Option Explicit
*Public lNum AS Long*

'ada prosedur untuk set nilai lnum juga
Public Sub SetVarLNumOlehSheet1()
       lnum=2012
end sub

lNum yang mana yang diisi oleh prosedur SetVarLNumOlehSheet1 ?
Tentu saja lNum yang dideklarasikan di sheet1.
Lalu nilai lNum yang dideklarasikan di Module1 berapa nilainya ?
Jika prosedur CetakFaktur di module1 telah dijalankan, maka nilai lNum di
module1 adalah 1990.

Dari 2 contoh diatas, tampak bahwa deklarasi variabel dengan karakteristik
Public di sebuah module umum (module1 dalam contoh), tidak serta merta
bekerja disemua tempat. Bagaimana cara pakai kedua variabel itu ?

Misal dimodule2 (buat baru jika belum ada)
option explicit

public sub SetSemuaLNumOlehMod2()
       module1.lnum=100
       sheet1.lnum=3000
       *msgbox "LNum di module1 = " & lnum & vbcrlf & "LNum di sheet1 = " &
sheet1.lnum*
end sub

Jadi, dengan memanggil secara spesifik pemilik variabelnya, varibel
berkarakteristik public bisa digunakan oleh pihak lain.
Tapi, *hati-hati dengan yang diwarna merah*. Disana ada proses memanfaatkan
nilai lnum tanpa memanggil pemiliknya.
Baris merah ini akan bekerja jika tidak ada module umum lainnya yang
mendeklarasikan Public lNum. Jika ada, maka akan error. Dan errornya bisa
dieliminir ketika bagian *& lNum* diganti menjadi *& module1.lnum*

Jika ingin mencoba, silakan buat module baru (misal module3) yang diisi
dengan :
Option Explicit
Public lNum as Long

Public Sub SetNilaiLNumDiMod3OlehMod3()
      lNum=7500
end sub

Baris lNum=7500 akan mengisi varibel lNum di module3 dengan 7500
Kemudian coba run prosedur SetSemuaLNumOlehMod2 yang ada di module2. Jika
error, ganti  bagian *& lNum* diganti menjadi *& module1.lnum *dan run lagi.

Dari beberapa contoh ini, maka bisa diketahui bahwa setiap object class
bisa mendeklarasikan variabel Public,Private, atau Dim, dan akan
diperlakukan sendiri-sendiri sesuai pendeklarator variabelnya. Object class
lainnya bisa menggunakan milik object class tertentu secara benar jika
disertai pemanggilan nama pendeklarator variabelnya.

Secara umum, biasanya deklarasi sebuah variabel dilakukan untuk mewakili
satu varibel yang langsung ditentukan akan digunakan dimana saja.
Misal, di module1 dideklarasikan :
Public rngInput as range

Maka diobject class manapun tidak akan ditemukan lagi deklarasi seperti
itu. Penggunaan rngInput bisa digunakan oleh object class lain (sheet1,
userform1, module1,dsb) secara langsung.

Secara garis besar, menentukan variabel adalah tergantung intensitas
penggunaannya. Misal, rngdata yang merujuk ke Sheet7 di range A1:G19 akan
selalu digunakan disetiap proses yang prosedur prosesnya bisa ada di
sheet1, module3, userform5 dsb, maka cukup dideklarasikan di sebuah module
umum (misal module1) kemudian digunakan oleh semua prosedur.

Jika ternyata ada prosedur yang butuh rngInput tapi dengan isi range
merujuk ke hal yang berbeda dengan prosedur lainnya yang menggunakan
rngInput, maka dibuatlah sebuah variabel baru, misal Public rngInputLainnya
as range
Begitu seterusnya.

-----------------------

Contoh :
Sheet1 dan sheet3 butuh bekerja dengan range yang ada di sheet bernama Data
(misal sheet7) mulai range A1 diseluruh blok data kontinyunya
(currentregion)

Maka disebuah module umum (misal module1) ada bunyi :
Option Explicit
Public rngKu as range

di sheet1 ada prosedur :
public sub DataNamaSaja()
     set rngKu = sheet7.range("a1").currentregion
     'misal data nama adalah kolom B saja dan akan dicopy ke sheet13 mulai
range k1
     rngku.resize(,1).offset(,1).copy sheet13.range("k1")
end sub

di sheet3 ada prosedur :
public sub DataUmurSaja()
     set rngKu = sheet7.range("a1").currentregion
     'misal data umur adalah kolom E saja dan akan dicopy ke sheet13 mulai
range j1
     rngku.resize(,1).offset(,4).copy sheet13.range("j1")
end sub

Pada kedua prosedur yang ada di masing-masing sheet tidak ada deklarasi
rngKu lagi bukan ?
Contoh seperti inilah yang sering disebut bahwa Public dan Private adalah
berkaitan dengan ruang lingkup variabel.

------------------------

Jadi, Public dan Private bukan sekedar ruang lingkup variabel saja, tetapi
mencakup karakteristik akses pemakaian.
Hal ini berkaitan erat dengan cara komputer membaca sebuah data yang
melalui pointernya, bukan nama variabelnya. Tapi hal seperti pointer ini
ndak usah dipikirkan, biar jadi urusannya si komputer saja. ndak mumet kalo
mikirin pointer.

Moga-moga jadi bingung dan jadi punya imajinasi lain tentang variabel,
public, private dsb, sehingga selalu muncul rasa ingin tahu lebih banyak
lagi.

Wassalam,
Kid.

On Sun, Mar 25, 2012 at 15:43, Rara Wilis <[email protected]> wrote:

> **
>
>
> maaf, koreksi ada yg salah fatal:
>
> tertulis
> *
> *
> *Lingkup Berlakunya VARIABLEs dan CONSTANTs*
>
> Variable ataupun Konstanta yg dideklarasikan pada level (di dalam sebuah)
> Prosedur
> Jika di deklarasikan dengan statement Dim / Private
> ( Dim NamaVariable as TiPeData )
> akan berlaku dan dikenal di modul tsb ( di semua Prosedur yg berada di
> Module tsb)
>
>
> seharusnya:
> *
> *
> *Lingkup Berlakunya VARIABLEs dan CONSTANTs*
>
> Variable ataupun Konstanta yg dideklarasikan pada level (di dalam sebuah)
> *MODULE*
>  Jika di deklarasikan dengan statement Dim / Private
> ( Dim NamaVariable as TiPeData )
> akan berlaku dan dikenal di modul tsb ( di semua Prosedur yg berada di
> Module tsb)
>
>
>
>
> On Sun, Mar 25, 2012 at 3:38 PM, Rara Wilis <[email protected]> wrote:
>
>> halo...
>> Ini kayaknya harus ngobrol mengenai : *Ruang Lingkup Berlakunya,  dan
>> Umur VARIABLE*
>> Kita akan membicarakan hal yg terjadi di satu workbook saja dulu
>> ---------------- cut -------
>>
>  
>
>

Kirim email ke