Laman

BelajarVBA 005 - Procedure seri 3

Coretan Mr. Kid

Kejujuran sering terkesan menghambat langkah usaha seseorang, padahal sesungguhnya saat itu kejujuran sedang membuka banyak pintu rezeki yang penuh berkah

Pembahasan kali ini adalah berkenalan dengan prosedur jenis property dan penggunaan prosedur jenis sub maupun function untuk bisa bekerja seperti prosedur jenis property. Pembahasan akan ditutup dengan gambaran dari penyusunan suatu proses yang dipecah menjadi banyak prosedur agar dapat meningkatkan daya guna sebuah prosedur dan memudahkan penyempurnaan suatu proses.



Property

Umumnya prosedur property digunakan dalam class module. Prosedur jenis property juga bisa digunakan general module (code module). Prosedur jenis properti mengatur ijin read (bisa digunakan) dan write (bisa diubah nilainya) dari sebuah properti. Prosedur property ada 3 jenis, yaitu Let, Set, dan Get. Property Let dan Set cenderung seperti prosedur Sub yang bertugas sebagai prosedur untuk menyimpan atau mengubah nilai suatu properti.

Keberadaan prosedur property Let dan Set menandai bahwa properti tersebut bisa diubah nilainya. Prosedur Get cenderung mirip dengan prosedur function yang bertugas sebagai prosedur untuk mengambil atau membaca nilai suatu properti. Keberadaan prosedur property Get menandai bahwa properti tersebut bisa digunakan atau dibaca nilainya. Contohnya seperti rangkaian script berikut :
  • misal di general module bernama mod10 diberi script :
     Private lMyNilai As Long    'variabel untuk property nilai
     Private rngMyRange As Range 'variabel untuk property object MyData

     'property dengan datatype long
     Public Property Get Nilai() As Long         'baca isi property
         Nilai = lMyNilai
     End Property

     Public Property Let Nilai(lNilai As Long)   'ubah isi property
         lMyNilai = lNilai
     End Property

     'property dengan datatype object
     Public Property Get MyData() As Range       'baca isi property
         Set MyData = rngMyRange
     End Property

     Public Property Set MyData(rng As Range)    'ubah isi property
         Set rngMyRange = rng
     End Property

  • variabel lMyNilai dan variabel obeject range rngMyRange adalah variabel yang akan dijadikan penyimpan nilai properti.
  • properti bernama Nilai akan menyimpan data di variabel lNilai, dan properti ber-datatype object bernama MyData akan menyimpan object-nya dalam variabel object range bernama rngMyRange.
  • Properti Nilai yang ber-datatype Long memiliki prosedur properti Let dan Get yang keduanya menggunakan Public. Artinya, properti Nilai memberi akses write melalui prosedur property Let dan memberi akses read melalui prosedur property Get.
  • Properti MyData yang ber-datatype object range memiliki prosedur Set dan Get yang keduanya menggunakan Public. Artinya, properti object MyData memberi akses write melalui prosedur property Set dan memberi akses read melalui prosedur property Get.
  • Jadi, untuk property ber-datatype object menggunakan prosedur property Set (untuk write) atau Get (untuk read). Selainnya menggunakan prosedur property Let (untuk write) dan Get (untuk read).
  • kemudian di general module lain, misal di mod11, ada prosedur yang bekerja memanfaatkan property Nilai dan MyData, sebagai berikut :
     Public Sub MemanfaatkanProperty()
         Dim rngA As Range, lNilB As Long
   
         'isi nilai ke dalam suatu variabel
         'melalui prosedur property let dan set

         Nilai = 5
         Set MyData = Range("a1")
   
         'ambil nilai dari suatu variabel
         'melalui prosedur property get

         lNilB = Nilai
         Set rngA = MyData
   
         'sekedar pesan
          MsgBox "Nilai lNilB : " & lNilB & vbCrLf & _
             "Alamat range dalam rngA : " & rngA.Address

     End Sub

  • Prosedur bernama MemanfaatkanProperty mengisi properti (proses write) Nilai pada baris berbunyi :
     Nilai = 5
  • Baris diatas dikerjakan dengan memanggil prosedur property Let Nilai.
  • Prosedur bernama MemanfaatkanProperty mengisi properti (proses write) object MyData pada baris berbunyi :
     Set MyData = Range("a1")
  • Baris diatas dikerjakan dengan memanggil prosedur property Set MyData karena properti MyData ber-type object.
  • Prosedur bernama MemanfaatkanProperty mengambil properti (proses read) Nilai dan MyData pada baris berbunyi :
     lNilB = Nilai
     Set rngA = MyData

  • Variabel lNilB akan diisi dengan isi properti bernama Nilai, yang diambil dengan cara menjalankan prosedur property Get Nilai.
  • Variabel object rngA akan di-set isinya dengan object yang ada dalam properti MyData, yang diambil dengan cara menjalankan prosedur property Get MyData.

Dari 2 buah general module di atas, variabel ber-scope module (menggunakan private), seperti variabel lMyNilai dan rngMyRange, bisa digunakan oleh prosedur yang ada dimodule lain dengan kehadiran prosedur jenis property. Cara mengaksesnya pun bisa layaknya menggunakan variabel yang ber-scopy project (menggunakan public).

Kasus diatas menggunakan prosedur property dalam sebuah general module. Proses yang dilakukan oleh prosedur jenis property Let, Set, dan Get bisa digantikan oleh prosedur jenis Sub dan Function. Pemakaian nama prosedur properti layaknya sebuah variabel tidak bisa dilakukan oleh prosedur function pengganti prosedur property get, melainkan hanya tampak seakan-akan bahwa nama prosedur function digunakan sebagai sebuah variabel.
  • misal dalam mod10 diberi prosedur function agar bisa berinteraksi dengan variabel lMyNilai secara langsung sebagai berikut :
     'bisa digunakan menjadi pengganti Get
     'dan bisa membantu mengatur ijin write

     Public Sub SimpanSiNilai(lIsinya As Long)
         lMyNilai = lIsinya
     End Sub
 

     'bisa digunakan menjadi pengganti Get
     'dan bisa membantu mengatur ijin read

     Public Function AmbilSiNilai() As Long
         AmbilSiNilai = lMyNilai
     End Function

  • cara memanfaatkannya adalah seperti prosedur bernama PakaiSubDanFunction di mod11 berikut ini :
     Public Sub PakaiSubDanFunction()
         Dim lNilB As Long
   
         'isi nilai ke dalam suatu variabel
         'melalui prosedur sub
         'sebagai pengganti prosedur property let

         SimpanSiNilai 5
   
         'ambil nilai dari suatu variabel
         'melalui prosedur function
         'sebagai pengganti prosedur property get

         lNilB = AmbilSiNilai
     End Sub

  • Jadi untuk menyimpan data bernilai 5 kedalam variabel lMyNilai dilakukan dengan memanggil prosedur Sub berargumen. Sedangkan untuk mengambil data dari variabel lMyNilai dilakukan dengan memanggil prosedur Function. Penataan ijin read atau write bisa dilakukan dengan mengubah scope public yang digunakan prosedur sub dan function seperti pengaturan public pada prosedur jenis property.
  • Prosedur property Let, Set, Get juga bisa digantikan oleh sebuah prosedur function. Misalkan untuk mengakses variabel lMyNilai seperti kasus di atas, bisa menggunakan prosedur function berikut :
     Public Function SiNilai( _
                                 Optional ByVal lIsinya As Long _
                               , Optional bWrite As Boolean _
                             ) As Long
         If bWrite Then
             lMyNilai = lIsinya
         End If
         SiNilai = lMyNilai
     End Function

  • Contoh penggunaannya adalah seperti dalam prosedur bernama PakaiFunctionSaja berikut ini :
     Public Sub PakaiFunctionSaja()
         Dim lNilB As Long
   
         'isi nilai ke dalam suatu variabel
         'melalui prosedur function SiNilai
         'sebagai pengganti prosedur property let

         SiNilai 5, True
   
         'ambil nilai dari suatu variabel
         'melalui prosedur function SiNilai
         'sebagai pengganti prosedur property get

         lNilB = SiNilai
     End Sub

  • Bentuknya cenderung lebih mirip dengan penggunaan prosedur jenis property. Nama prosedur yang sama bisa dipakai untuk proses read maupun write.


Prosedur property dalam Class Module

Bagian ini adalah perkenalan dengan class module. Class Module digunakan untuk membentuk sebuah custom class. Class adalah blueprint dari object yang dibentuk menggunakan class tersebut. Nama class module menjadi nama class pembentuk object.
  • Misalkan dibuat sebuah class module baru dan diberi nama cDataKu dengan cara :
  1. klik kanan sebuah module dalam project explorer -> pilih Insert -> pilih Class Module
  2. klik class module yang terbentuk -> lihat properties window -> ganti isi properti (Name) menjadi cDataKu
  • Salin script berikut ke dalam class module cDataKu :
     Private mRngData As Range

     Public Property Set DataRange(rng As Range)
         Set mRngData = rng
     End Property

     Public Property Get DataRange() As Range
         Set DataRange = mRngData
     End Property

  • Class cDataKu berisi sebuah property object bernama DataRange yang dibentuk menggunakan prosedur ber-scope project jenis Property Set dan Get agar memiliki akses read dan write. Nilai data akan disimpan dalam variabel mRngData yang ber-datatype Range atau dibentuk dari class Range.
  • Class cDataKu dapat digunakan oleh prosedur yang ada di module lain, seperti prosedur bernama PakaiCustomClass yang ada di general module mod11 berikut ini :
     Public Sub PakaiCustomClass()
         'deklarasi variabel object dari class cDataKu
         Dim oRng1 As cDataKu, oRng2 As cDataKu
   
         'deklarasi variabel object dari class Range
         Dim rngSatu As Range, rngDua As Range
   
         'instancing object dari class cDataku
         Set oRng1 = New cDataKu
         Set oRng2 = New cDataKu
   
         'ubah property DataRange milik object
         'dari class cDataKu

         Set oRng1.DataRange = Range("a1,b5:d5,c7:c9,f1:h3")
         Set oRng2.DataRange = Range("a1:k7")
   
         'ambil property DataRange milik object
         'dari class cDataKu

         Set rngSatu = oRng1.DataRange
         Set rngDua = oRng2.DataRange
   
          'sekedar tampilan pesan
          MsgBox "Isi property DataRange milik :" & vbCrLf & _
             "oRng1 adalah range " & oRng1.DataRange.Address _
             & vbCrLf & "oRng2 adalah range " & _
             oRng2.DataRange.Address & vbCrLf & vbCrLf & _
             "Perpotongan property DataRange dari " & _
             "oRng1 dengan oRng2 adalah range " & _
             Intersect(oRng1.DataRange, oRng2.DataRange).Address & _
             vbCrLf & vbCrLf & "Isi variabel range bernama :" & _
             vbCrLf & "rngSatu adalah range " & rngSatu.Address & _
             vbCrLf & "rngDua adalah range " & rngDua.Address & _
             vbCrLf & vbCrLf & _
             "Perpotongan rngSatu dengan rngDua adalah range " & _
             Intersect(rngSatu, rngDua).Address

     End Sub

  • Variabel oRng1 dan oRng2 akan memiliki datatype berupa object yang dibentuk menggunakan class cDataKu.
  • Variabel object oRng1 dan oRng2 tidak dapat digunakan sebelum diset instansinya (instancing). Proses instancing tersebut dilakukan oleh baris-baris kode :
     Set oRng1 = New cDataKu
     Set oRng2 = New cDataKu

  • Mengubah isi properti object bernama DataRange dari object oRng1 dan oRng2 dilakukan oleh baris-baris kode :
     Set oRng1.DataRange = Range("a1,b5:d5,c7:c9,f1:h3")
     Set oRng2.DataRange = Range("a1:k7")

  • Mengambil nilai properti object oRng1 dan oRng2 dilakukan oleh baris-baris kode :
     Set rngSatu = oRng1.DataRange
     Set rngDua = oRng2.DataRange
     MsgBox blablabla

  • Proses terhadap nilai properti bernama DataRange juga dapat dilihat dalam baris kode MsgBox blablabla.


Prosedur yang digunakan oleh banyak prosedur lain

Salah satu tantangan dalam menyusun program untuk sebuah proses otomasi maupun aplikasi adalah membuat prosedur yang bisa digunakan oleh banyak prosedur lain. Cobalah diingat-ingat tentang fitur Excel seperti sort. User bisa menggunakan Sort dimanapun didalam worksheet. Prosedur seperti untuk proses sort inilah yang dimaksud sebagai prosedur yang dapat digunakan oleh prosedur-prosedur lain. Contohnya sebagai berikut :
  1. Misalkan saja ada 5 sheet sumber data, bernama sheet1 sampai sheet5, yang data didalamnya akan digabungkan untuk masuk ke sheet bernama Data. Anggap saja proses terhadap semua sheet dimulai ketika sebuah tombol ditekan.
  2. Sheet1, Sheet3, dan Sheet4 akan menggunakan rangkaian proses bernama Proses Model A. Sedangkan Sheet2 dan Sheet5 akan menggunakan proses bernama Proses Model B.
  3. Proses Model A berisi rangkaian 7 proses, yang secara berurutan sebagai Proses1,Proses2,Proses3,Proses1,Proses4,Proses2,Proses1. Proses Model B berisi rangkaian 5 proses, yang secara berurutan sebagai Proses2,Proses1,Proses4,Proses1,Proses2. Data yang digunakan adalah data yang ada di setiap sheet yang diproses. Dari kedua model proses tersebut, dapat diketahui bahwa proses yang dibutuhkan adalah Proses1,Proses2,Proses3, dan Proses4 yang dipanggil dengan urutan sesuai model prosesnya, yaitu model A atau model B.
Secara singkat dapat dibentuk sebuah proses sebagai berikut :
  • Ketika tombol ditekan, akan dijalankan sebuah prosedur yang dipanggil oleh si tombol. Misalkan namanya adalah Prosedur Tombol.
  • Prosedur Tombol akan berisi proses perulangan membaca setiap sheet, yaitu sheet1 sampai sheet5 silih berganti, yang dapat berupa penggunaan For Each Next.
  • Dalam blok perulangan akan ada analisa terhadap nama sheet. Jika nama sheet masuk kelompok Sheet1,Sheet3, dan Sheet4, maka proses akan memanggil prosedur bernama ProsesModelA. Jika nama sheet masuk kelompok lainnya, maka proses akan memanggil prosedur bernama ProsesModelB.
  • Kira-kira bunyi prosedur bernama Tombol akan berbunyi :
     Public Sub Tombol()
         Dim sht As Worksheet
   
         For Each sht In Sheets( _

                Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5") _
                          )
             sht.Activate
             Select Case sht.Name
             Case "Sheet1", "Sheet3", "Sheet4"
                 ProsesModelA
             Case "Sheet2", "Sheet5"
                 ProsesModelB
             End Select
         Next sht
         Sheets("Data").Activate
     End Sub

  • Karena proses akan masuk ke Proses Model A atau Proses Model B, maka dibentuklah prosedur untuk kedua proses tersebut dan diletakkan dalam module yang sama.
  • Proses Model A bisa dibuatkan dalam prosedur bernama ProsesModelA. Proses yang dijalankan dalam ProsesModelA adalah menjalankan Proses1,Proses2,Proses3,Proses4 dalam suatu urutan tertentu. Bentuk prosedur ProsesModelA dapat berbentuk :
     Public Sub ProsesModelA()
         'rangkaian proses di Proses Model A adalah
         'Proses1,Proses2,Proses3,Proses1,Proses4,Proses2,Proses1

         MsgBox "ProsesModelA mulai"
         Proses1
         Proses2
         Proses3
         Proses1
         Proses4
         Proses2
         Proses1
         MsgBox "ProsesModelA selesai"
     End Sub

  • Proses Model B bisa dibuatkan dalam prosedur bernama ProsesModelB. Proses yang dijalankan dalam ProsesModelB adalah menjalankan Proses1,Proses2,Proses4 dalam suatu urutan tertentu. Bentuk prosedur ProsesModelB dapat berbentuk :
     Public Sub ProsesModelB()
         'rangkaian proses di Proses Model B adalah
         'Proses2,Proses1,Proses4,Proses1,Proses2

         MsgBox "ProsesModelB mulai"
         Proses2
         Proses1
         Proses4
         Proses1
         Proses2
         MsgBox "ProsesModelB selesai"
     End Sub

  • Pemilihan scope project dengan menggunakan keyword Public pada deklarasi prosedur ProsesModelA dan ProsesModelB akan membuat kedua proses tersebut dapat digunakan oleh prosedur lain selain prosedur Tombol. Baik yang ada dalam module tersebut atau yang ada di modeul lainnya.
  • Proses-proses yang dijalankan pada Proses Model A dan Proses Model B dibuat dalam prosedur tersendiri berdasar karakteristik prosesnya. Karena proses yang dijalankan memiliki 4 karakteristik proses, maka dibuatlah 4 prosedur proses tersebut sebagai berikut : (diletakkan dalam module yang sama dengan prosedur ProsesModelA dan ProsesModelB)
     Private Sub Proses1()
         'baris-baris kode proses1
         'misalkan ada 10 baris kode

     End Sub

     Private Sub Proses2()
         'baris-baris kode proses2
         'misalkan ada 20 baris kode

     End Sub

     Private Sub Proses3()
         'baris-baris kode proses3
         'misalkan ada 30 baris kode

     End Sub

     Private Sub Proses4()
         'baris-baris kode proses4
         'misalkan ada 40 baris kode

     End Sub

  • Prosedur-prosedur proses dibuat terpisah atau per prosedur sesuai karakteristik prosesnya.
  • Bisa jadi jumlah baris kodenya akan sama ataupun berbeda-beda.
  • Dengan terpisahnya menjadi prosedur-prosedur yang tersendiri, maka dapat dibuat banyak model proses seperti ProsesModelC, ProsesModelD, dan sebagainya yang bisa jadi juga membutuhkan prosedur-prosedur proses tersebut.
  • Perbaikan sebuah proses dapat lebih fokus ke prosedur proses tersebut dan tidak kuatir ada bagian proses yang sama yang belum diperbaiki.
  • Penggunaan scope module dengan keyword private akan mengurangi daftar prosedur yang bisa di-Run dari workbook window di dialog Macro.

Cara penyusunan prosedur seperti kasus diatas akan menghasilkan baris kode (tanpa baris deklarasi) sebagai berikut :
  •  11 baris kode prosedur Tombol
  •   9 baris kode prosedur ProsesModelA
  •   7 baris kode prosedur ProsesModelB
  •  10 baris kode prosedur Proses1
  •  20 baris kode prosedur Proses2
  •  30 baris kode prosedur Proses3
  •  40 baris kode prosedur Proses4
  • 127 total baris kode untuk seluruh kegiatan

Coba bayangkan andai saja ProsesModelA disusun seperti prosedur ProsesModelA1 berikut ini :
     Public Sub ProsesModelA1()
         'rangkaian proses di Proses Model A1 adalah
         'Proses1,Proses2,Proses3,Proses1,Proses4,Proses2,Proses1

         MsgBox "ProsesModelA1 mulai"
   
         'baris-baris kode proses1
         'misalkan ada 10 baris kode
   
         'baris-baris kode proses2
         'misalkan ada 20 baris kode
   
         'baris-baris kode proses3
         'misalkan ada 30 baris kode
   
         'baris-baris kode proses1
         'misalkan ada 10 baris kode
   
         'baris-baris kode proses4
         'misalkan ada 40 baris kode
   
         'baris-baris kode proses2
         'misalkan ada 20 baris kode
   
         'baris-baris kode proses1
         'misalkan ada 10 baris kode

   
         MsgBox "ProsesModelA1 selesai"
     End Sub

Maka prosedur ProsesModelA1 saja sudah berisi 142 baris kode. Selain itu, jika akan memperbaiki proses1, maka pada prosedur ProsesModelA seperti ini harus dilakukan pada 3 tempat. Belum lagi nanti yang ada di prosedur model-model lainnya, seperti ProsesModelB1.

Pembahasan tentang prosedur selesai dulu sampai disini. Harapannya, penyusunan prosedur untuk suatu proses bisa lebih spesifik sesuai karakteristik prosesnya, sehingga prosedur-prosedur dengan karakteristik yang memungkinkan untuk digunakan dalam proses lainnya bisa dijalankan dengan memanggil nama prosedur proses tertentu tersebut. Seperti halnya proses yang memiliki karakteristik proses seperti Proses1 bisa digunakan dalam prosedur-prosedur model proses lainnya.

Insya Allah pembahasan selanjutnya adalah tentang object utama dalam Excel seperti Application, Workbook, Worksheet, dan Range.




Tidak ada komentar:

Posting Komentar