Membangun antarmuka grafis sendiri dengan UserForm: mendesain form berisi TextBox ComboBox ListBox dan CommandButton, mengisi kontrol lewat event Initialize, menangkap aksi lewat event Click, dan menulis validasi input untuk laporan interaktif

Selama 13 episode, komunikasi macro dengan pengguna hanya lewat MsgBox dan InputBox. Episode ini mengubah segalanya: UserForm — antarmuka grafis yang bisa kalian desain sendiri, dengan kolom isian, daftar pilihan, dan tombol.
Mengapa ini penting? Karena alat yang dipakai orang lain harus mudah dipakai. Alih-alih menyuruh kolega mengubah nilai di kode, kalian bisa membuat form sederhana: pilih bulan, klik tombol, laporan keluar. UserForm adalah perbedaan antara "macro untuk diri sendiri" dan "alat untuk tim".
Di VBE, klik kanan proyek → Insert → UserForm. Jendela form terbuka bersama Toolbox yang berisi kontrol. Tarik-dan-lepas kontrol berikut ke form:
| Kontrol | Ikon | Fungsi |
|---|---|---|
| TextBox | ab | Kolom isi teks |
| ComboBox | dropdown | Pilih satu dari daftar (bisa diketik) |
| ListBox | daftar | Pilih dari daftar |
| CommandButton | tombol | Aksi saat diklik |
| Label | A | Teks statis penjelas |
Desain form kalian seperti ini:
┌─────────────────────────────────┐
│ Laporan Penjualan │
│ │
│ Bulan: [ComboBox1 ▼] │
│ Minimal: [TextBox1 ] │
│ │
│ [btnTampilkan] │
└─────────────────────────────────┘Gunakan Properties window (F4) untuk mengganti nama: TextBox1 → txtMinimal, btnTampilkan untuk tombol. Nama yang deskriptif membuat kode event jauh lebih mudah dibaca.
Event UserForm_Initialize berjalan otomatis setiap form dibuka — tempat ideal mengisi ComboBox dan nilai awal:
Private Sub UserForm_Initialize()
Dim bulan() As String
Dim i As Long
bulan = Split("Januari,Februari,Maret,April,Mei,Juni,Juli,Agustus,September,Oktober,November,Desember", ",")
For i = LBound(bulan) To UBound(bulan)
Me.cboBulan.AddItem bulan(i)
Next i
Me.cboBulan.ListIndex = 0
Me.txtMinimal.Value = "1000000"
End SubMe merujuk ke form itu sendiri — semua kontrol diakses lewat ini.AddItem menambah entri ComboBox.ListIndex = 0 menandai pilihan pertama sebagai default.Saat tombol diklik, event Click miliknya berjalan:
Private Sub btnTampilkan_Click()
Dim nilai As Double
If Not IsNumeric(Me.txtMinimal.Value) Then
MsgBox "Minimal harus berupa angka.", vbExclamation
Exit Sub
End If
nilai = CDbl(Me.txtMinimal.Value)
With Sheet1.Range("A1:C100").AutoFilter
.Field = 3
.Criteria1 = ">=" & nilai
End With
MsgBox "Filter diterapkan untuk bulan " & Me.cboBulan.Value
End SubDi sini terlihat pola penting: event adalah pintu masuk yang menangkap aksi, lalu memanggil logika yang sama seperti macro biasa.
Tip
Jangan menaruh logika panjang di dalam event Click. Pola terbaik: event memvalidasi lalu memanggil prosedur terpisah. Dengan begitu logika bisa diuji dan dipakai ulang tanpa membuka form — dan di episode 21 kita akan melihat ini sebagai bagian dari kode modular.
Form yang baik menolak input buruk sejak awal. Tiga teknik dasar:
If Not IsNumeric(Me.txtMinimal.Value) Then
MsgBox "Isi dengan angka.", vbExclamation
Exit Sub
End IfIf Trim(Me.txtNama.Value) = "" Then
MsgBox "Nama tidak boleh kosong.", vbExclamation
Me.txtNama.SetFocus
Exit Sub
End IfSetFocus mengembalikan kursor ke kolom yang salah — membantu pengguna langsung memperbaiki.
If Len(Me.txtKode.Value) <> 6 Then
MsgBox "Kode harus 6 karakter.", vbExclamation
Exit Sub
End IfPrivate Sub txtMinimal_Change()
If IsNumeric(Me.txtMinimal.Value) Then
Me.lblInfo.Caption = "OK: angka valid"
Else
Me.lblInfo.Caption = "Periksa kembali input"
End If
End SubPrivate Sub UserForm_Terminate()
Application.ScreenUpdating = True
End SubForm tidak muncul dengan sendirinya — harus dipanggil dari prosedur:
Sub JalankanForm()
frmLaporan.Show
End SubShow menampilkan form modal: kode berhenti sampai pengguna menutupnya. Ada pula Show vbModeless (non-modal) yang mengizinkan interaksi dengan Excel selama form terbuka — lebih jarang dipakai dan lebih rumit.
Tombol Batal memakai method Hide:
Private Sub btnBatal_Click()
Me.Hide
End SubHide menyembunyikan form tanpa menghancurkan objeknya — nilai properti kontrol masih bisa dibaca setelah form ditutup (sampai Unload).
| Kesalahan | Dampak |
|---|---|
Lupa Me. sebelum nama kontrol | Kode merujuk objek lain / error |
| Validasi hanya di tombol, tidak di event lain | Data buruk masuk lewat jalan lain |
Form dimuat ulang terus (Show berulang) | Event Initialize berulang, duplikat isi ComboBox |
Nama kontrol tetap TextBox1, Button1 | Kode event sulit dibaca |
| Tidak ada tombol Batal | Pengguna terjebak di form |
Pada episode 14 ini, kalian telah membangun antarmuka interaktif dengan UserForm.
Inti yang harus dibawa pulang:
UserForm_Initialize mengisi kontrol saat form dibuka.Click menangkap aksi; validasi input sebelum logika dijalankan..Show; sembunyikan dengan .Hide.Di episode 15 selanjutnya kita mengamankan macro dengan error handling & debugging — On Error GoTo, On Error Resume Next, Err.Number/Err.Description, breakpoint, Debug.Print, watch, dan Step Into/Over — agar kode yang rusak tidak meninggalkan pengguna dalam kebingungan. Sampai jumpa di episode 15!