Monday, July 8, 2013

BelajarVBA 004 - Tipe data, Variabel, Konstanta


Coretan Mr. Kid


Selesai satu urusan, kerjakan urusan lainnya dengan sungguh-sungguh

Bahasan kali ini adalah tentang tipe data (datatype), variabel, dan konstanta. Pemrograman tidak akan bisa lepas dari penggunaan variabel ataupun konstanta. Sulit sekali menggunakan variabel ataupun konstanta secara efisien jika tidak mengenal datatype.

Bahasan kali ini tampaknya akan lebih mudah dipahami jika mencoba langsung dikomputer. File yang bisa dijadikan media uji coba bisa dibuat sendiri atau mengunduh file BelajarVBA003.xlsm yang ada disini.

Datatype

Apa yang dapat dapat dimengerti oleh manusia tentang nilai-nilai seperti '123,000,000.25' atau '99%' atau 'Sabtu, 22 Juni 2013' atau 'A' ? Yang paling sederhana, manusia akan mengatakan bahwa 123,000,000.25 adalah angka yang memiliki 2 digit dibelakang koma. Nilai 99% akan dikatakan sebagai angka persentase sesuatu. Sedangkan 'Sabtu, 22 Juni 2013' adalah suatu tanggal tertentu. Untuk nilai 'A', manusia bisa mengatakan bahwa itu adalah sebuah huruf yang bisa menjadi kata atau bahkan kalimat ketika bersama huruf-huruf lain.

Di alam bawah sadarnya, manusia sebenarnya sedang mengelompokkan nilai-nilai yang dilihatnya seperti nilai-nilai di atas tadi. Dari pengelompokan itu, manusia bisa mengetahui apa yang bisa dan apa yang tidak bisa dilakukan antar nilai tersebut. Misal, manusia segera tahu bahwa nilai 'Sabtu, 22 Juni 2013' tidak bisa dikalikan dengan nilai '99%'. Bahkan manusia bisa mengetahui juga bahwa tidak akan ada nilai '34 Juni 2013', karena Juni 2013 hanya sampai '30 Juni 2013' sedangkan 4 angka setelah 30 dari '34 Juni 2013' harus ditulis sebagai '4 Juli 2013'. Jika manusia kemudian diberi nilai '35.72%' pun akan segera tahu bahwa nilai tersebut seperti nilai '99%', yaitu sebagai angka persentase sesuatu.

Komputer tidak memiliki kemampuan seperti yang terjadi dialam bawah sadar manusia tersebut. Untuk itulah dibentuk datatype. Jadi, secara garis besar, datatype adalah sebuah karakteristik dari suatu nilai data yang memberikan informasi bagi komputer agar bisa mengetahui :
  • cara menggunakan nilai data tersebut
  • batasan-batasan penyusunan pengelompokan nilai data
  • cara menyimpannya dalam memori komputer
Daftar datatype di dalam VBA tersebar banyak di-internet, dan salah satunya bisa dilihat disini atau didalam file BelajarVBA003.xlsm. Pengelompokan datatype tersebut adalah seperti gambar berikut :


Gambar di atas bisa digunakan untuk membantu menentukan datatype suatu nilai data. Jika data berisi :
  • TRUE atau FALSE -> gunakan Boolean
  • Angka selalu pasti bilangan bulat -> gunakan :
  1. Byte bila antara 0 sampai 255
  2. Integer bila antara -32,768 sampai 32,767 atau maksimal 4 digit
  3. Long bila antara -2,147,483,648 sampai 2,147,483,647 atau maksimal 9 digit
  • Angka memiliki jumlah digit yang harus dijaga tepat apa adanya dan bisa berupa pecahan -> gunakan :
  1. Currency bila berupa nilai uang dengan ketepatan 4 digit dibelakang koma atau maksimal 14 digit
  2. Variant bila nilai tidak boleh berubah (apa adanya) yang bisa mencapai 28 digit agar bisa diisi nilai bertipe Decimal (tipe data diwarna merah)
  • Angka tidak harus dijaga ketepatan jumlah digitnya dan bisa berupa pecahan -> gunakan Single atau Double karena keduanya memiliki rentang yang sangat luas
  • Tanggal saja atau waktu saja atau tanggal disertai waktu -> gunakan Date
  • Teks atau setidaknya ada 1 karkater yang bukan angka -> kondisi :
  1. bila jumlah karakter tidak tetap maka gunakan String dengan deklarasi biasa
  2. bila jumlah karakter harus dijaga tetap N karakter maka gunakan String dengan deklarasi String * Jumlah_karakter
  • Object (benda) -> kondisi :
  1. bila tahu nama objectnya, gunakan nama objectnya (misal range, worksheet, pivottable, dsb)
  2. bila tidak tahu nama objectnya, gunakan kata Object
  • Elemen array untuk kegiatan perulangan (loop) -> gunakan Variant karena bisa berubah menjadi datatype sesuai datatype si elemen array
  • Tidak pasti datatype-nya (hal ini harus dihindari) -> gunakan Variant karena bisa berubah menjadi datatype sesuai dengan nilai datanya.
Hal-hal yang perlu diperhatikan :
  1. Jika nilai data yang akan disimpan melebihi batas datatype yang ditentukan atau malah berbeda datatype-nya, maka akan menghasilkan error
  2. Penulisan number dalam VBA selalu menggunakan format English atau menggunakan karakter titik ( . ) sebagai tanda desimal
  3. Penulisan date dalam VBA sebaiknya menggunakan format universal YYYY-MM-DD HH:mm:ss meskipun VBA kadang kala mengubah formatnya menjadi yang digunakannya
  4. VB/VBA akan berusaha mengkonversi datatype inputan menjadi sesuai dengan yang dideklarasikan
  5. Untuk dapat menggunakan datatype Decimal, maka variabel atau prosedur jenis function harus menggunakan datatype Variant yang diisi dengan menggunakan fungsi CDec.

Variabel

Variabel adalah nama lokasi penyimpanan data tertentu, yang memiliki datatype tertentu, di dalam memori komputer dengan kemampuan read (baca atau ambil nilainya) dan write (tulis atau ubah nilai yang tersimpan). Cara mendeklarasikan variabel adalah :
     scope nama_variabel AS datatype
contoh :
     Public sNamaCust As String
     Public lQtyJual As Long, lQtyStock As Long
     Private dtTglTransaksi As Date

Pemberian prefix yang mencerminkan datatype yang digunakan, seperti s atau str untuk datatype String, i atau int untuk datatype Integer, dan sebagainya adalah salah satu kaidah yang disepakati kebanyakan pemrogram. Secara umum, nama variabel diawali dengan huruf dan bersifat unique.

Mengisi nilai ke dalam variabel (mengubah nilai) dilakukan dengan meletakkan variabel secara mandiri disisi kiri tanda sama dengan dalam sebuah baris kode program. Kaidah ini juga berlaku untuk pengubahan sebuah nilai properti dari suatu object. Syntax pengisian nilai ke dalam variabel adalah :
  • Selain variabel ber-datatype object
     nama_variabel_penyimpan = ekspresi_nilai_yang_akan_disimpan
  • Khusus variabel ber-datatype object
     Set nama_variabel_object = ekspresi_object_yang_akan_disimpan
Ekspresi nilai yang akan disimpan bisa berupa sebuah nilai tetap, nilai dari suatu variabel atau properti, proses komputasi, nilai balik dari suatu fungsi. Pengisian variabel ber-datatype object harus didahului dengan keyword Set.

Contoh mengisi variabel dengan suatu nilai tetap : (fokus pada biru)
Public Sub VariabelDiisiNilaiTetap()
    Dim bStatus As Boolean
    Dim btGrup As Byte, iItem As Integer, lRow As Long
    Dim curJual As Currency, decDesimal As Variant
    Dim sngSingle As Single, dblDouble As Double
    Dim dtTgl As Date, dtJam As Date, dtTglJam As Date
    Dim sNama As String, sID As String, sInfo As String
    Dim sSelalu7Char As String * 7
    Dim rngData As Range


    'isi variabel dengan nilai tetap
    bStatus = True
    btGrup = 13
    iItem = 4700
    lRow = 89000

    curJual = 120000.2571535
   
    'fungsi CDec digunakan untuk membuat datatype Variant menjadi Decimal
    decDesimal = CDec("12345678901234567.12345678901")       

    'sekedar pesan
    MsgBox "Datatype CURRENCY" & vbCrLf & "curJual diisi 120000.2571535" & vbCrLf & _
       "secara real berisi nilai " & curJual &
vbCrLf & vbCrLf & "Datatype DECIMAL" & vbCrLf & _
       "decDesimal diisi nilai 12345678901234567.12345678901" &
vbCrLf & "secara real berisi nilai " & _
       decDesimal &
vbCrLf & "decDesimal dideklarasikan ber-datatype : Variant" & vbCrLf & _
       "decDesimal berubah menjadi ber-datatype : " &
TypeName(decDesimal)

    sngSingle = 5765.123456782
    dblDouble = 5765.123456782


    'sekedar pesan
    MsgBox "Datatype SINGLE" & vbCrLf &
"sngSingle diisi nilai 5765.123456782" & vbCrLf & _
      
"secara real berisi nilai " & sngSingle & vbCrLf & vbCrLf & "jika sngSingle ditambah 0.0006" & _
       vbCrLf & "akan menjadi " & sngSingle + 0.0006 & vbCrLf & vbCrLf & "Datatype DOUBLE" & vbCrLf & _
       "dblDouble diisi nilai 5765.123456782" & vbCrLf &
"secara real berisi nilai " & dblDouble & _
       vbCrLf & vbCrLf & "jika dblDouble ditambah 0.0006" & vbCrLf & "akan menjadi " & dblDouble + 0.0006
   
    dtTgl = #6/22/2013#                 'dari tulisan #2013-06-22#
    dtJam = #5:30:00 PM#                '
dari tulisan #17:30#
    dtTglJam = #6/22/2013 5:30:00 PM#   '
dari tulisan #2013-06-22 17:30#

    'input string selalu diapit petik dua
    sNama = "Kid"
    sID = "9877-234-7733-12-25412-1"
  'ada 24 karakter, 19 angka dan 5 dash
   
    'menulis "Jamrud" dalam data string
    'setiap karakter petik dua harus ditulis dua kali ( "" )

    sInfo = "Indonesia ""Jamrud"" Khatulistiwa"

    'sekedar pesan
    MsgBox "Datatype STRING" & vbCrLf &
"jenis : Variable Length" & vbCrLf & "sNama berisi teks berbunyi '" & sNama & _
        "'" & vbCrLf &
"sID berisi teks berbunyi '" & sID & "'" & vbCrLf & "sInfo berisi teks berbunyi '" & sInfo & "'"

    'fixed length 7 char hanya diisi 3 char,
    'maka 4 char sisanya diisi spasi dengan nomor ASCII 32

    sSelalu7Char = "123"

    'sekedar pesan
    MsgBox "Datatype STRING" & vbCrLf &
"jenis : Fixed Length" & vbCrLf & "deklarasi :" & vbCrLf & vbTab & _
       "Dim sSelalu7Char As String * 7" & vbCrLf &
"arti : selalu berisi 7 karakter" & vbCrLf & _
       "sSelalu7Char diisi teks berbunyi '123' (3 karakter)" &
vbCrLf & "secara real akan berisi teks berbunyi '" & _
       sSelalu7Char & "'" & vbCrLf & "dengan jumlah karakter adalah " & Len(sSelalu7Char) & " karakter"
           
    'mengisi ber-datatype object selalu butuh keyword Set
    Set rngData = Range("a1:c2,a5:a7,d1:f1,a1")
End Sub

Beberapa hal yang perlu diperhatikan dalam contoh-contoh di atas adalah :
  • Penulisan suatu nilai tetap berupa number tidak perlu menyertakan pemisah ribuan
  • Penulisan suatu nilai tetap untuk yang ber-datatype Date harus diapit karakter ( # )
  • Penulisan suatu nilai tetap untuk yang ber-datatype String harus diapit karakter petik dua ( " )
  • Penulisan setiap karakter petik dua di dalam nilai tetap teks harus ditulis sebanyak 2 (dua) kali ( "" )
Membaca nilai yang ada di dalam variabel (mengambil nilai) dilakukan dengan menyebutkan nama variabel tersebut. Kaidah ini juga berlaku pada pengambilan sebuah nilai properti dari suatu object.

Contoh mengisi variabel dengan suatu nilai dari variabel atau properti lain :
(fokus pada biru)
Public Sub VariabelDiisiDariVariabelLain()
    Dim lSumber As Long, lTarget As Long
    Dim sAwal As String, sAkhir As String
    Dim rngData As Range, rngOutput As Range

   
    'isi nilai tetap
    lSumber = 10
    sAwal = "Kid"
    Set rngData = Range("b2")

   
    'isi nilai dari variabel lSumber dan sAwal yang juga
    'sebagai contoh membaca nilai dari variabel lain,
    'yaitu dari lSumber, sAwak, dan rngData

    lTarget = lSumber              'lTarget akan bernilai 10
    sAkhir = sAwal                 'sAkhir akan bernilai Kid
    Set rngOutput = rngData        'rngOutput akan berisi Range("b2")
   
    '-------------------------------------
    'isi nilai dari suatu proses komputasi
    '-------------------------------------
    'lTarget akan berisi 15, yaitu lSumber + 5 = 10 + 5 = 15

    lTarget = lSumber + 5
   
    'sAkhir akan berisi Kid Belajar VBA, yaitu
    'sAwal disambung dengan teks berbunyi ' Belajar VBA'

    sAkhir = sAwal & " Belajar VBA"       
   
    '--------------------------------------------------------------
    'isi nilai dari dirinya yang lama yang dikenai proses komputasi
    'untuk menghasilkan nilai dirinya yang baru
    '--------------------------------------------------------------
    'lTarget bernilai 25, yaitu 

    'lTarget yang lama (bernilai 15 hasil lSumber + 5)
    'ditambah dengan nilai 

    'lSumber (bernilai 10 dari baris lSumber = 10)
    lTarget = lTarget + lSumber
   
    'sAkhir bernilai teks yang berbunyi 'KidKid Belajar VBA',
    'yaitu 'Kid' (dari sAwal = "Kid") 

    'diimbuhi teks dari sAkhir yang lama
    'yang bernilai teks berbunyi 'Kid Belajar VBA' 

    '(baris sAkhir = sAwal & " Belajar VBA")
    sAkhir = sAwal & sAkhir
End Sub


Variant

Hal-hal yang perlu diketahui tentang datatype Variant antara lain :
  • Datatype Variant adalah datatype default dalam VB/VBA.
  • Setiap deklarasi variabel atau prosedur Function yang tidak menegaskan datatype-nya akan menjadi ber-datatype Variant.
  • Datatype Variant membutuhkan ruang memori yang luas (minimal 16 byte).
  • Datatype Variant akan selalu mengikuti datatype yang sesuai dengan nilai yang disimpannya.
  • Proses yang didalamnya memanfaatkan datatype Variant relatif lebih lambat dibanding yang memanfaatkan datatype yang sesuai yang selain Variant.
VB/VBA menyediakan beberapa karakter literal yang diletakkan dibelakang suatu nilai tetap sebagai penunjuk beberapa datatype dari nilai tetap tersebut. Karakter-karakter tersebut adalah :
  • & untuk datatype Long
  • @ untuk datatype Currency
  • ! untuk datatype Single
  • # untuk datatype Double
Contoh penggunaan literal di atas : (fokus pada biru)
Public Sub LiteralVariabelVariant()
    Dim vLong As Variant, vCur As Variant
    Dim vSingle As Variant, vDouble As Variant

    

    'menggunakan literal datatype
    vLong = 5762&
    vCur = 5762@
    vSingle = 5762!
    vDouble = 5762#


    'sekedar pesan

    MsgBox "Datatype VARIANT" & vbCrLf & "vLong dari Variant menjadi " & TypeName(vLong) & vbCrLf & _
      "vCur dari Variant menjadi " & TypeName(vCur) & vbCrLf &
"vSingle dari Variant menjadi " & _
      TypeName(vSingle) & vbCrLf &
"vDouble dari Variant menjadi " & TypeName(vDouble)
 End Sub
Pada umumnya, penentuan datatype pada variabel ber-datatype variant adalah dengan menggunakan fungsi-fungsi konversi datatype seperti CBool, CByte, CInt, CLng, CCur, CDec, CSng, CDbl, CDate, CStr, CVar, CVErr, dan CType. Fungsi-fungsi ini bisa digunakan untuk nilai tetap maupun untuk nilai dari suatu ekspresi lainnya. Contohnya seperti penggunaan CDec untuk membentuk datatype Decimal.

Variabel dengan datatype variant akan memiliki isi Empty ketika pertama kali terbentuk. Jika kemudian datatype-nya telah berubah, maka nilai kosongnya adalah 0 untuk perubahan ke datatype jenis numerik dan berupa nilai NULLSTRING ( "" ) untik perubahan ke datatype jenis text. Variabel ber-datatype variant bisa menyimpan nilai NULL (tidak terdefinisi) ketika digunakan sebagai wadah untuk menampung data dari database yang bisa berupa NULL. Selain itu, variabel ber-datatype variant juga bisa menerima datatype khusus bernama error hasil fungsi CVErr. Konstanta CVErr untuk menghasilkan Excel error value adalah :
  • xlErrNull  -> #NULL!
  • xlErrDiv0  -> #DIV/0!
  • xlErrValue -> #VALUE!
  • xlErrRef   -> #REF!
  • xlErrName  -> #NAME?
  • xlErrNum   -> #NUM!
  • xlErrNA    -> #N/A
Contoh pemakaian (letakkan dalam sebuah prosedur) : (fokus pada biru)
     'error value xlErrValue (setara 2015)
     'akan menghasilkan nilai Error 2015 (description)
     'berupa #VALUE! bila ditampilkan di sebuah cell

     Dim vXLErr As Variant
     vXLErr = CVErr(xlErrValue)


Kesalahan dalam deklarasi variabel

Satu baris deklarasi variabel bisa digunakan untuk mendeklarasikan banyak variabel. Misal ingin mendeklarasikan 2 buah variabel, katakanlah iNilai1 dan iNilai2, yang ber-datatype Integer. Kesalahan deklarasi yang sering terjadi adalah :
     Dim iNilai1, iNilai2 As Integer
karena sebenarnya variabel Nilai1 akan memiliki datatype Variant dan variabel Nilai2 memiliki datatype Integer. Jadi hanya variabel Nilai2 yang sesuai keinginan. Jalankan prosedur berikut ini untuk membuktikannya : (fokus pada biru)
  Public Sub KesalahanDeklarasi()
    Dim iNilai1, iNilai2 As Integer
   
    iNilai1 = 123.45678
    iNilai2 = 123.45678

   
     MsgBox "Deklarasi variabel :" & vbCrLf & vbTab &
"Dim iNilai1, iNilai2 As Integer" & vbCrLf & vbCrLf & _
      "iNilai1 dan iNilai2 diisi nilai yang sama," &
" yaitu 123.45678" & vbCrLf & vbCrLf & "iNilai1 ber-datatype " & _

      TypeName(iNilai1) & " dengan nilai " & iNilai1 & vbCrLf & "iNilai2 ber-datatype " & TypeName(iNilai2) & _
      " dengan nilai " & iNilai2
  End Sub


Static

Keyword Static adalah sebuah statement yang dikhususkan untuk variabel dengan scope level Procedure. Tujuannya untuk memperpanjang usia pakai variabel. Seperti dibahas dalam kisah tentang keyword Dim, usia pakai variabel dengan scope level Procedure akan dibuang dari memori komputer ketika prosedur tersebut telah selesai diproses. Penggunaan keyword Static untuk menggantikan keyword Dim akan mencegah variabel tersebut dibuang dari memori ketika prosedur tempat tinggalnya selesai diproses. Hal ini bisa berguna untuk proses yang membutuhkan nilai dari proses terakhir, seperti membuat counter. Jalankan prosedur berikut ini lebih dari satu kali : (fokus pada biru)
Public Sub PakaiVariabelStatic()
    Dim lUmurPendek As Long
    Static lPanjangUmur As Long
   
    lUmurPendek = lUmurPendek + 5
    lPanjangUmur = lPanjangUmur + 5

   
      MsgBox "Nilai lUmurPendek sekarang " & lUmurPendek & vbCrLf &
"Nilai lPanjangUmur sekarang " & lPanjangUmur
 End Sub

Jika seluruh variabel dalam sebuah prosedur akan dibuat static seluruhnya, maka keyword Static diletakkan pada baris deklarasi prosedur. Seluruh variabel dideklarasikan dengan keyword Dim. Jalankan prosedur berikut ini berulang kali : (fokus pada biru)
Public Static Sub SemuaVariableStatic()
    Dim lUmur As Long, lNilai As Long
   
    lUmur = lUmur + 5
    lNilai = lNilai + 5


      MsgBox "Nilai lUmur sekarang adalah " & lUmur & vbCrLf &
"Nilai lNilai sekarang adalah " & lNilai
 End Sub

Cara me-reset variabel-variabel static adalah dengan menu Run pilih Reset dari VBE. Jika melalui kode program, maka dibutuhkan variabel dengan scope level Module yang bertugas sebagai status penghapusan. Kemudian sebuah prosedur bertugas untuk mengubah nilai variabel status penghapusan tersebut, yang disertai dengan menjalankan prosedur yang berisi variabel static yang akan di-reset. Variabel static harus dibuat bekerja dalam suatu kondisi tergantung nilai yang disimpan oleh variabel status penghapusan. Contohnya sebagai berikut :
  • Buat variabel ber-scope level module (tulis di bawah Option Explicit) :
     Private bHapusStatic As Boolean
  • Buat prosedur yang berisi proses yang membutuhkan variabel static :
     Public Sub ProsedurBerStaticVariabel()
         Static lVarStatic As Long         'deklarasi variabel static
   
         'cek status penghapus
         If bHapusStatic Then              'jika HapusStatic adalah TRUE
             lVarStatic = 0                   'reset variabel static
         Else                              'jika FALSE
             lVarStatic = lVarStatic + 5      'kerja seperti biasa
         End If                            'selesai cek status penghapus
   
              'tampilkan (anggap saja output)
              MsgBox "Nilai lVarStatic sekarang " & lVarStatic

     End Sub

  • Buat prosedur penghapus variabel static yang ada di dalam prosedur bernama ProsedurBerStaticVariabel :
     Public Sub PenghapusStatic()
         'set status hapus dengan TRUE untuk hapus static
         bHapusStatic = True
   
         'jalankan prosedur yang memiliki variabel static yang akan dihapus
         'untuk melakukan reset nilai variabel static

         ProsedurBerStaticVariabel
   
         'kembalikan status hapus ke FALSE (tidak perlu hapus static lagi)
         bHapusStatic = False
     End Sub

  • Jalankan prosedur ProsedurBerStaticVariabel berkali-kali, kemudian jalankan prosedur PenghapusStatic.
Kunci dari rangkaian variabel scope module dan kedua prosedur di atas adalah dibagian pengkondisian dengan IF di dalam prosedur ProsedurBerStaticVariabel. Bagian ini yang menjadi pengatur alur proses. Prosedur PenghapusStatic adalah saklar pemicu (trigger) untuk dilakukannya proses reset nilai dalam variabel static. Ketika keadaan normal, yaitu saat nilai dalam bHapusStatic adalah FALSE atau prosedur ProsedurBerStaticVariabel dijalankan bukan dari prosedur PenghapusStatic, maka proses akan mengalir ke daerah ELSE. Saat prosedur PenghapusStatic dijalankan, maka nilai bHapusStatic akan menjadi TRUE dan ProsedurBerStaticVariabel yang dijalankan melalui prosedur PenghapusStatic akan mengalir ke bagian IF dengan kondisi TRUE, yaitu ke baris kode program yang berbunyi lVarStatic = 0.

Konstanta

Konstanta dibentuk dengan keyword Const dengan scope level minimal adalah scope level Module. Konstanta bersifat read only ketika sedang digunakan. Nilai dalam konstanta ditetapkan saat deklarasi konstanta. Deklarasi konstanta diletakkan pada area General Declaration.

Syntax deklarasi-nya adalah :
     scope CONST nama_konstanta AS datatype = nilai_konstanta
Contoh deklarasi konstanta :
     Public Const sUser As String = "Kid"
     Private Const curPersen As Currency = 0.15
     Private Const lBlokData As Long = 3

Sifat read only membuat nilai dalam konstanta bernama sUser, curPersen, lBlokData tidak dapat diubah dalam proses layaknya sebuah variabel.

User Defined Type (UDT)

User Defined Type (UDT) adalah datatype yang dibentuk oleh pemrogram. Sebuah UDT bisa berisi banyak elemen variabel dengan datatype setiap elemen bisa berbeda-beda. Keyword yang digunakan adalah Type. Deklarasi UDT diletakkan di area General Declaration sebelum baris-baris deklarasi variabel yang menggunakan UDT tersebut sebagai datatype-nya.

Syntax deklarasi pembuatan UDT adalah :
     Public|Private TYPE nama_udt
         variabel1 AS datatype
                 .
                 .

         variabelN AS datatype
     End Type


Contoh deklarasi UDT (letakkan di area general declaration sebelum baris-baris deklarasi variabel) :
     Public Type uCustomer
         sNama As String
         sAlamat As String
         lPoint As Long
         dtJoin As Date
     End Type

Variabel yang akan menggunakan UDT harus dideklarasikan dengan datatype berupa nama UDT yang ada. Scope level dari variabel pengguna UDT sama seperti variabel lainnya. Contoh deklarasi variabel dengan datatype menggunakan UDT uCustomer :
     Public udtCustAktif As uCustomer
Contoh prosedur yang menggunakan variabel udtCustAktif yang ber-datatype UDT uCustomer : (fokus pada biru)
  Public Sub PakaiUDT()
    'isi nilai udtCustAktif
    udtCustAktif.sNama = "Kid"
    udtCustAktif.sAlamat = "Jakarta"
    udtCustAktif.dtJoin = #6/22/2013#
    udtCustAktif.lPoint = 100


       'gunakan nilai dalam udtCustAktif
       MsgBox "udtCustAktif" & vbCrLf &
String(23, "-") & vbCrLf & "Nama" & _
         vbTab & vbTab & ": " & udtCustAktif.sNama & _
         vbCrLf & "Tanggal Join" & vbTab & ": " & udtCustAktif.dtJoin & vbCrLf & "Alamat" & vbTab & vbTab & _
         ": " & udtCustAktif.sAlamat & vbCrLf & "Poin sampai saat ini" & vbTab & ": " & udtCustAktif.lPoint
  End Sub
Script di atas sengaja tidak menggunakan blok With ... End With agar lebih mudah dipelajari. Cara menghapus nilai yang ada didalam sebuah UDT adalah dengan menghapus setiap nilai dalam elemen penyusunnya. Hal ini kadang terasa tidak praktis. Jika diperhatikan secara seksama, penggunaan UDT secara sekilas akan tampak seperti menggunakan sebuah object. Maka UDT bisa jadi langkah awal untuk mengarah ke penggunaan Class yang berfungsi sebagai blueprint sebuah object.


Insya Allah pembahasan berikutnya adalah tentang prosedur.









Thursday, July 4, 2013

BelajarVBA 003 - Scope seri 2

Coretan Mr. Kid
Perubahan yang besar diawali oleh setitik kebaikan penuh keikhlasan dan kebaikan yang setitik itu sering dianggap sepele kecuali bagi yang berpikir

Pembahasan tentang scope seri 2 ini adalah lanjutan dari seri 1. Bahasan adalah tentang keyword Public dan Friend serta cara sederhana dalam menata scope.


Public

Scope level project

Keyword Public dapat digunakan untuk deklarasi variabel ataupun prosedur. Deklarasi dengan Public akan memiliki scope level Project ketika dilihat dari sudut pandang bahwa VBAProject tersebut tidak membutuhkan kemampuan VBAProject lain. Pembahasan kita awali dengan menggunakan sudut pandang ini terlebih dulu.

File BelajarVBA001.xlsm akan kita gunakan untuk memudahkan dalam memahaminya keyword Public ini. Buka file BelajarVBA001.xlsm dan tambahkan (Insert) 2 buah Code Module, sehingga pada folder Modules akan ada Module4 dan Module5. Contoh penggunaan keyword Public adalah sebagai berikut :
  • Aktifkan Module4 dan tulis script berikut, dimulai dari area general declaration :
     'variabel dengan keyword Public
     Public dtTglBelajar As Date

     'prosedur dengan keyword Public
     Public Sub TentangPublic()
         'lihat isi variabel dtTglBelajar
         MsgBox "Nilai awal dtTglBelajar adalah " & dtTglBelajar
   
         'isi variabel dtTglBelajar dengan tanggal
         '22 Juni 2013 (Kopdar#1 BeExcel)
         dtTglBelajar = "2013-06-22"
   
         'lihat isi variabel dtTglBelajar
         MsgBox "Nilai sekarang dtTglBelajar adalah " & dtTglBelajar
     End Sub

  • Saat ini, variabel dtTglBelajar dan prosedur TentangPublic akan memiliki scope level Project. Keduanya bisa digunakan dimana saja didalam VBAProject secara langsung dan secara lugas. Prosedur TentangPublic adalah contoh prosedur Public yang ada dimodule yang sama dengan variabel dtTglBelajar. Prosedur TentangPublic dapat dijalankan tanpa error.
  • Sekarang, kita buat prosedur di Module5 yang berisi kode program untuk menjalankan prosedur TentangPublic dan pemakaian variabel dtTglBelajar yang ada di Module4. Prosedur yang ditulis di Module5 tersebut adalah :
     Public Sub PanggilTentangPublicModule4()
         'jalankan prosedur tentangpublic yang ada di Module4
         TentangPublic
   
         'isi variabel dtTglBelajar yang ada di Module4
         'dengan nilai tanggal hari ini
         dtTglBelajar = Date
   
         'tampilkan pesan nilai dtTglBelajar
         MsgBox "Nilai baru dtTglBelajar adalah " & dtTglBelajar
   
         'isi variabel dtTglBelajar yang ada di Module4
         'dengan nilai tanggal dan waktu saat ini
         dtTglBelajar = Now
   
         'tampilkan pesan nilai dtTglBelajar
         MsgBox "Nilai baru dtTglBelajar " & _
             "disertai waktu adalah " & dtTglBelajar
     End Sub

  • Prosedur Public bernama PanggilTentangPublicModule4 memiliki scope level project. Isi prosedur ini adalah kode-kode program yang membentuk suatu proses untuk menggunakan variabel dan prosedur public yang ada di Module4.

Scope level project dalam object module

Object module memiliki sifat tertutup yang sering disebut sebagai private module. Seluruh variabel dan prosedur yang ber-scope level Project atau yang menggunakan keyword Public di dalam private module, seperti dalam object module, tetap bisa digunakan dengan memanggil nama modulenya terlebih dulu. Contohnya seperti berikut ini :
  • Aktifkan object module bernama ThisWorkbook
  • Tulis script berikut ini, dimulai dari area general declaration :
     'variabel public dalam object module
     Public curOrder As Currency

     'prosedur public dalam object module
     Public Sub IsiOrder()
         curOrder = 1234567890
     End Sub

  • Variabel curOrder dan prosedur IsiOrder yang ada didalam module ThisWorkbook bisa digunakan oleh seluruh variabel atau prosedur yang ada dalam VBAProject tersebut, meskipun sifat object module bernama ThisWorkbook adalah sebagai private module.
  • Prosedur IsiOrder yang berisi kode untuk mengisi nilai ke dalam variabel curOrder dapat dijalankan dengan baik secara langsung dan secara lugas. Hal ini disebabkan karena prosedur IsiOrder dan variabel curOrder tinggal bersama-sama didalam module ThisWorkbook.
Prosedur yang ada diluar module ThisWorkbook bisa menggunakan prosedur IsiOrder atau variabel curOrder secara langsung, tetapi tidak secara lugas seperti prosedur yang ada didalam object module ThisWorkbook. Cara menggunakan prosedur IsiOrder atau variabel curOrder dalah dengan menyebut nama object modulenya terlebih dulu.
Contoh penggunaan prosedur atau variabel public yang ada di dalam sebuah object module adalah sebagai berikut :
  • Aktifkan Module5 dan buat prosedur berikut :
     Public Sub PanggilIsiOrderThisWorkbook()
         'lihat isi variabel curOrder yang ada di module ThisWorkbook
         MsgBox "Nilai Order awal adalah " & ThisWorkbook.curOrder
   
         'jalankan prosedur IsiOrder yang ada di module ThisWorkbook
         ThisWorkbook.IsiOrder
   
         'lihat isi variabel curOrder yang ada di module ThisWorkbook
         MsgBox "Nilai Order baru adalah " & ThisWorkbook.curOrder
   
         'isi nilai baru ke dalam variabel curOrder
         'yang ada di module ThisWorkbook
         ThisWorkbook.curOrder = 17
   
         'lihat isi variabel curOrder yang ada di module ThisWorkbook
         MsgBox "Nilai Order baru adalah " & ThisWorkbook.curOrder
     End Sub

  • Prosedur bernama PanggilIsiOrderThisWorkbook, yang ada di Module5, menggunakan variabel atau prosedur public yang ada dalam object module ThisWorkbook dengan cara memanggil nama object module-nya terlebih dulu. Variabel curOrder digunakan dengan cara ThisWorkbook.curOrder dan prosedur IsiOrder dijalankan dengan cara ThisWorkbook.IsiOrder.

Scope level global

Deklarasi dengan Public akan memiliki scope level Global ketika VBAProject tersebut membutuhkan kemampuan VBAProject lain. Makna scope level global didalam Excel VBA tidak sama seutuhnya dengan pengertian scope global pada bahasa pemrograman lain. Scope level global di dalam Excel VBA memiliki banyak syarat, antara lain adalah :
  1. VBAProject yang dibutuhkan harus terdaftar sebagai referensi
  2. Workbook tempat VBAProject yang dibutuhkan harus terbuka
  3. Workbook tempat VBAProjoct yang dibutuhkan tidak dapat ditutup selama VBAProject yang membutuhkan masih terbuka
Untuk memahami hal ini, mari kita siapkan media belajarnya. Ikuti langkah berikut :
  • Mengubah nama VBAProject milik BelajarVBA001.xlsm menjadi VBP_Belajar001 dengan cara :
  1. klik kanan nama projectnya (VBAProject) di Project Explorer
  2. pilih VBAProject Properties
  3. muncul dialog window Project Properties
  4. ganti nama project menjadi VBP_Belajar001
  5. tekan OK
  • Insert 2 buah code module, sehingga terbentuk 2 buah module baru bernama Module6 dan Module7
  • Ganti nilai properti (Name) object Sheet1 dengan shtBelajar1, dan nilai properti Name menjadi Belajar_1
  1. klik Sheet1 di Project Explorer
  2. lihat Properties Window
  3. ganti seperti gambar berikut :
  • Ke Workbook window (tekan ALT F11) dan simpan workbook BelajarVBA001.xlsm
  • VBP_Belajar001 akan tampak seperti gambar berikut :
  • Buat workbook baru (tekan ALT F N)
  • Hapus semua sheet kecuali Sheet1
  • Simpan workbook di folder BelajarVBA dengan nama file BelajarVBA002.xlsm dan Save as type sebagai Excel Macro-Enabled Workbook (.xlsm)
  • ke VBE (tekan ALT F11)
  • Ubah nama VBAProject milik BelajarVBA002.xlsm menjadi VBP_Belajar002
  • Insert 1 buah code module pada VBP_Belajar002
  • Ganti nilai properti (Name) milik Module1 di VBP_Belajar002 menjadi mod002
  • VBP_Belajar002 akan tampak seperti gambar berikut :


  • Menjadikan VBP_Belajar1 sebagai salah satu referensi bagi VBP_Belajar002
  1. klik VBP_Belajar002 -> menu Tools -> References
  2. centang VBP_Belajar001 -> tekan OK

  • Simpan workbook BelajarVBA002.xlsm
  • VBP_Belajar002 akan tampak menjadi seperti gambar berikut :

Sampai disini, VBP_Belajar002 membutuhkan VBP_Belajar001. Workbook BelajarVBA001.xlsm tidak dapat ditutup selama workbook BelajarVBA002.xlsm masih terbuka. Jika membuka workbook BelajarVBA002.xlsm, maka workbook BelajarVBA001.xlsm akan ikut terbuka.

Pada dasarnya, pada kondisi ini, seluruh variabel ataupun prosedur di dalam VBP_Belajar001 dapat diakses oleh VBP_Belajar002. Hal inilah yang disebut scope level global dalam Excel VBA. Scope level global dalam Excel VBA tidak utuh sama dengan pengertian scope global pada bahasa pemrograman lain karena VBP_Belajar001 tidak dapat mengakses apapun dari VBP_Belajar002, karena untuk bisa mengakses VBAProject lain membutuhkan proses penambahan referensi. VBP_Belajar001 tidak dapat menambahkan VBP_Belajar002 sebagai referensi karena VBP_Belajar001 sudah menjadi referensi bagi VBP_Belajar002.

Kita akan mencoba untuk memahami apa maksud sudut pandang tentang keyword Public bisa menghasilkan scope level global.

Tahap 1. Mengakses Module6 di VBP_Belajar001
  • Aktifkan Module6 di VBP_Belajar001 dan isi dengan script berikut :
     Public sVarPublicDiMod6 As String

     Public Sub ProcPublicDiMod6()
         MsgBox "Pesan dari prosedur public di Module6 " & _
                 "yang ada di VBP_Belajar001"
     End Sub

  • Variabel dan prosedur dengan keyword public tersebut pasti bisa diakses oleh seluruh prosedur di VBP_Belajar001 karena menggunakan keyword Public.
  • Aktifkan mod002 di VBP_Belajar002 dan tulis prosedur berikut :
     Public Sub PenggunaVBP_Belajar001_Module6()
         'mengisi variabel yang ada di Module6 VBP_Belajar001
         VBP_Belajar001.sVarPublicDiMod6 = "Tahap 1"
   
         'menjalankan prosedur yang ada di Module6 VBP_Belajar001
         VBP_Belajar001.ProcPublicDiMod6
     End Sub

  • Prosedur PenggunaVBP_Belajar001_Module6 yang ada di VBP_Belajar002 pada module mod002 dapat berjalan dengan baik. Hal inilah yang menjadi salah satu alasan untuk menggolongkan keyword Public bisa menghasilkan scope level global. Seluruh variabel atau prosedur dengan keyword public yang ada di Module6 pada VBP_Belajar001 bisa diakses secara langsung oleh module mod002 yang ada di VBP_Belajar002, layaknya mod002 ada di dalam VBP_Belajar001.

Tahap 2. Mengakses object module shtBelajar1 di VBP_Belajar001
  • Aktifkan shtBelajar1 di VBP_Belajar001 dan isi dengan script berikut :
     Public Sub ProcPublicDiSheet()
         MsgBox "Pesan dari prosedur public di sheet shtBelajar1 " & _
                 "yang ada di VBP_Belajar001"
     End Sub

  • Object module memiliki sifat yang tertutup sebagai sebuah private module. Module shtBelajar1 yang ada di VBP_Belajar001 termasuk jenis object module.
  • Aktifkan mod002 di VBP_Belajar002 dan tulis prosedur berikut :
     Public Sub PenggunaVBP_Belajar001_Sheet()
         'menjalankan prosedur yang ada di sheet shtBelajar1 VBP_Belajar001
         VBP_Belajar001.shtBelajar1.ProcPublicDiSheet
     End Sub

  • Prosedur PenggunaVBP_Belajar001_Sheet dapat dijalankan dengan baik. Karena shtBelajar1 termasuk object module, maka cara mengakses prosedur yang ada harus didahului dengan nama object module-nya.
  • Meskipun shtBelajar1 termasuk object module yang termasuk private module, tetapi bukan berarti object module dari Microsoft Excel Objects tidak bisa diakses secara global.

Tahap 3. Mengakses object module UserForm1 di VBP_Belajar001
  • Aktifkan code window UserForm1 yang ada di VBP_Belajar001 dengan cara klik kanan lalu pilih View Code.
  • Tulis script berikut :
     Public Sub ProcPublicDiUserForm1()
         MsgBox "Pesan dari prosedur public di UserForm1 " & _
                 "yang ada di VBP_Belajar001"
     End Sub

  • Object module UserForm1 yang ada di VBP_Belajar001 termasuk object module yang benar-benar sebagai private module. Jika prosedur ini dijalankan, maka akan menghasilkan error akibat tidak dikenalnya member bernama UserForm1 dalam VBP_Belajar001. Padahal prosedur atau variabel yang dideklarasikan menggunakan keyword public dalam UserForm1 di VBP_Belajar001 bisa digunakan oleh module lain yang ada di VBP_Belajar001.

Tahap 4. Membuat code module menjadi private module
Code module pada dasarnya adalah public module. Oleh sebab itu seluruh variabel atau prosedur yang dideklarasikan dengan keyword public akan dapat diakses secara langsung.
Code module bisa diubah menjadi sebuah private module yang karakteristiknya seperti object module UserForm1 alias private module yang sama sekali tidak dapat diakses secara global. Untuk mengubah code module menjadi private module adalah dengan menambahkan Option Private Module pada baris-baris awal area general declaration.
  • Aktifkan Module7 di VBP_Belajar001
  • Dibawah baris berbunyi Option Explicit, tambahkan baris berikut :
     Option Private Module
  • Kemudian tulis juga prosedur contoh berikut ini :
     Public Sub ProcPublicDiMod7()
         MsgBox "Pesan dari prosedur public di Module7 " & _
                 "yang ada di VBP_Belajar001"
     End Sub

  • Dengan kehadiran baris Option Private Module, maka Module7 di VBP_Belajar001 telah berubah menjadi sebuah private module yang tidak dapat diakses secara global atau tidak dapat diakses oleh VBAProject selain VBP_Belajar001.
  • Aktifkan mod002 di VBP_Belajar002 dan tulis prosedur berikut :
     Public Sub PenggunaVBP_Belajar001_Module7()
         'menjalankan prosedur yang ada di Module7 VBP_Belajar001
         'yang sudah diberi Option Private Module
         VBP_Belajar001.ProcPublicDiMod7
     End Sub

  • Jika prosedur PenggunaVBP_Belajar001_Module7 dijalankan, maka akan menghasilkan error akibat tidak dikenalnya member bernama ProcPublicDiMod7. Seperti halnya UserForm1, seluruh variabel dan prosedur di Module7 yang ada di VBP_Belajar001 ini bisa digunakan oleh modeul lain yang ada di VBP_Belajar001 meskipun Module7 telah diberi Option Private Module.
  • Opsi berupa Option Private Module hanya bisa digunakan pada Code Module saja.

Beberapa hal yang dapat disimpulkan dari cerita diatas adalah :
  1. Deklarasi dengan keyword Public bisa dikatakan pada dasarnya memiliki scope level global.
  2. Deklarasi dengan keyword Public menghasilkan scope level Project ketika tidak bekerja sama saling terkait dengan VBAProject lain.
  3. Deklarasi dengan keyword Public menghasilkan scope level Project ketika module yang menjadi wadahnya adalah module private seutuhnya.
  4. Object module dari Microsoft Excel Objects tidak sepenuhnya bersifat private. Variabel atau prosedur yang dideklarasikan public didalamnya harus diakses layaknya object module yang benar-benar bersifat sebagai private module, yaitu dengan menyebut object module-nya terlebih dulu.
  5. Object module UserForm termasuk object module yang sepenuhnya bersifat private module. Bisa jadi karena class pembangunnya memang mendefinisikan bahwa object yang terbentuk benar-benar sebuah private module.
  6. Code module pada dasarnya memiliki sifat sebagai public module.
  7. Code module bisa diubah menjadi bersifat private module menggunakan Option Private Module.


Friend
Pada pembahasan tentang keyword Public dibagian tentang scope level global telah diketahui bahwa object module seperti Sheet atau ThisWorkbook tetap dapat diakses secara global secara langsung. Hal ini akan mengakibatkan seluruh variabel atau prosedur yang dideklarasikan dengan keyword Public akan dapat diakses secara global juga.

Kadangkala beberapa variabel atau prosedur dalam object module seperti sheet ini ingin tetap dijaga agar hanya ber-scope level project saja. Deklarasi dengan keyword Friend digunakan untuk hal seperti ini. Jadi, keyword Friend hanya bisa digunakan pada object module dan tidak bisa digunakan di dalam code module. Keyword Friend menghasilkan scope level Project.

Untuk mendapatkan gambaran yang lebih nyata, coba lakukan hal berikut :
  • Aktifkan sheet shtBelajar1 yang ada di VBP_Belajar001 dan tulis prosedur berikut :
     Friend Sub ProcFriendDiSheet()
         MsgBox "Pesan dari prosedur friend di sheet shtBelajar1 " & _
                 "yang ada di VBP_Belajar001"
     End Sub

  • Penggunaan keyword Friend dalam deklarasi prosedur ProcFriendDiSheet akan menyebabkan prosedur tersebut memiliki scope level project.
  • Aktifkan mod002 di VBP_Belajar002 dan tulis prosedur berikut :
     Public Sub PenggunaVBP_Belajar001_Sheet_ProcFriend()
         'menjalankan prosedur yang ada di sheet shtBelajar1 VBP_Belajar001
         'yang dideklarasikan dengan keyword Friend
         VBP_Belajar001.shtBelajar1.ProcFriendDiSheet
     End Sub

  • Prosedur PenggunaVBP_Belajar001_Sheet_ProcFriend akan menghasilkan error jika dijalankan. Error tersebut berupa tidak dikenalinya member bernama ProcFriendDiSheet didalam sheet shtBelajar1.


Menata Scope
Penataan scope pada dasarnya adalah memilih keyword yang sesuai agar didapatkan scope level yang juga sesuai dengan jenis prosesnya. Cara sederhana dalam menata scope pada umumnya adalah sebagai berikut :
  1. Variabel yang hanya digunakan dalam sebuah prosedur dan tidak perlu menyimpan nilai untuk digunakan dalam prosedur lainnya diatur untuk memiliki scope level procedure dengan menggunakan keyword Dim. Contohnya adalah variabel-variabel untuk proses perulangan (loop).
  2. Variabel atau prosedur yang digunakan oleh prosedur-prosedur yang ada dalam module tersebut saja dan tidak pernah digunakan oleh prosedur di module lainnya diatur untuk memiliki scope level module dengan menggunakan keyword Private. Contohnya adalah variabel penyimpan indeks option button yang dipilih user dalam sebuah userform. Dari sekian banyak option button yang menjadi pilihan dalam userform, hanya akan ada satu option button yang bernilai TRUE. Dengan menyimpannya dalam bentuk nomor indeks disuatu variabel, maka proses validasi input data sebelum proses save tidak membutuhkan pemeriksaan terhadap nilai setiap option button. Contoh lainnya adalah prosedur event dari suatu object module seperti userform atau sheet, karena event terjadi hanya pada module tersebut saja.
  3. Variabel atau prosedur yang akan secara aktif dapat digunakan oleh berbagai proses dalam program yang sedang dibangun diatur untuk memiliki scope level project atau global dengan menggunakan keyword Public.
  4. Ketika VBAProject dalam kondisi dapat dipergunakan oleh VBAProject lain, maka seluruh variabel atau prosedur yang hanya akan digunakan untuk proses secara lokal di dalam VBAProject tersebut diatur untuk memiliki scope level Project saja. Hal ini bisa diatur dengan berbagai cara, seperti penggunaan module yang diberi Option Private Module pada module-module berjenis Code Module, atau menggunakan keyword Friend pada object module seperti ThisWorkbook, Sheet, atau Chart.
  5. Khusus untuk object module berupa class module dan VBAProject akan dipergunakan oleh VBAProject lain, pengaturan tambahan pada properti bernama instancing maupun pemilihan penggunaan keyword friend akan membuat class tersebut bisa bersifat private ataupun public, sesuai kaidah class dalam Excel VBA.

Catatan
  • Deklarasi prosedur dalam VBA memiliki keyword default berupa Public. Jadi, jika sebuah prosedur tidak dinyatakan secara jelas keyword penentu scope level-nya, maka akan dinyatakan sebagai scope level yang menggunakan keyword Public. Meskipun ada kemudahan default seperti ini, sebaiknya tetap didisiplinkan untuk menuliskan keyword Public ketika akan mendeklarasikan suatu prosedur yang ingin dideklarasikan sebagai public atau sebagai prosedur yang memiliki scope level yang dihasilkan oleh keyword Public. Hal ini akan memudahkan pembacaan kode-kode program ketika sudah ada banyak prosedur dalam suatu module.
  • Mendeklarasikan variabel atau prosedur yang benar-benar bersifat global dalam Excel VBA tetap dimungkinkan. Jadi, seluruh VBAProject bisa menggunakan variabel atau prosedur tersebut tanpa perlu menambah referensi. Hal ini dapat dilakukan dengan bantuan fungsi-fungsi API (Application Programming Interface).

Sekian saja bahasan tentang scope yang sangat panjang ini (2 seri). Semoga bahasan ini bisa menjadi pijakan awal untuk membangun suatu aplikasi yang lebih baik. Minimal bisa menyusun suatu proses otomasi yang lebih baik. Harapannya, dengan bahasan ini, maka penataan scope level setiap variabel dan prosedur akan lebih sesuai kebutuhan setiap proses yang dibangun.

Insya Allah bahasan berikutnya adalah tentang DataType. Bahasan lain yang sangat jarang disentuh secara serius oleh para pembelajar VBA.


Wednesday, July 3, 2013

Koleksi Macro Dasar Excel

Tulisan berikut ini merupakan terjemahan dari http://www.panzerbasics.com/index_files/97-excel/basic-macros.htm

Sebagai pemrogram VBA pemula, saya perlu mengumpulkan macro yang saya buat atau temukan. Menaruhnya di Internet hanyalah sebuah langkah lanjutan kecil.

Jika anda menjalankan sebuah macro, aksinya tidak bisa dibatalkan. Menggunakan macro yang disediakan di sini adalah urusan anda sendiri.

Camkanlah bahwa macro bisa sangat bermanfaat, namun juga bisa berbahaya jika berasal dari sumber yang tidak dikenal.

Code-code macro dasar berikut ini berasal dari seantero Internet atau dibuat oleh saya sendiri. Oleh karena sangat umum dan dasar, saya tidak mencantumkan sumbernya. Jika seseorang mengenalnya sebagai buatannya dan ingin namanya dicantumkan atau code dihapus, silahkan menghubungi saya.



Macro yang disediakan berikut ini adalah pilihan saya dan bisa digunakan sebagai permulaan atau untuk membantu anda pada proyek-proyek dasar. Gunakan imajinasi anda untuk menyesuaikannya dengan proyek anda, atau lakukan pencarian lebih lanjut di Internet.

Code-code sudah saya coba dan verifikasi untuk dijalankan pada Excel 2007. Harap diingat bahwa kita bisa mencapai suatu tujuan dengan cara yang berbeda.

Macro umumnya dimulai dengan baris: "Sub Name()", dimana Name bisa diganti dengan nama yang ingin anda gunakan. Macro diakhiri dengan baris "End Sub".

Untuk kejelasan dan kemudahan dalam pemakaian yang berbeda, saya tidak mencatumkan baris-baris ini lagi kecuali untuk alasan tertentu.

Jika "Sub" diganti dengan "Function", code akan berjalan sama saja, namun macro tidak tampak pada daftar macro yang tersedia. Kelemahan cara ini adalah function akan tampak dalam daftar function. Jika "Private" ditambahkan sebelum "Sub" atau "Function", macro hanya bisa dipanggil dari module yang sama, dan juga tidak muncul dalam daftar.

Activate Sub Worksheet_Activate()
MsgBox "Hello"
End Sub
Active Cell, Position myRow = ActiveCell.Row
myCol = ActiveCell.Column
MsgBox myRow & "," & myCol
Active Cell, Selection to far left Selection.End(xlToLeft).Select

OR

Range("A" & ActiveCell.Row).Select
Active Cell in top left of screen With ActiveWindow
.ScrollColumn = ActiveCell.Column
.ScrollRow = ActiveCell.Row
End With
Active Cell, Value MsgBox ActiveCell.Value
Auto Run Sub Auto_Open()
MsgBox "Hello"
End Sub
Auto Run(2) Sub Workbook_Open()
MsgBox "Hello"
End Sub
Auto Save This workbook: ' = Autorun
Sub Workbook_Open()
Call SaveMe
End Sub

In Module:
Sub SaveMe()
ThisWorkbook.Save
Application.OnTime Now + Timeserial(0,15,0),"SaveMe" ' Timeserial=(h,m,s)
End Sub
Available Row (next) Range("a65536").End(xlUp).Offset(1, 0).Select
 
Call -
Running a subroutine
Call Macro2  'This calls for Macro2 to run within your Macro
Case Title Dim cell As Range
For Each cell In Selection.Cells
If cell.HasFormula = False Then
cell = Application.Proper(cell)
End If
Next
Case Upper / Lower Dim cell As Range
For Each cell In Selection.Cells
If cell.HasFormula = False Then
cell = UCase(cell)
End If
Next
 
Column Letters Dim MyColumn As String, Here As String
Here = ActiveCell.Address
MyColumn = Mid(Here, InStr(Here, "$") + 1, InStr(2, Here, "$") - 2)
MsgBox MyColumn
Counting Rows & Columns myRows = Selection.Rows.Count
myColumns = Selection.Columns.Count
MsgBox "Rows = " & myRows & vbCrLf & "Colums = " & myColumns
Carriage Return MsgBox "Line 1" &  vbCrLf & "Line 2" 
Copy Range (1) Sheet1.Range("A1:C1").Copy Destination:=Sheet2.Range("A1")
Copy Range (2) Range("A1:B1").Copy
Range("A2").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Counter Range("A1") = Range("A1") + 1

OR

myCount = Range("a1") + 1
Range("a1") = myCount
Current Date Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Range("A1") = Now
End Sub
Delete Empty Rows firstRow = Selection.Row
lastRow = Selection.Row + Selection.Rows.Count
 For rownumber = lastRow To firstRow Step -1
  If Application.WorksheetFunction.CountA(Rows(rownumber)) = 0 _
   Then Rows(rownumber).Delete
 Next rownumber
Error Trapping On Error Resume Next

OR

Sub Name()
On Error Goto ErrorHandler1
... more lines of code
Exit Sub
ErrorHandler1:
... code specifying action on error
End Sub
File Name & Path Range("A1") = Application.ActiveWorkbook.FullName
For, Next Loop  
Goto (Code)  
Input Box Dim MyInput
MyInput = InputBox("Enter something")
Range("A1") = MyInput
If, Then Statement If Range("B1") > 10 Then
   Range("B2") = 10
ElseIf Range("B2") > 5 Then
   Range("B2") = 5
Else
   Range("B2") = 1
End If
Joining Text myCol = Selection.Columns.Count - 1
n = 0
   For n = 0 To Selection.Rows.Count - 1
      For i = 1 To myCol
         ActiveCell.Offset(n, 0) = ActiveCell.Offset(n, 0) & ActiveCell.Offset(n, i)
         ActiveCell.Offset(n, i) = ""
      Next i
   Next n
Message Box MsgBox "Created by: Your Name here"
MsgBox "Different Icon", vbInformation
MsgBox "Different Icon And Title", vbExclamation, "Your warning message"
Modeless Forms UserForm.show vbModeless
Moving the Cursor ActiveCell.Offset(1, 0).Select
Protecting / Unprotecting a sheet 'Protect
Dim Password
Password = "xxxx"
ActiveSheet.Protect Password, True, True, True

'Unprotect
Password = "xxxx"
ActiveSheet.Unprotect Password
Random numbers MyNumber = Int((10 - 1 + 1) * Rnd + 1)
Range("A1") = MyNumber
Rounding Numbers ActiveCell = Application.round(ActiveCell, 2)
Saving your Workbook ActiveWorkbook.Save
ScreenUpdating Application.ScreenUpdating = False / True
Select Case statement Select Case Range("A1").Value
   Case 100, 150 ' = 100 OR 150
      Range("B1").Value = Range("A1").Value
   Case 200 To 300, 400 To 500 ' = Between 200 and 300 OR between 400 and 500
      Range("B2").Value = Range("A1").Value
   Case Else
      Range("B1").Value = 0
End Select
Select Data Range Dim myLastRow As Long
Dim myLastColumn As Long
Range("A1").Select
 On Error Resume Next
    myLastRow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
    myLastColumn = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
myRange = "a1:" & Cells(myLastRow, myLastColumn).Address
Range(myRange).Select
Sheets Hiding Sheet1.Visible = xlSheetVeryHidden
Text Edit MsgBox Left("abcd", 2)       'Displays 2 characters from Left
MsgBox Right("abcd", 2)    'Displays 2 characters from Right
MsgBox Len("abcd")           'Displays number of characters (Including space)
Timer Application.Wait Now + TimeValue("00:00:05")
MsgBox ("This was a 5 second delay")
Time last save MsgBox Excel.Application.ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
vbYesNo YesNo = MsgBox("This macro will ... Do you want to continue?", vbYesNo + vbCritical, "Caution")
Select Case YesNo
Case vbYes
'Insert your "Yes" code here.
Case vbNo
'Insert your "No" code here.
End Select

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 :


Monday, July 1, 2013

BelajarVBA 002 - Gimana sih cara nulis kode itu ?

Coretan Mr. Kid

Sabar adalah pintu gerbang ilmu

Kali ini kita akan membahas hal terakhir tentang hal-hal yang mendasar yang sering dipelajari sambil lalu oleh sebagian besar pembelajar VBA.

Kode yang dimaksud dalam judul adalah kode pemrograman (programming code). Agar lebih mudah dipahami, mari kita siapkan arena bermainnya.
  1. Buat sebuah workbook baru dan simpan dengan format Excel Macro-Enabled Workbook (.xlsm) didalam folder BelajarVBA yang pernah dibuat.
  2. Beri nama sesukanya, tetapi usahakan untuk bisa dengan mudah menemukan file hasil uji coba dari setiap coretan.
  3. Buka VBE dengan menekan ALT F11
  4. Buat sebuah module dengan menu Insert -> pilih Module
  5. Buat lagi sebuah module dengan menu Insert -> pilih Module
  6. Buat sebuah UserForm dengan menu Insert -> UserForm
  7. Aktifkan Module1 dengan double click Module1 yang ada di Project Explorer
  8. Simpan file dengan menekan CTRL S

Kode program diletakkan pada sebuah object class yang sesuai kebutuhan. Penulisan kode program dilakukan di dalam code window.




Peringatan !!! 

  • Silakan dicoba sendiri dikomputer agar lebih terasa gurihnya. 
  • Jika bertemu dengan kode program, terutama yang berupa kode program berbaris-baris, maka ketiklah daripada melakukan Copy Paste. Bisa jadi proses copy paste justru akan lebih memungkinkan muncul error.

Option Explicit

Option Explicit adalah pernyataan bahwa setiap penggunaan variabel akan didahului dengan adanya baris deklarasi variabel. Pernyataan Option Explicit selalu diletakkan di baris pertama setiap code window. Option Explicit bisa diatur agar selalu secara default disematkan oleh VBE disetiap code window ketika code window tersebut dibentuk pertama kali. Pengaturan tersebut adalah dengan mencentang item Require Variable Declaration yang ada dalam tab Editor di sub menu Options pada menu Tools.

Procedure

Prosedur adalah sebuah blok berisi suatu kode program yang bertujuan untuk melakukan sesuatu. Sebuah blok prosedur memiliki bentuk dasar yang terdiri dari 3 hal yang selalu tetap urutannya, yaitu :
  1. baris deklarasi prosedur sebagai awal blok prosedur
  2. area baris-baris kode program
  3. baris pernyataan akhir prosedur sebagai akhir blok prosedur

Gambar di atas adalah contoh sebuah prosedur.
1. baris deklarasi prosedur
Bunyi baris deklarasi prosedur pada gambar adalah :
         Public Sub ProsedurPertama()
yang terdiri dari :
  1. Scope (area kerja) yang berupa kata Public
  2. Jenis prosedur yang berupa kata Sub
  3. Nama prosedur yang berupa kata ProsedurPertama()
Ketiga hal diatas adalah bentuk tersederhana dalam deklarasi prosedur. Jadi, setiap deklarasi prosedur, minimal akan selalu berisi 3 hal tersebut, yaitu : scope, jenis prosedur, nama prosedur.

2. area baris-baris kode program
Seluruh baris-baris kode perintah diletakkan diarea ini seperti dalam contoh tersebut di atas. Pemberian indent (memasukkan area ini lebih kedalam daripada baris deklarasi prosedur) dimaksudkan untuk memudahkan pembacaan kode program. Dengan susunan demikian, maka dengan mudah akan diketahui mana saja yang berupa baris deklarasi prosedur dan mana saja yang berupa baris-baris kode program.

Pemberian indent juga sebaiknya dilakukan ketika ada baris-baris program yang membentuk sebuah blok, seperti blok IF, blok loop (perulangan), blok With, dan sebagainya. Hal ini dimaksudkan agar pembacaan kode akan lebih mudah, terutama dalam menemukan batas-batas suatu blok perintah.

Pada gambar di atas, baris kode yang diproses adalah yang berbunyi :
         MsgBox "Belajar VBA bersama Belajar-Excel"

3. baris pernyataan akhir prosedur
Baris ini selalu memiliki bentuk yang tetap yaitu diawali dengan End yang diikuti dengan jenis prosedur. Pada contoh prosedur yang ada dalam gambar, baris pernyataan akhir prosedur adalah berbunyi :
         End Sub
Karena pada baris deklarasi prosedur dinyatakan bahwa jenis prosedur adalah Sub, maka baris pernyataan akhir prosedur adalah End Sub.

Baris akhir pernyataan prosedur akan otomatis dibuatkan oleh VBE ketika baris deklarasi prosedur selesai dibentuk, yaitu ketika menekan tombol Enter saat ada dibaris deklarasi prosedur. Kadangkala, baris akhir pernyataan terhapus akibat kegiatan pemrogram. Ketika kursor berada diakhir baris deklarasi prosedur kemudian terjadi penekanan tombol Enter, maka baris pernyataan akhir prosedur akan dibuatkan tepat 2 baris setelah baris deklarasi prosedur. Hal ini akan menyebabkan seluruh kode yang telah dibuat untuk prosedur tersebut menjadi berada diluar prosedur. Disinilah salah satu keuntungan dari pemberian indent pada area baris-baris kode program, karena akan dengan mudah menemukan baris terakhir kode program untuk prosedur tersebut.

Menjalankan Procedure

Pada umumnya (karena ada bentuk deklarasi prosedur tertentu yang tidak dapat dijalankan dengan cara yang akan dijelaskan ini), cara menjalankan prosedur yang telah dibuat adalah dengan meletakkan kursor didalam prosedur kemudian menekan tombol F5. Tombol F5 setara dengan menekan menu item Run Sub/UserForm yang ada di menu Run. Juga setara dengan menekan tombol dengan icon play yang ada didalam toolbar standard atau toolbar debug.

Prosedur jenis Sub yang bisa dijalankan dari ribbon Developer tombol Macro di workbook window hanyalah yang terdaftar didalam dialog window Macro saja. Prosedur jenis Function, yang sering disebut UDF (User Defined Function), yang bisa digunakan dalam cell layaknya fungsi-fungsi bawaan Excel (Built-In-Function) hanyalah jenis prosedur Function dengan scope (area kerja) Public.

Baris kode

Baris kode adalah sebuah baris program yang berisi perintah kepada komputer untuk melakukan sesuatu. Jadi, yang diproses selalu baris per baris dalam sebuah prosedur.

Dengan demikian, sangatlah jelas berbeda antara baris program dan baris penulisan. Baris program pastilah selalu satu baris. Satu baris program ini bisa ditulis dalam beberapa baris penulisan dan ada kemungkinan beberapa baris program ditulis dalam satu baris penulisan.

Dalam penulisan baris program, terdapat beberapa karakter khusus yang penuh arti, antara lain :
  • karakter petik satu ( ' ) yang berarti bahwa mulai dari karakter tersebut adalah suatu keterangan yang tidak perlu diproses
  • karakter underscore ( _ ) yang berarti sebagai pindah baris penulisan untuk satu baris program tersebut. Artinya, satu baris program akan ditulis dalam beberapa baris penulisan.
  • karakter titik dua ( : ) yang berarti akhir baris program, sehingga bisa disambung dengan baris program berikutnya. Artinya, dalam satu baris penulisan akan terdapat beberapa baris program.
Contoh prosedur yang berisi karakter-karakter khusus di atas :
Public Sub KarakterKhususBarisProgram()

    Dim iLoop as Integer    'deklarasi variabel loop bertipe integer

    'baris ini juga contoh penggunaan karakter petik satu ( ' )

    'baris berikut ini adalah contoh penggunaan underscore ( _ )
    MsgBox _
           "Belajar VBA bersama Belajar-Excel"

    'baris berikut ini adalah contoh penggunaan karakter ( : )
    For iLoop=1 To 8 Step 2: MsgBox "iLoop bernilai " & iLoop: Next iLoop

End Sub

Pada prosedur diatas, 
bagian 1 :
teks berbunyi
   'deklarasi variabel loop bertipe integer
dan
   'baris ini juga contoh penggunaan karakter petik satu ( ' )
tidak diproses karena telah didahului adanya karakter petik satu


bagian 2 :
teks berbunyi
    MsgBox _
           "Belajar VBA bersama Belajar-Excel"
yang tampak sebagai 2 baris, sejatinya adalah satu baris program yang ditulis dalam dua baris penulisan. Keberadaan karakter underscore ( _ )setelah MsgBox menjadi tanda bahwa baris program tersebut masih berlanjut ke baris penulisan berikutnya.

bagian 3 :
teks berbunyi
    For iLoop=1 To 8 Step 2: MsgBox "iLoop bernilai " & iLoop: Next iLoop
yang tampak sebagai 1 baris, sejatinya adalah 3 baris program yang ditulis dalam satu baris penulisan.

Keberadaan karakter titik dua setelah Step 2 menjadi tanda bahwa baris program mulai dari For telah selesai sampai di Step 2 yang kemudian disambung oleh baris program berikutnya yang diawali oleh MsgBox. Baris program yang diawali oleh MsgBox akan berakhir di & iLoop karena hadirnya kembali karakter underscore, dan akan disambung dengan baris program berikutnya yang berbunyi Next iLoop.

Penulisan baris-baris program seperti ini sebaiknya dihindari. Akan jauh lebih mudah dibaca jika ditulis :
    For iLoop=1 To 8 Step 2
        MsgBox "iLoop bernilai " & iLoop
    Next iLoop
karena tampak jelas kehadiran blok loop dengan For mulai dari kata kunci For hingga kata kunci Next.

Setiap kali menekan tombol Enter, maka VBE akan memeriksa cara penulisan (syntax) baris kode, sehingga bisa segera diketahui letak kesalahan penulisannya. Jika terjadi kesalahan penulisan, maka baris tersebut akan berubah warnanya menjadi warna Syntax Error Text Foreground (menu Tools -> Options -> tab Editor Format -> area Code Colors -> item Syntax Error Text). Ketika item Auto Syntax Check tercentang (menu Tools -> Options -> tab Editor), maka saat terjadi kesalahan penulisan baris kode akan muncul sebuah kotak pesan.


Sampai disini, seluruh materi perkenalan yang sangat banyak itemnya dan panjang sudah selesai. Semoga sudah merasa lebih nyaman ketika memasuki VBE dan sudah tidak celingak-celinguk seperti ayam kehilangan induknya ketika mendengar kata VBA atau Macro. Setidaknya sudah mulai kenal dengan yang namanya prosedur. Sudah tahu (tapi jangan keminter sama yang belum tahu ya) tentang cara-cara menulis sebuah prosedur.

Mulai dari bahasan tentang prosedur di atas, Insya Allah perjalanan akan benar-benar memasuki area yang terkadang membuat pening dan terkadang membuat tertawa sendiri. Apalagi nanti ketika sudah memasuki pembahasan tentang prosedur dengan lebih detil dan mulai menyinggung masalah scope (yang juga sudah mulai dibisikkan di atas sana) atau mulai merambah variabel dan seterusnya.
 



    In-Memoriam Siti-Vi

    Bagi komunitas pemakai MS Excel di Indonesia, nama Siti-Vi mungkin tidak asing. Tokoh 'penolong' yang sangat murah dalam membantu pemakai MS Excel ini 'berada' di mana-mana dan selalu membantu orang (share ilmu Excel).

    Siti-Vi bukanlah milik milis belajar-excel saja, namun juga milik XL-Mania dan milis-milis Excel lainnya. Berikut ini testimoni pengasuh XL-Mania, Abimono, tentang Siti-Vi atau Setyowati Devi yang aslinya ternyata bernama  Mabrur Masyhud. Sangat menarik!!

     
    Mbah Mabrur dan tampilan lain tokoh Siti-Vi.


    Baca Selengkapnya >>