Showing posts with label Belajar VBA. Show all posts
Showing posts with label Belajar VBA. Show all posts

Sunday, February 23, 2014

BelajarVBA 102 - ComboBox 02

Coretan Mr. Kid

Isilah masa sehat dengan kebaikan sebelum tiba masa sakit.

Pada pembahasan tentang combobox yang lalu, sumber data merujuk ke suatu area range yang diisikan ke dalam combobox dengan memanfaatkan properti ListFillRange (combobox di dalam worksheet) atau RowSource (combobox di dalam userform). Properti ListFillRange akan membuat daftar dalam combobox menjadi terikat erat dengan sumbernya, sehingga pengubahan isi daftar tanpa mengubah sumber data tidak dimungkinkan. Pengubahan bisa dilakukan bila yang diubah adalah nilai-nilai dalam sumber data.

Bahasan kali ini masih akan menggunakan data sumber untuk combobox list dari suatu range. Hanya saja, kali ini pengisian daftar combobox dilakukan tanpa properti ListFillRange atau RowSource, tetapi menggunakan methods AddItem ataupun properti List dari combbox. Hal ini akan membuat daftar menjadi lebih terbuka untuk diubah isinya. Kadang kala pengubahan isi daftar juga dibutuhkan pada beberapa kasus.

File yang akan digunakan adalah BelajarVBA102_02.xlsm. Data yang digunakan diletakkan pada sheet bernama 'populate' dengan nama object di dalam VBProject adalah Sheet2. Data tersebut seperti gambar berikut :


ComboBox list berisi satu kolom

Kali ini, pembahasan combobox akan memanfaat userform. Pada bahasan tentang combobox berisi satu kolom ini, akan menggunakan userform bernama frmNomor2 seperti gambar berikut :
yang berisi object controls utama sebagai berikut :
  • Combobox bernama cboProd : combobox dengan list berisi satu kolom yang dibaca dari sheet bernama populate (object Sheet2) pada range A2:A5.
  • Textbox bernama txtListIndex : menampilkan nilai yang disimpan oleh properti ListIndex milik cboProd.
  • Textbox bernama txtText : menampilkan nilai yang disimpan oleh properti Text milik cboProd.
  • Textbox bernama txtValue : menampilkan nilai yang disimpan oleh properti Value milik cboProd.
Pada kasus ini, textbox digunakan untuk menampilkan data dan tidak mengijinkan user untuk bisa mengubah nilainya. Maka properti Locked milik seluruh textbox diset bernilai TRUE. Properti milik cboProd menggunakan nilai default setiap pembuatan object baru di sebuah userform, yang antara lain adalah :
  • BoundColumn dan ColumnCount bernilai 1
  • ColumnHeads bernilai FALSE
  • ColumnWidths, ControlSource, RowSource, Text, Value dalam keadaan kosong
  • ListWidth bernilai 0pt
  • TextColumn bernilai -1
Alur proses pada frmNomor2 adalah sebagai berikut :
  1. Saat frmNomor2 dimuat ke memori komputer, maka dilakukan pengisian item-item daftar pilihan combobox, yang dilanjutkan dengan manampilkan frmNomor2 kepada user. Artinya, proses pengisian dilakukan saat frmNomor2 sedang diinisialisasi ke memori komputer. Jadi, proses pengisian item ke combobox llist dilakukan pada sebuah event milik userform frmNomor2, yaitu event Initialize.
  2. Ketika user mengubah pada combobox cboProd, maka akan dilakukan proses penulisan nilai-nilai yang disimpan oleh properti ListIndex, Text, dan Value dari cboProd ke :
    • sheet bernama populate (Sheet2 di VBProject Explorer) pada range B13 sampai B15.
    • textbox control terkait, yaitu txtListIndex, txtText, dan txtValue
    Proses ini dilaksanakan saat user mengubah isi cboProd, yang berarti akan memicu event Change milik cboProd. Jadi proses dilakukan didalam event Change milik cboProd.
  3. Saat userform frmNomor2 ditutup oleh user, maka dilakukan pembersihan isi range B13 sampai B15 yang ada di sheet bernama populate. Proses ini terjadi saat ada permintaan penutupan userform oleh user, yang akan memicu event milik userform yang bernama QueryClose. Jadi, proses pembersihan isi range tertentu tersebut diletakkan di dalam event QueryClose milik userform.
Setelah desain userform frmNomor2 terbentuk dan alur proses terjabarkan dengan jelas, maka penulisan script VBA untuk setiap proses tersebut bisa dilakukan dengan tartil. Berikut ini langkah penulisan script VBA untuk contoh kasus di atas.
  1. Event Initialize milik userform frmNomor2
    Diisi dengan proses pengisian daftar untuk combobox cboProd dengan langkah penyusunan sebagai berikut :
    • Membuat blok prosedur sub event Initialize milik userform frmNomor2 dengan cara :
      • double click userform frmNomor2, sehingga muncul blok event Click milik userform frmNomor2
      • pada combobox prosedur (sudut kanan atas area penulisan script) -> pilih Initialize
      • letakkan cursor ke dalam blok prosedur sub event Initialize yang terbentuk
    • Mendeklarasikan variabel yang dibutuhkan selama proses pengisian Pengisian item list combobox cboProd bisa dilakukan dengan 2 (dua) cara, yaitu : (pilih salah satu)
      • Memanfaatkan methods AddItem dengan cara melakukan loop terhadap setiap item sumber data. Sumber data yang berada di sheet populate (object Sheet2) pada range A2:A5 membutuhkan variabel loop bertipe Range. Maka perlu pendeklarasian variabel tersebut, yang misalnya diberi nama rngCurrent. Baris kode deklarasi tersebut berbunyi :
        Dim rngCurrent As Range
      • Memanfaatkan properti List dengan cara menyediakan array seluruh item dari sumber data. Berarti, sumber data yang ada di sheet populate (object Sheet2) pada range A2:A5 dibaca dan disimpan sebagai sebuah array. Area range sebenarnya adalah suatu array dan tipe data yang memungkinkan dengan mudah untuk menyimpan array dari suatu range adalah tipe Variant. Maka perlu pendeklarasian variabel bertipe variant, yang misalnya diberi nama vSumber. Baris kode deklarasi tersebut berbunyi :
        Dim vSumber As Variant
    • Menyusun baris kode proses pengisian
      Sumber data di sheet populate (Sheet2) pada range A2:A5.
      • Jika memilih menggunakan methods AddItem, maka dibutuhkan proses loop terhadap setiap item dalam range A2:A5. Di dalam proses loop tersebut diisi proses penambahan item ke list milik combobox dengan methods AddItem. Baris-baris kode proses ini adalah :
        For Each rngCurrent In Sheet2.Range("a2:a5")
           cboProd.AddItem rngCurrent.Value
        Next rngCurrent
      • Jika memilih menggunakan properti List, maka dibutuhkan proses penyimpanan sumber data range A2:A5 menjadi array, yaitu ke dalam variabel vSumber. Kemudian array dalam variabel vSumber dimasukkan ke properti List. Baris-baris kode proses ini adalah :
        vSumber = Sheet2.Range("a2:a5")
        cboProd.List = vSumber
    • Bentuk akhir prosedur sub event Initialize menjadi :
      • Methods AddItem
        Private Sub UserForm_Initialize()
           Dim rngCurrent As Range

           For Each rngCurrent In Sheet2.Range("a2:a5")
              cboProd.AddItem rngCurrent.Value
           Next rngCurrent
        End Sub
      • Properti List
        Private Sub UserForm_Initialize()
           Dim vSumber As Variant

           vSumber = Sheet2.Range("a2:a5")
           cboProd.List = vSumber
        End Sub
  2. Event Change milik cboProd
    Diisi dengan proses penulisan ke lokasi target dengan langkah penyusunan sebagai berikut :
    • Membentuk blok prosedur sub event Change milik cboProd dengan cara double click object control combobox cboProd yang ada di dalam userform frmNomor2 dan meletakkan cursor di dalam blok prosedur yang terbentuk
    • Menulis nilai-nilai properti ListIndex, Text, dan Value secara berurutan ke :
      • Sheet populate pada range B13 sampai B15 dengan baris-baris kode :
        Sheet2.Range("b13").Value = cboProd.ListIndex
        Sheet2.Range("b14").Value = cboProd.Text
        Sheet2.Range("b15").Value = cboProd.Value
      • Object controls textbox txtListIndex, txtText, dan txtValue dengan baris-baris kode :
        txtListIndex.Text = cboProd.ListIndex
        txtText.Text = cboProd.Text
        txtValue.Text = cboProd.Value
    • Bentuk akhir blok prosedur sub event Change milik cboProd :
      Private Sub cboProd_Change()
         Sheet2.Range("b13").Value = cboProd.ListIndex
         Sheet2.Range("b14").Value = cboProd.Text
         Sheet2.Range("b15").Value = cboProd.Value

         txtListIndex.Text = cboProd.ListIndex
         txtText.Text = cboProd.Text
         txtValue.Text = cboProd.Value
      End Sub
  3. Event QueryClose milik userform frmNomor2
    Diisi dengan proses menghapus isi range B13 sampai B15 pada sheet bernama populate (object Sheet2), yang menjadi lokasi penulisan pada proses di dalam event Change milik cboProd. Langkah-langkah penyusunannya adalah sebagai berikut :
    • Membentuk blok prosedur sub event QueryClose milik userform frmNomor2 dengan cara :
      • double click userform frmNomor2
      • pada combobox daftar prosedur (pojok kanan atas area penulisan script) -> pilih QueryClose
      • letakkan cursor di dalam blok prosedur yang terbentuk
    • Menulis baris kode untuk menghapus isi range B13 sampai B15 di sheet populate (object Sheet2) yang berbunyi :
      Sheet2.Range("b13:b15").ClearContents
    • Bentuk akhir blok prosedur sub event QueryClose menjadi :
      Private Sub UserForm_QueryClose( _
                                Cancel As Integer _
                              , CloseMode As Integer)
         Sheet2.Range("b13:b15").ClearContents
      End Sub
Prosedur-prosedur di atas membentuk sebuah proses sederhana tentang pengisian item list combobox dan pengambilan nilai dari item terpilih ke suatu lokasi target (range tertentu ataupun object control tertentu).

ComboBox list multi kolom hanya menampilkan satu kolom

Kali ini, dibuat sebuah userform yang diberi nama frmNomor3 yang mirip dengan userform frmNomor2. Perbedaannya adalah penambahan textbox bernama txtCol2 untuk menampilkan nilai dari kolom ke-3 list combobox. Properti BoundColumn di-set bernilai 2 dan properti TextColumn di-set bernilai 1. Sedangkan properti ColumnCount tetap bernilai 1 karena hanya akan menampilkan satu kolom saja. Sumber data untuk list combobox diambil dari sheet populate (object Sheet2) pada area range A2:C5 (3 kolom). Bentuk userform frmNomor3 seperti gambar berikut :

> Proses pend-disable-an event pada userform

Kebutuhan untuk membaca nilai dari kolom list yang tidak ditunjuk oleh properti BoundColumn maupun TextColumn, seperti ingin mengambil nilai dari kolom list ke-3 [indeks kolom bernilai 2 = Column(2)] bisa memicu timbulnya error ketika nilai pada kolom yang dirujuk tersebut belum terdefinisikan. Contohnya adalah ingin mengambil nilai dari kolom ke-3, tetapi pada baris item tersebut baru 2 kolom saja yang didefinisikan.

Error seperti ini sering terjadi ketika proses pengambilan nilai pada suatu kolom list dilakukan pada event Change milik combobox terkait (misal pada event Change milik cboProd). Artinya, dibutuhkan sebuah proses untuk mengabaikan kerja prosedur sub event change pada saat mengubah isi list, karena tidak ada pengaturan untuk men-disable event milik userform. Cara men-disable event di suatu userform dalam VBA dilakukan dengan menggunakan variabel ber-scope module yang diperiksa oleh setiap prosedur sub event yang tidak ingin dijalankan dengan alasan tertentu.

Pada contoh kasus ini, proses pada event Initialize userform frmNomor3 bisa memunculkan error, karena proses pengisian list combobox akan memicu event Change milik cboProd. Untuk men-disable event, maka dibuat sebuah variabel bernama bEventTidakBolehJalan dengan scope module. Baris kode deklarasi variabel ini diletakkan pada area General Declaration (di baris pertama area penulisan script atau setelah baris berbunyi Option Explicit). Baris kode tersebut berbunyi :
   Private bEventTidakBolehJalan As Boolean

Pada event Change milik cboProd, yaitu dibaris pertama setelah baris deklarasi variabel diberi proses cek terhadap nilai variabel bEventTidakBolehJalan dengan bentuk baris kode :
   If bEventTidakBolehJalan Then
      Exit Sub
   End If
yang berarti, jika variabel bEventTidakBolehJalan sedang bernilai TRUE, maka proses langsung keluar dari prosedur alias tidak ada proses dalam prosedur event tersebut yang dilakukan.

Cara menggunakannya, pada prosedur yang salah satu prosesnya bisa memicu si event Change milik cboProd untuk dijalankan, seperti pada event Initialize milik userform frmNomor3, diberi baris kode untuk mengubah nilai variabel bEventTidakBolehJalan menjadi TRUE. Penempatannya adalah tepat sebelum proses yang memicu berjalannya event Change milik cboProd. Pada kasus ini, berarti baris kode berbunyi :
   bEventTidakBolehJalan = TRUE
diletakkan tepat sebelum proses pengisian item list cboProd di dalam prosedur sub event Initialize. Pada bagian akhir event Initialize, yaitu tepat sebelum keluar dari prosedur atau sebelum baris End Sub, diberi baris kode untuk mengembalikan nilai variabel bEventTidakBolehJalan menjadi FALSE. Baris kode tersebut berbunyi :
   bEventTidakBolehJalan = FALSE

> Proses pengisian multi kolom list dengan methods AddItem

Cara mengisi multi kolom list menggunakan methods AddItem memerlukan sebuah variabel penyimpan indeks baris list yang akan ditambahkan. Misalkan variabel ini diberi nama lCboIndex. Maka pada event Initialize diberi penambahan deklarasi variabel tersebut. Maka baris deklarasi variabel pada event Initialize menjadi :
   Dim rngCurrent As Range, lCboIndex As Long

Kemudian nilai lCboIndex di-set dengan nilai awal indeks baris list yang base-0, yaitu dengan nilai 0 seperti dengan baris berbunyi :
   lCboIndex = 0

Proses loop yang tadinya berbentuk :
   For Each rngCurrent In Sheet2.Range("a2:a5")
      cboProd.AddItem rngCurrent.Value
   Next rngCurrent

diubah menjadi :
   For Each rngCurrent In Sheet2.Range("a2:a5")
      cboProd.AddItem rngCurrent.Value  'pembuat item baru


      'pengisi kolom list ke-2 dan seterusnya
      cboProd.List(lCboIndex, 1) = rngCurrent.Offset(0, 1).Value
      cboProd.List(lCboIndex, 2) = rngCurrent.Offset(0, 2).Value

      'set nilai indeks baris list berikutnya yang akan diisi

      lCboIndex = lCboIndex + 1
   Next rngCurrent


> Proses pengisian multi kolom list dengan properti List

Jika menggunakan properti List, maka yang diubah adalah rujukan range yang tadinya merujuk ke A2:A5 menjadi merujuk ke A2:C5 (lihat bagian yang di-merah).
   vSumber = Sheet2.Range("a2:c5")

> Penambahan baris penulisan pada event Change cboProd

Pengambilan nilai kolom ke-3 (indeks kolom ke-2) dapat dilakukan dengan properti Column maupun properti List seperti yang telah dijelaskan pada coretan tentang combobox sebelum ini. Penulisan ke sheet populate pada kasus multi kolom list ini dilakukan ke range H18:H21, sehingga baris kode bagian penulisan ke sheet populate menjadi :
   Sheet2.Range("h18").Value = cboProd.ListIndex
   Sheet2.Range("h19").Value = cboProd.Text
   Sheet2.Range("h20").Value = cboProd.Value

   Sheet2.Range("h21").Value = cboProd.List(, 2)  'atau cboProd.Column(2)

Sedangkan pada penulisan ke textbox txtCol2 adalah dengan menambahkan baris kode :
   txtCol2.Text = cboProd.List(, 2)  'atau cboProd.Column(2)

Hasil akhir penyusunan script untuk userform frmNomor3 dapat dilihat pada file BelajarVBA102_02.xlsm.

Tambah, ubah, dan hapus item list combobox

> menambah sebuah item ke list combobox

Misalkan ada sebuah combobox bernama cboProd. Penambahan item list dilakukan dengan menggunakan methods AddItem dengan susunan :
   cboProd.AddItem nilai_baru, [indeks_posisi_penambahan]
Jika ingin menambahkan pada baris baru adalah dengan mengabaikan bagian [indeks_posisi_penambahan] seperti :
   cboProd.AddItem nilai_baru
Bagian nilai_baru adalah teks (bertipe String) yang akan menjadi nilai baru di kolom ke-1 (indeks kolom ke-0).
Contohnya adalah ingin menambahkan item baru 'X' di baris baru, maka baris kodenya adalah :
   cboProd.AddItem "X"
Jika item baru 'Y' ingin ditambahkan pada baris ke-1 list (indeks baris ke-0), maka baris kodenya adalah :
   cboProd.AddItem "Y", 0

Pada combobox dengan multi kolom list, maka bisa jadi dibutuhkan juga pengisian pada kolom ke-2 dan seterusnya (penambahan pada indeks kolom ke-1 dan seterusnya). Pengisian tersebut bisa dilakukan setelah ada penambahan item baru dengan methods AddItem di atas. Susunan penulisan item di kolom lain tersebut secara umum adalah :
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru

Misalkan ingin menambahkan item 'Z' pada baris baru dengan nilai kolom ke-2 bernilai 'Z01' dan nilai kolom ke-3 bernilai 'ZZ11P001', maka baris-baris kode penambahan tersebut adalah :
   cboProd.AddItem "Z"
   cboProd.List( cboProd.ListCount-1 , 1) = "Z01"
   cboProd.List( cboProd.ListCount-1 , 2) = "ZZ11P001"
Properti ListCount dipergunakan untuk mendapatkan jumlah item dalam list. Karena properti ListIndex menggunakan base 0 (indeks baris item pertama bernilai 0), maka nilai properti ListCount - 1 adalah indeks baris item terakhir yang ada. Pada kasus di atas, berarti pada baris item 'Z' yang baru saja ditambahkan di baris baru.

Sedangkan jika ingin menyisipkan (menambah item pada baris tertentu) item 'M' pada baris ke-1 (indeks baris 0) dengan nilai kolom ke-2 bernilai 'M78' dan nilai kolom ke-3 bernilai 'KL98P113', maka baris-baris kode penambahan tersebut adalah :
   cboProd.AddItem "M", 0
   cboProd.List( 0 , 1) = "M78"
   cboProd.List( 0 , 2) = "KL98P113"
Kadangkala, pemeriksaan posisi penyisipan perlu dilakukan, sehingga dapat dipastikan bahwa indeks baris penyisipan tidak lebih dari nilai properti ListCount. Nilai properti ListCount bisa diartikan juga sebagai indeks baris baru jika akan dilakukan penambahan data. Bentuk pemeriksaan tersebut adalah sebagai berikut :
'0 adalah indeks baris lokasi penyisipan dan bisa diganti dengan variabel tertentu
If cboProd.ListCount >= 0 Then 
   'proses penyisipan diletakkan disini
   cboProd.AddItem "M", 0
   cboProd.List( 0 , 1) = "M78"
   cboProd.List( 0 , 2) = "KL98P113" 
End If

> mengubah isi sebuah item yang ada di list combobox

Misalkan ada sebuah combobox bernama cboProd. Pengubahan isi sebuah kolom dalam list combobox dilakukan dengan memanfaatkan propeti List. Bentuk umum beris kodenya adalah :
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru
dengan syarat bahwa idxrow (indeks baris yang akan diubah isinya) kurang dari jumlah item (nilai properti ListCount). Biasanya, bentuk diatas disertai pemeriksaan terhadap indeks baris yang akan diubah isinya. Bentuk lengkapnya menjadi :
'idxrow adalah indeks baris yang akan diubah isinya
If idxrow < cboProd.ListCount Then
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru
End If

Misalkan akan mengubah isi kolom ke-3 (indeks kolom ke-2) pada item di baris pertama (indeks baris ke-0) menjadi 'GJ71P123', maka baris kodenya adalah :
If 0 < cboProd.ListCount Then
   cboProd.List(0, 2) = "GJ71P123"
End If

> menghapus isi list combobox

Misalkan ada sebuah combobox bernama cboProd. Jika akan menghapus seluruh isi list combobox, maka dapat menggunakan methods Clear. Baris kodenya adalah :
   cboProd.Clear

Jika yang akan dihapus adalah sebuah item di baris tertentu, maka dilakukan dengan menggunakan methods RemoveItem disertai indeks baris (base 0) yang akan dihapus. Bentuk umum baris kodenya adalah :
   cboProd.RemoveItem indeks_baris_yang_dihapus
Biasanya, penghapusan sebuah baris item dilakukan setelah diperiksa bahwa baris yang akan dihapus ada didalam list. Artinya, indeks baris yang akan dihapus (indeks_baris_yang_dihapus) kurang dari jumlah item list (nilai properti ListCount). Jadi bentuk umum menghapus sebuah item list combobox yang disertai pemeriksaan keberadaan baris yang akan dihapus adalah :
   If indeks_baris_yang_dihapus < cboProd.ListCount Then
      cboProd.RemoveItem indeks_baris_yang_dihapus
   End If
Misalkan ingin menghapus item di baris ke-4 (indeks baris ke-3), maka baris kodenya adalah :
   If 3 < cboProd.ListCount Then
      cboProd.RemoveItem 3
   End If

Contoh tentang penerapan penambahan item, pengubahan isi, dan penghapusan item bisa dilihat di file BelajarVBA102_02.xlsm pada userform bernama frmNomor4 yang bisa diaktifkan melalui tombol di sheet bernama 'sisip_ubah_buang'. Pada userform tersebut juga disertakan contoh pemanfaatan event Click milik object control Label yang bisa menjadi alternatif sebuah tombol seperti object control CommandButton.

:)

Insya Allah pembahasan berikutnya tentang object control ListBox pada properti yang tidak dimiliki oleh ComboBox, yaitu properti MultiSelect. Selain itu, juga akan dibahas tentang object control Label, khususnya pada pemanfaatan properti Caption dan MultiLine. Object control textbox juga memiliki properti MultiLine, tetapi ada properti PasswordChar yang bisa digunakan untuk me-masking inputan user pada control tersebut. Event KeyDown acapkali terasa bermanfaat ketika digunakan oleh textbox, seperti membatasi inputan untuk numerik saja atau karakter tertentu saja dan sebagainya. Event KeyDown pada textbox juga akan dibahas disana.


Saturday, February 22, 2014

BelajarVBA 102 - ComboBox 01

Coretan Mr. Kid

Sempatkan berbagi sebelum sempit.

Setelah sekian lama tak sempat, Alhamdulillah tiba juga masa sempat tersebut. Bahasan kali ini tentang ActiveX ComboBox. ActiveX Controls memiliki banyak properti dan event yang memudahkan pengaturan alur proses menampilkan sesuatu. Salah satu ActiveX Controls yang sering digunakan adalah ComboBox. File yang digunakan mendampingi coretan kali ini adalah BelajarVBA102_01.xlsm.



ComboBox

Object control ini dapat digunakan untuk menampilkan daftar pilihan kepada user. Daftar pilihan bisa disertai beberapa kolom tambahan yang dapat dijadikan sebagai informasi tambahan bagi user. Object control ini dapat digunakan di dalam Worksheet maupun di dalam UserForm.

Selain dengan cara memilih dari pilihan yang tersedia, user juga bisa menuliskan nama item yang dibutuhkannya pada suatu area penulisan layaknya menulis pada sebuah textbox. Jika yang ditulis user ada dalam daftar pilihan, maka combobox akan segera memilihkan item tersebut untuk user.

Jadi, combobox memiliki 2 bagian utama, yaitu :
  1. daftar pilihan
    • Pada umumnya, daftar ini ditampilkan bila user meng-click dropdown, tetapi pengaturan properti untuk hal ini bisa dilakukan pada properti bernama ShowDropButtonWhen
    • Daftar pilihan ditampilkan sebagai sebuah list yang mirip dengan control ListBox dan memiliki karakteristik (properti, methods, events) yang sebagian besar sama dengan listbox.
  2. penulisan nama item
    • Area penulisan ini memiliki karakteristik (properti, methods, events) yang sebagian besar sama dengan control TextBox.
    • Teks yang di-input akan membuat combobox berusaha mencari dan memilihkan item dari dalam daftar pilihan. Karakteristik pencarian dan pemilihan item yang dilakukan oleh combobox akibat inputan dapat diatur pada properti MatchEntry dan MatchRequired.
Data yang akan digunakan sebagai daftar pilihan dalam combobox adalah seperti gambar berikut :

Properti ListFillRange dan LinkedCell

Bahasan pertama adalah tentang combobox yang diletakkan di dalam sebuah worksheet (misal worksheet bernama list_fill_range). Ketika daftar item yang akan dipasang pada combobox berada di suatu area range, sebut saja pada range A2:A5 (lihat gambar data di atas dan anggap saja data tersebut ada di sheet list_fill_range), maka properti ListFillRange bisa memberi kemudahan. Pengisian daftar item dalam combobox bisa dilakukan dengan mengisi properti ListFillRange. Isi properti ListFillRange adalah alamat area range dari daftar item, seperti menuliskan teks berbunyi A2:A5. Properti dari combobox bisa dimunculkan ketika dalam keadaan Design Mode (lihat di ribbon Developer dan klik Design Mode). Cara menampilkan window properties dari si object adalah dengan klik kanan si object dan pilih Properties.

Setelah daftar terisi dan Design Mode telah di-off-kan, maka user bisa memilih sebuah item dari daftar yang ada. Pilihan user ini bisa dituliskan ke sebuah cell tanpa perlu script VBA dengan memanfaatkan properti bernama LinkedCell. Isian properti LinkedCell juga berupa alamat sebuah range. Misalkan, pada properti LinkCell diisi alamat range berbunyi B10. Setiap kali user memilih sebuah item dari combobox, maka pada cell B10 akan tertulis pilihan user tersebut. Ketika user mengosongkan pilihan atau menulis sesuatu dalam combobox yang tidak ada di dalam daftar, maka cell B10 akan berisi error value #N/A.

Gambar berikut ini adalah cuplikan dari sheet bernama list_fill_range pada file yang disebutkan di atas.

Jadi, properti :
  • ListFillRange : untuk mengisi daftar combobox atau listbox dari suatu area range.
  • LinkedCell : untuk mengikatkan properti Value milik object ke sebuah range.

Multiple Column dan Event Change

Pengaturan yang dilakukan pada properti combobox agar bisa menampilkan banyak kolom informasi tambahan adalah sebagai berikut :
  • ColumnCount : jumlah kolom yang ditampilkan pada list. Jadi, list bisa berisi lebih banyak kolom dibanding yang ditampilkan. Misalkan list berisi 8 kolom, tetapi hanya ditampilkan 5 kolom saja dengan mengisi ColumnCount dengan nilai 5.
  • ColumnHeads : status menampilkan header atau tidak (TRUE/FALSE) ketika sumber data dari suatu area range.
  • ColumnWidths : pengaturan lebar masing-masing kolom dalam satuan point (pt) yang dipisah karakter titik koma ( ; ), seperti 60pt;80pt;80pt untuk 3 kolom yang ditampilkan.
  • ListWidth : lebar list keseluruhan dalam satuan point (pt) ketika dimunculkan atau saat user mengklik dropdown combobox. Jika total lebar setiap kolom lebih dari ListWidth, maka akan dimunculkan horisontal scrollbar, seperti 220pt.
  • BoundColumn : indeks kolom yang akan dijadikan nilai bagi properti Value (base 1 -> kolom ke-1 mendapat nomor indeks kolom 1). Nilai 0 berarti menampilkan nilai ListIndex atau indeks baris item (base 0).
  • TextColumn : indeks kolom yang akan dijadikan nilai bagi properti Text (base 1 dan defaultnya -1 yang berarti sama dengan BoundColumn). Nilai 0 berarti menampilkan nilai ListIndex atau indeks baris item (base 0).
Properti LinkedCell (jika digunakan) hanya bisa mengambil sebuah nilai yang dimiliki oleh properti Value yang terikat dengan kolom yang ditentukan pada properti BoundColumn. Sedangkan jumlah kolom dalam list ada lebih dari satu, maka sangat besar kemungkinan akan menggunakan script VBA untuk mendapatkan nilai dari kolom-kolom yang ada. Beberapa properti yang bermanfaat dalam pengambilan nilai dari kolom-kolom yang ada dalam list sebuah combobox antara lain adalah :
  • ListIndex : indeks baris list yang terpilih dengan nilai -1 yang berarti tidak ada yang terpilih dan nilai 0 sebagai item di baris pertama dalam list (base 0 -> item ke-1 diberi indeks bernilai 0).
  • Text : nilai yang ditampilkan oleh combobox yang berasal dari indeks kolom yang ditentukan pada properti TextColumn (base 1 -> kolom ke-1 dalam list diberi indeks kolom bernilai 1)
  • Value : nilai yang disimpan oleh combobox yang berasal dari indeks kolom yang ditentukan pada properti BoundColumn (base 1).
  • Column( idxcol ) : merujuk pada indeks kolom ke-idxcol (base 0), seperti Column(1) merujuk ke indeks kolom 1 yang berarti merujuk pada kolom ke-2 dalam list.
  • List( idxrow , idxcol ) : merujuk pada baris item dengan indeks baris ke-idxrow (base 0) dan kolom dengan indeks kolom ke-idxcol (base 0). Nilai idxrow pada baris terpilih adalah sebesar nilai properti ListIndex.
Pada saat user memilih sebuah item dari list, maka event yang bekerja adalah event Change. Jadi, jika diharapkan agar setiap user mengganti pilihan akan terjadi suatu proses tertentu seperti penulisan nilai-nilai ke suatu lokasi target, maka event change bisa diisi dengan script VBA tentang alur proses tersebut. Event Change milik combobox dapat dibuat dengan melakukan double click pada object control ketika dalam keadaan Design Mode. Gambar berikut ini adalah cuplikan dari sheet bernama list_fill_range yang menjadi contoh combobox dengan multiple column dan disertai dengan proses penulisan nilai ke suatu range.
Pada gambar, properti ListFillRange diisi dengan A2:C5 dengan jumlah kolom yang ditampilkan adalah 3 (isi ColumnCount) diisi 3. Jadi, sumber data list adalah range A2:C5 (3 kolom) ditampilkan dalam list sebanyak 3 kolom juga (ditampilkan seluruhnya). Properti LinkedCell juga digunakan dengan merujuk ke range B30 yang akan mengambil nilai di kolom ke-2 karena isi properti BoundColumn adalah 2 yang berarti properti Value akan mengambil nilai yang ada di kolom ke-2.

Pemanfaatan event Change milik combobox adalah untuk menulis beberapa informasi tentang nilai-nilai properti tertentu dari item yang terpilih, seperti properti ListIndex yang ditulis pada cell B33, Text pada cell B34 yang nilainya berasal dari kolom ke-1 berdasar isi properti TextColumn yang bernilai 1, Value yang nilainya berasal dari kolom ke-2 dan menghasilkan nilai yang sama dengan cell B30 yang diisi oleh properti LinkedCell. Juga nilai dari kolom ke-3 yang diambil dari list combobox menggunakan properti Column dengan idxcol bernilai 2 (cell B36) atau dengan properti List dengan idxrow senilai dengan nilai properti ListIndex (karena bagian idxrow dikosongkan) dan idxcol bernilai 2 (cell B37).

Prosedur Sub pada event change combobox tersebut berbunyi sebagai berikut :
Private Sub cboProd2_Change()
    'tulis informasi tentang data terpilih
    Range("b33").Value = cboProd2.ListIndex     'ListIndex
    Range("b34").Value = cboProd2.Text          'Text
    Range("b35").Value = cboProd2.Value         'Value
    Range("b36").Value = cboProd2.Column(2)     'Column indeks 2 [base 0]=kolom ke-3
    Range("b37").Value = cboProd2.List(, 2)     'List indeks kolom 2 [base 0]=kolom ke-3
End Sub


ComboBox pada sebuah UserForm

ActiveX Control memang lebih sering digunakan dalam UserForm yang tampak lebih cantik. ComboBox dalam sebuah UserForm juga bisa diisi dengan suatu data yang disimpan pada suatu area range secara mudah melalui pemanfaatan properti RowSource. Properti RowSource pada combobox di dalam UserForm setara dengan properti ListFillRange pada ComboBox yang diletakkan dalam sebuah worksheet. Properti LinkedCell di combobox dalam worksheet setara dengan properti ControlSource pada combobox di dalam sebuah UserForm.

Misalkan dibuat sebuah UserForm bernama frmNomor1 yang diberi combobox dengan nama cboProd. Pada cboProd, diatur dengan properti :
  • RowSource : berisi teks berbunyi list_fill_range!A2:C5
  • ColumnCount : berisi 3
  • ColumnHeads : TRUE
  • BoundColumn : berisi 2
  • ControlSource : berisi teks berbunyi list_fill_range!B57
  • TextColumn : berisi 1
Saat userform ditampilkan, maka cboProd akan berisi daftar yang bersumber dari sheet bernama list_fill_range pada area range A2:C5. Ketika user mengganti pilihan, maka cell B57 di sheet list_fill_range akan terisi dengan nilai dari kolom ke-2 dari list setelah combobox tidak lagi dalam keadaan aktif (kursor telah berpindah ke control lainnya). Hal ini diakibatkan oleh pengaturan properti ControlSource yang merujuk ke range di sheet tersebut. Sedangkan nilai yang diambil oleh ControlSource berasal dari properti Value yang diatur mengikuti isi properti BoundColumn yang merujuk pada kolom ke-2 dari list.

Event change pada cboProd bisa dimanfaatkan untuk menulis ke suatu range ataupun ke control lain saat user mengubah pilihan. Misalkan, saat user mengubah pilihan maka akan terjadi proses penulisan ke range tertentu seperti contoh prosedur sub pada event change cboProd berikut :
Private Sub cboProd_Change()
    'tulis informasi tentang data terpilih
   
    '>> ke worksheet 'Sheet1 (list_fill_range)'
    Sheet1.Range("b61").Value = cboProd.ListIndex   'ListIndex
    Sheet1.Range("b62").Value = cboProd.Text        'Text
    Sheet1.Range("b63").Value = cboProd.Value       'Value
    Sheet1.Range("b64").Value = cboProd.Column(2)   'Column indeks 2 [base 0]=kolom ke-3
    Sheet1.Range("b65").Value = cboProd.List(, 2)   'List indeks kolom 2 [base 0]=kolom ke-3

End Sub

Properti ControlSource juga dimiliki oleh control lain seperti TextBox. Misalnya di frmNomor1 tersebut juga ditambahkan 2 buah textbox. Textbox pertama diberi nama txtBound1 untuk terikat dengan range B57 (yang diisi oleh ControlSource milik combobox) dan textbox kedua diberi nama txtListIndex1 yang terikat dengan range B61. Isi properti ControlSource pada textbox txtBound1 berbunyi list_fill_range!B57 dan pada textbox txtListIndex1 berbunyi list_fill_range!B61. Setiapkali ada perubahan pada cell B57 dan B61, maka textbox juga akan berubah isinya ketika terjadi pembaruan tampilan frmNomor1. Pembaruan tampilan frmNomor1 bisa dipicu dengan mengganti control yang aktif melalui methods SetFocus. Jadi, pada event change milik cboProd juga bisa disertakan proses pembaruan tampilan ini dengan menambahkan baris-baris script berikut yang diletakkan pada bagian tepat sebelum End Sub setelah baris terakhir penulisan yang sudah ada.
    '>> supaya textbox control yang menggunakan properti ControlSource terupdate
    txtBound1.SetFocus      'salah satu control di-set focus
    'jika ingin dikembalikan ke combobox cboProd, maka set focus ke cboprod
    cboProd.SetFocus


Penulisan item terpilih ke control yang ada dalam userform juga bisa dilakukan dengan script VBA dan tanpa properti ControlSource milik control yang menjadi target. Misalnya pada frmNomor1 diberi textbox berikut :
  • txtListIndex : diisi dengan nilai properti ListIndex dari cboProd
  • txtValue : diisi dengan nilai yang disimpan oleh properti Value milik cboProd
  • txtText : diisi dengan nilai yang disimpan oleh properti Text milik cboProd
  • txtCol2 : diisi dengan nilai yang diambil dari kolom ke-3 list yang berindeks kolom senilai 2
maka pada event change milik cboProd bisa tambahkan script penulisan tersebut yang berbunyi :
    '>> ke TextBox di frame fraScript dalam userform frmNomor1
    txtListIndex.Text = cboProd.ListIndex   'ListIndex
    txtValue.Text = cboProd.Value           'Value -> tergantung BoundColumn
    txtText.Text = cboProd.Text             'Text  -> tergantung TextColumn
   
    'mengambil nilai dari kolom tertentu bisa dengan
    'properti Column(indeks kolom) atau properti List( nilai list index , indeks kolom )
    'seperti :
    txtCol2.Text = cboProd.Column(2)        'Column(2) -> column(0) adalah kolom ke-1
    'atau
    txtCol2.Text = cboProd.List(, 2)        'List(,2) -> column(0) adalah kolom ke-1


Berikut ini adalah cuplikan gambar bentuk userform bernama frmNomor1 :
Contoh tampilan hasil penulisan yang dilakukan oleh proses yang ada dalam prosedur sub event change milik cboProd adalah :

Script lengkap dari prosedur sub event change milik cboProd berbunyi :
Private Sub cboProd_Change()
    'tulis informasi tentang data terpilih
   
    '>> ke worksheet 'Sheet1 (list_fill_range)'
    Sheet1.Range("b61").Value = cboProd.ListIndex   'ListIndex
    Sheet1.Range("b62").Value = cboProd.Text        'Text
    Sheet1.Range("b63").Value = cboProd.Value       'Value
    Sheet1.Range("b64").Value = cboProd.Column(2)   'Column indeks 2 [base 0]=kolom ke-3
    Sheet1.Range("b65").Value = cboProd.List(, 2)   'List indeks kolom 2 [base 0]=kolom ke-3
   
    '>> supaya textbox control yang menggunakan properti ControlSource terupdate
    txtBound1.SetFocus      'salah satu control di-set focus
    'jika ingin dikembalikan ke combobox cboProd, maka set focus ke cboprod
    cboProd.SetFocus
   
    '>> ke TextBox di frame fraScript dalam userform frmNomor1
    txtListIndex.Text = cboProd.ListIndex   'ListIndex
    txtValue.Text = cboProd.Value           'Value -> tergantung BoundColumn
    txtText.Text = cboProd.Text             'Text  -> tergantung TextColumn
   
    'mengambil nilai dari kolom tertentu bisa dengan
    'properti Column(indeks kolom) atau properti List( nilai list index , indeks kolom )
    'seperti :
    txtCol2.Text = cboProd.Column(2)        'Column(2) -> column(0) adalah kolom ke-1
    'atau
    txtCol2.Text = cboProd.List(, 2)        'List(,2) -> column(0) adalah kolom ke-1
End Sub


:)

Insya Allah pembahasan tentang combobox akan dilanjutkan pada coretan berikutnya. Pembahasan combobox yang akan dibahas berikutnya antara lain tentang pengisian list dengan script VBA memanfaatkan methods AddItem maupun properti List yang diletakkan pada prosedur sub event initialize userform. Juga dibahas tentang methods Clear untuk menghapus seluruh isi list combobox. Proses pengubahan nilai suatu item dalam list, menghapus sebuah item, menambahkan sebuah item di baris baru ataupun disisipkan pada baris tertentu juga akan dibahas disana. Dampak pengubahan isi list combobox yang memicu dijalankannya event change beserta salah satu cara menghindarinya akan disertakan pada pembahasan tersebut.




Sunday, November 10, 2013

BelajarVBA 101 - Controls Dalam Worksheet

Coretan Mr. Kid

Belajar sedikit-sedikit secara rutin dan konsisten akan berdampak lebih besar daripada belajar banyak sesekali.

Worksheet bisa diberi Form Controls dan ActiveX Controls untuk memudahkan interaksi dengan user. Object berupa shape juga bisa dimanfaatkan sebagai sebuah tombol untuk menjalankan prosedur VBA yang telah dibuat dalam sebuah general module. Bahasan kali ini adalah tentang menggunakan sebuah shape, Button Form Control, dan Command Button ActiveX Control untuk menjalankan sebuah prosedur VBA. File yang bisa digunakan untuk mencoba secara mandiri adalah BelajarVBA101_01.xlsm. Sebaiknya dalam membaca pembahasan ini disertai dengan membuka file BelajarVBA101_01.xlsm pada sheet bernama 'shapes_n_controls'.

Mengenal object control

Object controls adalah object yang dapat digunakan untuk mengatur interaksi dengan user sesuai jenis control tersebut. Misalnya, sebuah List Box dapat digunakan untuk mengatur daftar item yang dapat dipilih oleh user. Ketika sebuah item dalam List Box dipilih user, maka dapat digunakan untuk mengatur proses yang harus terjadi terhadap pemilihan item tersebut.
Object control berada di ribbon Developer -> group Controls -> item Insert


Object control yang tersedia terbagi dalam 2 kelompok besar, yaitu :
  1. Form Controls
    • Object controls bawaan Excel.
    • Tidak termasuk object controls yang diwaspadai oleh Security Excel.
    • Hanya memiliki prosedur sub event click saja.
    • Controls yang disediakan adalah Button, Label, Combo Box, List Box, Spin Button, Scroll Bar, Check Box, Option Button, Group Box.
    • Controls tambahan ketika menggunakan MS Excel 5.0 Dialog adalah Text Field, Combo List, dan Combo Drop Down.
    • Beberapa controls seperti Combobox, Listbox, Spin Button, dan sebagainya memiliki banyak properti yang bisa diset langsung melalui Format Control pada tab Control.
    • Beberapa controls, seperti Spin Button, Combobox, dan semacamnya, memberikan suatu nilai output. Nilai output tersebut dapat digunakan ketika control tersebut di-link ke suatu cell.
    • Form control berupa List Box dan Combo Box membutuhkan rujukan ke suatu range satu kolom saja untuk mengisi daftar pilihan yang dapat dipilih user.
  2. ActiveX Controls
    • Object controls tambahan dari library windows bernama mscomctl.ocx atau mscomctl2.ocx.
    • Memiliki banyak properti melalui dialog window Properties.
    • Memiliki banyak macam prosedur sub event.
    • Bisa digunakan dalam sebuah sheet maupun dalam sebuah UserForm.
    • Controls yang disediakan adalah Command Button, Label, Combo Box, List Box, Spin Button, Scroll Bar, Check Box, Option Button, Text Box, Image, Toggle Button.
    • Beberapa controls memberikan suatu nilai output. Nilai output tersebut bisa digunakan melalui baris-baris kode VBA maupun di-link ke sebuah cell.
    • Pengisian daftar pada control seperti Combo Box ataupun List Box bisa dengan merujuk ke suatu range tertentu ataupun melalui baris-baris kode VBA. Jumlah kolom dalam Combo Box atau List Box juga bisa lebih dari satu kolom.
    • Bisa menambahkan ActiveX Controls lain yang belum ada dalam daftar yang disediakan melalui :
      ribbon Developer -> group Controls -> Insert -> bagian ActiveX Controls -> item More Controls
    • Pengaturan nilai-nilai properti maupun penataan baris-baris kode dalam events dilakukan ketika dalam keadaan Design Mode ON, yaitu dengan cara :
      ribbon Developer -> group Controls -> klik Design Mode agar aktif (terjadi perubahan warna pada menu)
    • Controls akan dapat berfungsi ketika Design Mode dalam keadaan OFF, yaitu dengan mengklik ulang item Design Mode dalam ribbon Developer.

Mengenal properti khusus pada sebuah form control

Properti khusus yang dimiliki sebuah form control diletakkan pada tab Control dalam dialog window Format Control. Properti khusus tersebut dapat diakses dengan :
klik kanan form control -> Format Control -> klik tab Control

Form Control yang memiliki properti khusus pada umumnya adalah controls yang bisa memberikan nilai output, kecuali control bernama Group Box yang berfungsi membentuk sebuah group check box maupun option button. Berikut ini adalah form controls yang bisa memberi nilai output :
  • Combo Box (Drop Down)
     berupa nomor indeks item (item pertama bernomor indeks 1) yang dipilih user
  • List Box
     berupa nomor indeks item (item pertama bernomor indeks 1) yang dipilih user
  • Spin Button
     berupa nilai bilangan bulat setelah kegiatan naik atau turun terakhir
  • Scroll Bar
     berupa nilai bilangan bulat setelah kegiatan naik atau turun terakhir
  • Check Box
     berupa nilai TRUE ketika dalam status checked dan nilai FALSE ketika dalam status unchecked
  • Option Button
     berupa nomor indeks dari option button (item pertama bernomor indeks 1) dalam sebuah grup option

Mengenal properti ActiveX Control

Setiap ActiveX Control memiliki banyak properti yang bisa diatur nilainya melalui baris kode VBA maupun melalui dialog window properties. Cara menampilkan dialog window properties dari sebuah ActiveX Control yang diletakkan pada sebuah sheet adalah dengan :
  • Aktifkan Design Mode
  • Membuka dialog window properties
    klik kanan control -> pilih Properties

Properti utama dari setiap ActiveX Control adalah properti '(Name)' yang berfungsi untuk menentukan nama object control tersebut. Pada ActiveX Control yang diletakkan pada sebuah sheet, penggantian nilai properti '(Name)' juga dapat dilakukan melalui Name Box yang disediakan Excel. Teks yang diserahkan ke properti '(Name)' inilah yang akan aktif digunakan sebagai rujukan ke object control tersebut dalam baris-baris kode VBA.

Beberapa properti, yang ada disetiap ActiveX Control, yang sering digunakan adalah :
  • Enabled
      diisi TRUE jika boleh digunakan oleh user, dan diisi FALSE jika tidak boleh digunakan
  • Visible
      diisi TRUE jika akan ditampilkan kepada user, dan diisi FALSE jika akan disembunyikan dari pandangan user
Pada beberapa ActiveX Controls yang dapat memberikan nilai output, yang disimpan oleh si control pada properti bernama Value atau Text (bila ada), disediakan properties tambahan untuk mendukung fungsi control tersebut. Misalnya properti ListFillRange pada ComboBox dan ListBox atau properti SmallChange pada SpinButton atau ScrollBar. Beberapa ActiveX Control memiliki properti yang tidak ditampilkan dalam dialog window properties, tetapi memiliki fungsi yang sangat penting, seperti properti ListIndex pada ComboBox dan ListBox.

Mengenal event dari ActiveX Controls

Kelebihan dari ActiveX Controls adalah tersedianya banyak event yang menangkap perlakuan user terhadap control tersebut. Seperti event bernama Click yang akan menangkap perlakuan user saat mengklik control tersebut. Ada juga event bernama Change yang menangkap perlakuan user ketika mengubah nilai yang ada dalam control tersebut, seperti mengetik setiap karakter dalam Text Box Control atau mengubah pilihan dalam List Box maupun Combo Box dan sebagainya.

Dengan diketahuinya perlakuan user terhadap si control melalui event yang diproses tersebut, maka alur proses bisa diatur untuk melakukan suatu kegiatan komputasi tertentu. Misalnya, ketika user mengklik tombol tertentu, maka event Click akan diproses dan didalam event tersebut diberi baris-baris kode untuk menjalankan suatu proses copy data dari sheet input ke sheet database.

Dari sekian banyak event yang dimiliki setiap ActiveX Control, ada beberapa event yang selalu ada dan sering digunakan, antara lain adalah :
  1. GotFocus
    • Bereaksi ketika suatu proses atau user mengaktifkan control tersebut. Event ini bisa digunakan salah satu contohnya adalah untuk menata (bahkan sampai memvalidasi nilai) dari control tersebut atau controls yang lain.
    • Misalnya control TextBox bernama Negara. Ketika TextBox Negara diaktifkan, maka event GotFocus dari textbox ini akan beraksi dan dijalankan. Pada event GotFocus milik si textbox ini bisa diisi dengan proses menghapus nilai dalam textbox dan memeriksa nilai dalam textbox lain seperti textbox Nama harus sudah terisi lebih dulu. Jika textbox Nama belum terisi, maka proses akan memerintahkan textbox Nama untuk diaktifkan.
  2. LostFocus
    • Bereaksi ketika suatu proses atau user mengaktifkan object lain. Event ini bisa digunakan salah satu contohnya adalah untuk memvalidasi nilai yang telah diinputkan pada control tersebut.
    • Misalnya control ComboBox bernama PIC yang sedang aktif. Ketika user mengaktifkan control lain, maka event LostFocus milik combobox PIC akan beraksi dan dijalankan. Pada event ini bisa diisi dengan pemeriksaan bahwa combobox PIC telah diisi dengan salah satu item yang ada dalam daftar yang disediakan. Jika tidak ada, maka proses bisa mengembalikan control yang aktif ke combobox PIC.
  3. KeyDown
    • Bereaksi ketika si control sedang aktif dan user menekan sebuah tombol keyboard. Event ini menyediakan informasi kode tombol keyboard yang ditekan oleh user dalam variabel bernama KeyCode. Informasi tentang tertekannya tombol shift atau tidak disediakan dalam variabel bernama Shift. Event ini bisa digunakan untuk membatasi tombol keyboard yang bisa mempengaruhi si control.
    • Misalnya sebuah textbox bernama NIP yang harus berisi angka saja bisa diatur agar tombol keyboard yang membuat si textbox berubah nilainya adalah tombol-tombol angka saja. Contoh lainnya adalah sebuah CommandButton bisa diatur agar proses penekanan (klik) bisa dengan menekan tombol keyboard huruf 'p' ketika si control dalam keadaan sedang aktif.
  4. MouseMove
    • Bereaksi ketika pointer mouse melintasi si control. Event ini biasanya digunakan untuk menampilkan informasi tentang si control. Salah satu media penulisan informasi yang disediakan adalah properti bernama ControlTipText. Properti ini hanya ada ketika control digunakan dalam sebuah userform. Ketika control diletakkan dalam sebuah sheet, maka control seperti Label bisa dijadikan media penampil informasi tentang si control.
Setiap ActiveX Controls juga memiliki events yang khusus untuk menunjang kerjanya. Beberapa events penunjang tersebut ada yang dapat digunakan dalam UserForm saja. Jadi, dalam penggunaan ActiveX Control perlu diketahui lokasi penggunaannya beserta events yang bisa digunakan dilokasi tersebut. Cara yang mudah adalah dengan melihat ComboBox event dan prosedur dalam VBE saat ComboBox object berisi control tersebut [silakan baca BelajarVBA 001 - VBE (Visual Basic Editor)]

Tombol pemanggil prosedur VBA

Beberapa kegiatan otomasi dengan VBA membutuhkan interaksi dengan user untuk menjalankan prosedur-prosedur otomasi yang telah dibuat. Sebuah tombol yang dapat ditekan oleh user akan memudahkan user dalam menjalankan suatu prosedur otomasi. Tombol bisa berupa Shape, Form Control, atau ActiveX Control.

Cara menambahkan suatu object yang akan berfungsi sebagai tombol dalam sebuah worksheet adalah sebagai berikut :
  • Menggunakan shape
    ribbon Insert -> group Illustrations -> Shapes -> pilih sebuah shape -> gambar kotak dalam worksheet
  • Menggunakan Form Control
    ribbon Developer -> group Controls -> Insert -> lihat bagian Form Controls (sisi atas) -> pilih Button -> gambar kotak dalam worksheet
  • Menggunakan ActiveX Control
    ribbon Developer -> group Controls -> Insert -> lihat bagian Form Controls (sisi atas) -> pilih Button -> gambar kotak dalam worksheet

Cara mengganti nama tombol antara lain dengan :
  • Menggunakan shape
    klik kanan shape dalam worksheet -> klik Name Box (pojok kiri atas worksheet [diatas nomor baris Excel 1]) -> ganti teks yang ada (misal menjadi shpPesan) -> tekan ENTER
  • Menggunakan Form Control
    klik kanan Button dalam worksheet -> klik Name Box (pojok kiri atas worksheet [diatas nomor baris Excel 1]) -> ganti teks yang ada (misal menjadi ctlBPesan) -> tekan ENTER
  • Menggunakan ActiveX Control
    • Aktifkan Design Mode
    • Ganti nama control
      klik kanan Command Button dalam worksheet -> klik Name Box (pojok kiri atas worksheet [diatas nomor baris Excel 1]) -> ganti teks yang ada (misal menjadi cmdPesan) -> tekan ENTER
    • Non aktifkan Design Mode

Pengaturan nama prosedur yang akan dijalankan oleh si tombol selalu diawali dengan adanya prosedur yang akan dijalankan. Misalkan pada sebuah general module telah dibuat sebuah prosedur bernama PesanShapeNFormControl yang berupa :
   Public Sub PesanShapeNFormControl()
       MsgBox "Hello " & Environ("USERNAME")
   End Sub

Kemudian diinginkan untuk dijalankan dengan object berupa sebuah shape atau sebuah form control Button.

Cara mengatur tombol berupa shape atau form control Button yang telah ada dalam worksheet, sehingga bisa menjalankan prosedur diatas ketika ditekan, adalah sebagai berikut :
  • Menggunakan shape
    • klik kanan shape dalam worksheet -> pilih Assign Macro

    • pilih nama prosedur PesanShapeNFormControl -> OK

  • Menggunakan Form Control
      seperti menggunakan shape, tetapi yang diklik kanan adalah Button
    • klik kanan Button dalam worksheet -> pilih Assign Macro
    • pilih nama prosedur PesanShapeNFormControl -> OK
Pada penggunaan ActiveX Control, proses pengaturan CommandButton untuk dapat menjalankan sebuah prosedur harus melalui event yang dimiliki si control CommandButton tersebut. Misalkan sebuah CommandButton bernama cmdPesan dijadikan sebuah tombol yang akan menjalankan prosedur lain bernama PesanActiveXControl.

Prosedur PesanActiveXControl berupa blok prosedur sebagai berikut :
   Public Sub PesanActiveXControl()
       MsgBox "Welcome, " & Environ("USERNAME")
   End Sub


Cara mengatur Command Button tersebut adalah sebagai berikut :
  • Aktifkan Design Mode

  • Bentuk prosedur event click (ketika tombol di-click maka akan diproses)
    double click Command Button dalam worksheet -> muncul blok event Click milik tombol tersebut (gambar bawah sisi kiri) -> isi dengan nama prosedur PesanActiveXControl

  • Non aktifkan Design Mode

Catatan

  • Form Controls adalah bawaan Excel, sehingga cenderung dapat digunakan disemua komputer yang memiliki Excel dan tidak memerlukan pengaturan Excel Security.
  • ActiveX Controls tergantung pada file library, sehingga controls tersebut dapat berfungsi dengan baik jika komputer setempat (yang membuka workbook) juga memiliki file library yang berisi si control.
  • ActiveX Controls termasuk object yang diawasi oleh Excel Security, sehingga membutuhkan pengaturan Excel Security agar dapat berfungsi.
  • ActiveX Controls mudah ditata dengan baris-baris VBA dan memiliki banyak events.

:)

Insya Allah pembahasan berikutnya adalah tentang beberapa Form Control dan ActiveX Control yang sering digunakan seperti ComboBox, ListBox, dan sebagainya. Pembahasan masih tentang penggunaan controls dalam worksheet.



Friday, November 1, 2013

BelajarVBA 012 - Formula

Coretan Mr. Kid

Selamat Tahun Baru 1435 H. Mari bersegera melakukan hijrah ke sesuatu yang lebih baik menurut tuntunan agama.

Mari kita lanjutkan obrolan tentang VBA yang sempat tertunda beberapa saat ini. Pembahasan kali ini adalah tentang memasang formula ke suatu area range dengan VBA. File yang bisa digunakan untuk mencoba secara mandiri adalah BelajarVBA012.xlsm.


Excel Reference Style

Excel menyediakan dua style dalam mereferensi ke suatu range, yaitu A1 dan R1C1. Style tersebut adalah tentang cara menuliskan rujukan ke suatu range. Karakteristik rujukan dan fungsional dari kedua style adalah sama. Pada A1 Style, karakter A mewakili cara penulisan indeks kolom Excel dan karakter 1 mewakili indeks baris Excel. Pada R1C1 Style, karakter R berarti Row yang diikuti dengan nomor indeks baris Excel yang diwakili oleh karakter 1 dibelakang karakter R. Sedangkan karakter C berarti Column yang diikuti dengan nomor indeks kolom Excel yang diwakili oleh karakter 1 dibelakang karakter C. Contoh A1 Style adalah sebuah alamat cell yang ditulis dengan $C$17. Karakter C menunjukkan indeks kolom Excel ke-3 dan karakter 17 mewakili indeks baris Excel ke-17.  Jika alamat cell ber-A1 Style tadi ditulis dalam R1C1 style, maka menjadi R17C3 yang berarti Row ke-17 dan Column ke-3.

Banyak pengguna VBA yang berpendapat bahwa penggunaan R1C1 style dalam menyusun formula suatu range melalui VBA lebih mudah daripada menggunakan A1 style. Banyak juga pengguna VBA yang berpendapat bahwa penggunaan A1 style dalam menyusun formula suatu range melalui VBA lebih mudah daripada menggunakan R1C1 style. Pendapat saya pribadi, jika pengguna VBA saat berkegiatan di worksheet merasa lebih mudah menggunakan A1 style, biasanya akan lebih mudah menggunakan A1 style dalam menyusun formula suatu range melalui VBA. Begitu juga sebaliknya, jika pengguna VBA saat berkegiatan di worksheet merasa lebih mudah menggunakan R1C1 style, biasanya akan lebih mudah menggunakan R1C1 style dalam menyusun formula suatu range melalui VBA. Ketika pengguna VBA saat berkegiatan di worksheet merasa nyaman menggunakan style apapun, maka akan ada banyak opsi saat menyusun formula suatu range melalui VBA. Jadi, tetaplah pada apa yang telah dikuasai dan mulailah untuk dikembangkan. Tidak perlu memperdebatkan style mana yang lebih mudah digunakan dalam VBA.

Pemasangan formula dengan VBA adalah dengan memanfaatkan properti milik object range yang bernama :
  1. Formula untuk A1 style dengan syntax :
    object_range.Formula = "=bunyi formula"

  2. FormulaR1C1 untuk R1C1 style dengan syntax :
    object_range.FormulaR1C1 = "=bunyi formula"

Memasang formula ke suatu range dengan VBA

Data yang akan digunakan dalam pembahasan ini seperti yang ada di sheet bernama VBA dalam file BelajarVBA012.xlsm yang berisi seperti gambar berikut ini :
Pada gambar diatas, data menggunakan A1 style dan formula yang dibutuhkan adalah untuk menghitung :
  1. Total Pembelian pada kolom total_beli dengan formulasi nilai kolom beli * nilai kolom qty
  2. Total Penjualan pada kolom total_jual dengan formulasi nilai kolom jual * nilai kolom qty

Dari keadaan yang ada, maka dapat dijabarkan bahwa :
  • Karena kolom total_beli dan total_jual merujuk ke kolom qty, maka pada rujukan ke kolom qty dalam formula membutuhkan absolute reference pada sisi kolom ketika merujuk ke kolom qty.
  • Kolom total_beli berdampingan dengan kolom total_jual dan kolom beli yang dibutuhkan oleh formulasi total_beli juga berdampingan dengan kolom jual yang dibutuhkan formulasi total_jual, sehingga rujukan ke kolom beli saat menghitung total_beli, tidak perlu absolute reference pada sisi kolom agar formula bisa di-copy ke kolom total_jual yang secara otomatis akan membuat formulasi pada kolom total_jual akan merujuk ke kolom jual akibat proses copy formula tersebut.
  • Baris yang diproses adalah pada baris yang sama dan baris data lainnya juga merujuk ke baris masing-masing. Artinya, pada sisi baris yang merujuk ke kolom beli, kolom jual, dan kolom qty tidak membutuhkan absolute reference, sehingga formula bisa di-copy ke baris data berikutnya.

Langkah-langkah pemasangan formula ke area range diseluruh record data pada kolom total_beli dan total_jual adalah sebagai berikut :
  1. Susun formula universal pada worksheet untuk mengkalkulasi total_beli pada record pertamanya.
    • Bunyi formula sesuai reference style worksheet : (pilih salah satu)
      1. Formula dengan A1 style di cell i2 adalah =F2*$H2
      2. Formula dengan R1C1 style di cell R2C9 adalah =RC[-3]*RC8
    • Buat sebuah general module dan sebuah prosedur sub untuk memasang formula. Misalkan nama prosedurnya adalah PasangFormula dengan bentuk blok prosedur sebagai berikut :
      Public Sub PasangFormula()

      End Sub
  2. Definisikan variabel kerja
    Dalam prosedur tersebut diberi baris kode deklarasi variabel kerja sebagai berikut :
    Dim rngData As Range    'area data (termasuk header)
    Dim rngTarget As Range  'area yang dipasangi formula
    Dim lRecords As Long    'jumlah record
  3. Definisikan range yang akan dipasangi formula
    Pendefinisian dilakukan dengan informasi sebagai berikut :
    1. Data berada di sheet bernama VBA, yang dimulai pada cell pertama (baris ke-1 dan kolom ke-1) dan berbentuk tabel yang baik. Area data seluruhnya bisa didefiniskan dengan properti CurrentRegion dari Cells(1,1) pada sheet VBA.
    2. Jumlah baris yang akan dipasangi formula adalah sebanyak jumlah record data. Jumlah record data adalah jumlah baris data seluruhnya (termasuk header) dikurangi jumlah baris header (pada kasus ini, header membutuhkan 1 baris saja).
    3. Area range yang akan dipasangi formula adalah area data seluruhnya yang diubah dimensi barisnya (resize pada sisi baris) menjadi sebanyak jumlah record data.
    4. Jumlah kolom yang akan dipasangi formula yang berdampingan adalah sebanyak 2 kolom, yaitu kolom total_beli dan kolom total_jual yang berdampingan. Artinya, dibutuhkan pengubahan dimensi kolom dari seluruh area data menjadi sebanyak 2 kolom (resize pada sisi kolom menjadi 2).
    5. Range yang akan dipasangi formula terletak mulai dibawah header (mulai baris ke-2), artinya, diperlukan offset sebanyak jumlah baris header dari seluruh area data (termasuk header). Pada kasus ini, header data hanya membutuhkan 1 baris saja, maka dilakukan offset sebanyak 1 baris.
    6. Kolom pertama yang akan dipasangi formula terletak pada kolom ke-9, artinya, diperlukan offset sebanyak 8 kolom kekanan dari kolom pertama data.

    Dari pendefinisian diatas, maka dapat disusun baris kode untuk mendapatkan area range yang akan dipasangi formula sebagai berikut :
    Set rngData = Sheets("VBA").Cells(1, 1).CurrentRegion
    lRecords = rngData.Rows.Count - 1
    Set rngTarget = rngData.Resize(lRecords, 2).Offset(1, 8)
  4. Memasang formula pada area range
    Informasi yang diketahui adalah sebagai berikut :
    • Area range yang akan dipasangi formula telah didefinisikan dalam variabel rngTarget. Artinya, properti milik variabel rngTarget yang akan digunakan.
    • Bunyi formula yang disusun dalam worksheet adalah : (pilih salah satu reference style)
      1. A1 style berbunyi =F2*$H2
      2. R1C1 style berbunyi =RC[-3]*RC8
    • Formula dalam worksheet telah bersifat universal atau dapat di-copy langsung ke seluruh area range yang harus dipasangi formula.

    Dari informasi diatas, baris kode untuk memasang formula pada area range rngFormula adalah sebagai berikut : (pilih style sesuai kenyamanan masing-masing)
    1. A1 style :
      rngTarget.Formula = "=F2*$H2"
    2. R1C1 style :
      rngTarget.FormulaR1C1 = "=RC[-3]*RC8"
Bentuk prosedur bernama PasangFormula akan menjadi :
Public Sub PasangFormula()
    '------------------------'
    'deklarasi variabel kerja'
    '------------------------'

    Dim rngData As Range        'area data (termasuk header)
    Dim rngTarget As Range      'area yang dipasangi formula
    Dim lRecords As Long        'jumlah record
   
    '-----------------------------------------------'
    'pendefinisian area range yang dipasangi formula'
    '-----------------------------------------------'
    '1. pendefinisian area data seluruhnya
    'data tersusun sebagai tabel yang baik -> currentregion

    Set rngData = Sheets("VBA").Cells(1, 1).CurrentRegion
   
    '2. pendefinisian jumlah record data
    'nilai 1 adalah jumlah baris untuk header data

    lRecords = rngData.Rows.Count - 1
   
    '3 sampai 6 pendefinisian area range yang dipasangi formula
    '- rngData diubah dimensinya (resize) menjadi lRecords baris dan 2 kolom
    '- kemudian di-offset sebanyak 1 baris dan 8 kolom

    Set rngTarget = rngData.Resize(lRecords, 2).Offset(1, 8)
   
    '-----------------------------------------------'
    'pemasangan formula'
    '-----------------------------------------------'

    rngTarget.Formula = "=F2*$H2"
End Sub


Memasang Array Formula

Array formula selalu menghasilkan suatu blok array. Range yang masuk dalam area blok array tersebut tidak dapat diubah kecuali seluruh range yang ada dalam blok array tersebut yang diubah. Dimensi terkecil dari array blok adalah 1 baris x 1 kolom yang berisi sebuah cell berarray formula. Karakteristik lain dari blok array adalah tidak dapat diubah isinya dengan paste ketika salah satu range atau seluruh range dari blok array tersebut sedang aktif dikenai proses copy.

Misalnya, cell C17 berisi array formula berbunyi =MIN( IF( A1:A5>0 , A1:A5 ) ) yang akan membentuk sebuah blok array berdimensi 1 baris x 1 kolom. Ketika formula di C17 juga akan dipasang pada area range D17 sampai F17, maka cell C17 di-copy ke clipboard dengan menekan CTRL C. Jika range C17 sampai F17 diblok dan dilakukan paste (menekan CTRL V), maka proses paste akan gagal karena cell C17 adalah blok array yang sedang aktif di-copy. Maka proses paste ke area D17 sampai F17 harus dengan cara memblok D17 sampai F17 tanpa menyertakan C17, yang kemudian dilakukan paste dengan menekan CTRL V.

Array formula dipasang ke suatu range dengan memanfaatkan properti FormulaArray milik object range dengan syntax :
   object_range.FormulaArray = "=bunyi array formula"
Ketika properti FormulaArray digunakan pada suatu object range yang berisi banyak cells, maka seluruh range yang dikenai properti FormulaArray akan membentuk sebuah blok array. Misalnya, ada sebuah variabel range yang bernama rngTarget yang berisi range D5:F9. Kemudian rngTarget dikenai properti FormulaArray dan diberi bunyi teks array formula apapun. Maka range D5:F9 akan membentuk sebuah blok array yang tidak akan mungkin diubah salah satu isi dari range D5:F9 tersebut.

Dengan demikian, pemasangan array formula membutuhkan ketelitian lebih dalam menentukan range yang akan diberi array formula agar blok array yang terbentuk sesuai kebutuhan. Pemasangan array formula dilakukan pada satu lokasi lebih dulu, kemudian di-copy ke lokasi lain. Artinya, diperlukan pendefinisian area range yang akan dipasangi array formula sebagai lokasi pertama dan pendefinisian area range yang akan menjadi lokasi paste dari array formula yang telah terpasang di lokasi pertama tadi. Syaratnya, area range lokasi paste tidak berpotongan sama sekali dengan area range lokasi pemasangan array formula pertama.

Contoh pemasangan array formula bisa memanfaatkan data yang ada di sheet bernama 'Array' seperti gambar berikut :

Kasus untuk memperlajari pemasangan array formula akan menggunakan A1 style. Contoh kasus tersebut adalah sebagai berikut :
  1. Cell E2 diberi array formula berbunyi =A2, sehingga dalam cell E2 akan tampil di formula bar sebagai {=A2}. Kemudian array formula di E2 akan di-copy sampai E4. Misalkan nama prosedurnya adalah ArrayFormula1, maka bunyi prosedurnya adalah :
    Public Sub ArrayFormula1()
        Dim rngPertama As Range  'range pertama yang diberi array formula
        Dim rngPaste As Range    'range lokasi paste array formula
       
        'lokasi pasang array formula yang akan di-copy
        Set rngPertama = Sheets("Array").Range("E2")
       
        'lokasi paste array formula di rngPertama
        Set rngPaste = Sheets("Array").Range("E3:E4")
       
        'pasang array formula di lokasi pertama
        rngPertama.FormulaArray = "=A2"
       
        'proses copy paste formula
        rngPertama.Copy
        rngPaste.PasteSpecial xlPasteFormulas
    End Sub

  2. Cell G2 diberi array formula berbunyi =A2, sehingga dalam cell G2 akan tampil di formula bar sebagai {=A2}. Kemudian array formula di G2 akan di-copy sampai H4. Proses paste dilakukan dalam 2 tahap, yaitu tahap 1 adalah ke area paste pertama di G3:G4 dan tahap 2 ke area paste kedua di H2:H4. Misalkan nama prosedurnya adalah ArrayFormula2, maka bunyi prosedurnya adalah :
    Public Sub ArrayFormula2()
        Dim rngPertama As Range   'range pertama yang diberi array formula
        Dim rngPaste1 As Range    'range lokasi paste 1 array formula
        Dim rngPaste2 As Range    'range lokasi paste 2 array formula
       
        'lokasi pasang array formula yang akan di-copy
        Set rngPertama = Sheets("Array").Range("G2")
       
        'lokasi paste array formula di rngPertama
        Set rngPaste1 = Sheets("Array").Range("G3:G4")
        Set rngPaste2 = Sheets("Array").Range("H2:H4")
       
        'pasang array formula di lokasi pertama
        rngPertama.FormulaArray = "=A2"
       
        'proses copy paste formula
        rngPertama.Copy
        rngPaste1.PasteSpecial xlPasteFormulas
        rngPaste2.PasteSpecial xlPasteFormulas
    End Sub

  3. Range J2:K2 (1 baris x 2 kolom) diberi array formula berbunyi =A2:B2 (juga 1 baris x 2 kolom), sehingga dalam cell J2 dan K2 akan tampil di formula bar sebagai {=A2:B2}. Range J2:K2 akan menjadi sebuah blok array. Kemudian array formula di J2:K2 akan di-copy sampai J4:K4. Misalkan nama prosedurnya adalah ArrayFormula3, maka bunyi prosedurnya adalah :
    Public Sub ArrayFormula3()
        Dim rngPertama As Range  'range pertama yang diberi array formula
        Dim rngPaste As Range    'range lokasi paste array formula
       
        'lokasi pasang array formula yang akan di-copy
        Set rngPertama = Sheets("Array").Range("J2:K2")
       
        'lokasi paste array formula di rngPertama
        Set rngPaste = Sheets("Array").Range("J3:J4")
       
        'pasang array formula di lokasi pertama
        rngPertama.FormulaArray = "=A2:B2"
       
        'proses copy paste formula
        rngPertama.Copy
        rngPaste.PasteSpecial xlPasteFormulas
    End Sub

  4. Range M2:M4 (3 baris x 1 kolom) diberi array formula berbunyi =A2:A4 (juga 3 baris x 1 kolom), sehingga dalam range M2:M4 akan tampil di formula bar sebagai {=A2:A4}. Range M2:M4 akan menjadi sebuah blok array. Kemudian array formula di M2:M4 akan di-copy sampai N2:N4. Misalkan nama prosedurnya adalah ArrayFormula4, maka bunyi prosedurnya adalah :
    Public Sub ArrayFormula4()
        Dim rngPertama As Range  'range pertama yang diberi array formula
        Dim rngPaste As Range    'range lokasi paste array formula
       
        'lokasi pasang array formula yang akan di-copy
        Set rngPertama = Sheets("Array").Range("M2:M4")
       
        'lokasi paste array formula di rngPertama
        Set rngPaste = Sheets("Array").Range("N2")
       
        'pasang array formula di lokasi pertama
        rngPertama.FormulaArray = "=A2:A4"
       
        'proses copy paste formula
        rngPertama.Copy
        rngPaste.PasteSpecial xlPasteFormulas
    End Sub

  5. Range P2:Q4 (3 baris x 2 kolom) diberi array formula berbunyi =A2:B4 (juga 3 baris x 2 kolom), sehingga dalam range P2:Q4 akan tampil di formula bar sebagai {=A2:B4}. Range P2:Q4 akan menjadi sebuah blok array. Misalkan nama prosedurnya adalah ArrayFormula5, maka bunyi prosedurnya adalah :
    Public Sub ArrayFormula5()
        Dim rngTarget As Range    'range yang diberi array formula
       
        'lokasi pasang array formula
        Set rngTarget = Sheets("Array").Range("P2:Q4")
       
        'pasang array formula di lokasi pertama
        rngTarget.FormulaArray = "=A2:B4"   
    End Sub

Catatan

  1. Kaidah tentang penulisan data teks dalam VB/VBA terhadap karakter tanda petik dua (") :
    • Ketika formula dalam worksheet berisi karakter tanda petik dua ("), maka seluruh karakter tanda petik dua harus diubah menjadi 2 buah tanda petik dua ("") saat bunyi formula tersebut akan dipasang dalam VBA. Misal, formula dalam worksheet berbunyi :
        =17 & " kolom"
    • maka dalam VBA, setiap karakter tanda petik dua yang mengapit kata 'kolom' harus diubah menjadi 2 buah tanda petik dua sesuai kaidah penulisan karakter tanda petik dua dalam suatu data teks di-VB/VBA, sehingga bunyi formula yang dipasang dalam VBA berubah menjadi :
        =17 & "" kolom""
    • Bila range yang akan dipasangi formula adalah variabel bernama rngPasang, maka baris kode menjadi :
        rngPasang.Formula = "=17 & "" kolom"""
        atau
        rngPasang.FormulaR1C1 = "=17 & "" kolom"""
    • Pada formula bar akan tampak formula berbunyi :
        =17 & " kolom"
  2. Pemasangan formula pada kolom yang tidak berdampingan (berjejer) dan tidak dapat disusunkan sebuah formula universal (yang dapat di-copy keseluruh area secara langsung), maka proses yang dijabarkan diatas harus dilakukan terhadap masing-masing kolom dengan formula masing-masing.
  3. Properti Formula, FormulaR1C1, maupun FormulaArray dapat diberi bunyi formula dengan referensi A1 style maupun R1C1 style. Formula yang tampak pada formula bar akan mengikuti setting reference style yang digunakan oleh Excel setempat.
:)

Insya Allah pembahasan berikutnya adalah memasang tombol dalam worksheet berupa shape dan sebuah ActiveX CommandButton untuk menjalankan sebuah prosedur VBA. Pembahasan ini adalah pembukaan untuk pembahasan tentang object module UserForm.