Ingin memasukkan tanggal ke Excel cukup dengan klik tanggal di kalender? Gak perlu ketik manual, gak usah pakai shape, dan yang penting: gak ribet! Dalam artikel ini, kamu akan belajar cara membuat form kalender otomatis di Excel dengan VBA yang menggunakan class module untuk menangani event tombol tanggal.
Solusi ini cocok banget untuk aplikasi presensi, form data, atau input jadwal di Excel. Yuk kita buat!
📖 Daftar Isi
🎯 Fitur yang Akan Dibuat
- UserForm kalender dengan layout tanggal otomatis
- Tombol navigasi
<<
dan>>
untuk bulan - Dropdown bulan dan tahun
- Highlight tanggal hari ini
- Disable tombol kosong
- Tampil otomatis saat klik sel
📦 Struktur Proyek VBA
Komponen | Fungsi |
---|---|
CalendarForm | UserForm utama dengan layout kalender |
CalendarButton | Class module untuk handle event tombol tanggal |
Module1 | Helper & variabel global |
🛠️ Langkah-Langkah Pembuatan
📁 1. Buat Workbook Macro-Enabled
- Simpan file sebagai
.xlsm
- Buka VBA Editor dengan Alt + F11
🧰 2. Buat UserForm: CalendarForm
- Tambah
ComboBox
untuk bulan:cboBulan
- Tambah
ComboBox
untuk tahun:cboTahun
- Tambah tombol navigasi:
cmdPrev
(<<) dancmdNext
(>>)
Jangan tambahkan tombol tanggal satu per satu. Nanti dibuat otomatis lewat kode!
📁 3. Tambah Class Module: CalendarButton
Public WithEvents btn As MSForms.CommandButton
Public Sub Init(ctrl As MSForms.CommandButton)
Set btn = ctrl
End Sub
Private Sub btn_Click()
If btn.Enabled And btn.Caption <> "" Then
If Not SelTarget Is Nothing Then
SelTarget.Value = btn.Caption & " " & CalendarForm.cboBulan.Value & " " & CalendarForm.cboTahun.Value
Unload CalendarForm
End If
End If
End Sub
🧾4. Tambahkan Module Biasa: Module1
Public SelTarget As Range
Function MonthNameToNumber(monthName As String) As Integer
MonthNameToNumber = Month(DateValue("1 " & monthName & " 2000"))
End Function
5. Kode Lengkap CalendarForm
🔩Deklarasi Variable
Private tombolTanggal() As MSForms.CommandButton
Private Const JmlKolom As Integer = 7
Private Const JmlBaris As Integer = 6
Private Const UkuranBtn As Integer = 24
Private Const JarakKiri As Integer = 20
Private Const JarakAtas As Integer = 60
Dim daftarBtn() As New clsTanggalBtn
🧱 Userform_Initialize
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 12
cboBulan.AddItem MonthName(i)
Next i
For i = Year(Date) - 5 To Year(Date) + 5
cboTahun.AddItem i
Next i
cboBulan.Value = MonthName(Month(Date))
cboTahun.Value = Year(Date)
BuatTombolTanggal
TampilkanHari
End Sub
🧷 Buat Tombol Tanggal
Private Sub BuatTombolTanggal()
Dim baris As Integer, kolom As Integer, index As Integer
Dim btn As MSForms.CommandButton
Dim lebar As Double: lebar = 30
Dim tinggi As Double: tinggi = 25
Dim kiri As Double: kiri = 20
Dim atas As Double: atas = 60
ReDim daftarBtn(0 To 41)
For index = 0 To 41
Set btn = Me.Controls.Add("Forms.CommandButton.1", "btn" & index, True)
With btn
.Width = lebar
.Height = tinggi
kolom = index Mod 7
baris = Int(index / 7)
.Left = kiri + kolom * (lebar + 5)
.Top = atas + baris * (tinggi + 5)
.Font.Size = 9
.Tag = "tanggal"
.Caption = ""
.Enabled = False
End With
Set daftarBtn(index) = New clsTanggalBtn
daftarBtn(index).Init btn, Me
Next index
End Sub
📅 Tampilkan Hari
Private Sub TampilkanHari()
Dim tglAwal As Date
Dim today As Date: today = Date
Dim tglHariIni As Integer: tglHariIni = Day(today)
Dim blnHariIni As Integer: blnHariIni = Month(today)
Dim thnHariIni As Integer: thnHariIni = Year(today)
tglAwal = DateSerial(cboTahun.Value, MonthNameToNumber(cboBulan.Value), 1)
Dim hariAwal As Integer
hariAwal = Weekday(tglAwal, vbMonday) ' Senin = 1
Dim jumlahHari As Integer
jumlahHari = Day(DateSerial(cboTahun.Value, MonthNameToNumber(cboBulan.Value) + 1, 0))
Dim i As Integer
For i = 0 To 41
With Controls("btn" & i)
.Caption = ""
.Enabled = False
.BackColor = RGB(240, 240, 240) ' Abu muda / buram
End With
Next i
For i = 1 To jumlahHari
Dim kolomHari As Integer
Dim idx As Integer: idx = i + hariAwal - 2
kolomHari = idx Mod 7 ' Minggu = 6 (karena indeks mulai dari 0)
With Controls("btn" & idx)
.Caption = i
.Enabled = True
.BackColor = &HFFFFFF ' Putih bersih
.ForeColor = vbBlack ' Warna teks normal
.Font.Bold = False ' Biasa
' Tandai hari Minggu
If kolomHari = 6 Then
.ForeColor = RGB(200, 0, 0) ' Merah untuk teks Minggu
.BackColor = RGB(255, 235, 238) ' Latar pink lembut
End If
' Tandai hari ini
If i = tglHariIni And MonthNameToNumber(cboBulan.Value) = blnHariIni And cboTahun.Value = thnHariIni Then
.BackColor = RGB(0, 120, 215) ' Biru khas Windows
.ForeColor = vbWhite
.Font.Bold = True
End If
End With
Next i
End Sub
🔄 Navigasi Bulan
Private Sub cmdPrev_Click()
Dim bulan As Integer
Dim tahun As Integer
bulan = MonthNameToNumber(cboBulan.Value)
tahun = cboTahun.Value
bulan = bulan - 1
If bulan < 1 Then
bulan = 12
tahun = tahun - 1
End If
cboBulan.Value = MonthName(bulan)
cboTahun.Value = tahun
TampilkanHari
End Sub
Private Sub cmdNext_Click()
Dim bulan As Integer
Dim tahun As Integer
bulan = MonthNameToNumber(cboBulan.Value)
tahun = cboTahun.Value
bulan = bulan + 1
If bulan > 12 Then
bulan = 1
tahun = tahun + 1
End If
cboBulan.Value = MonthName(bulan)
cboTahun.Value = tahun
TampilkanHari
End Sub
🔩Fungsi Nama Bulan Ke Angka
Public Function MonthNameToNumber(namaBulan As String) As Integer
Dim i As Integer
For i = 1 To 12
If MonthName(i) = namaBulan Then
MonthNameToNumber = i
Exit Function
End If
Next i
End Function
Semua kode di atas ditaruh di CalendarForm
🔘 6. Form Muncul Otomatis di Sheet
Di Sheet1 → View Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 4 And Target.Row = 3 And Target.Cells.Count = 1 Then ' Ganti ke kolom dan baris tempat tanggal
calendarForm.Show
End If
End Sub
Cara
🎉 Penutup
Dengan menggunakan class module, tampilan dan logika kalender jadi lebih rapi dan fleksibel. Bisa dikembangkan untuk range tanggal, hari libur, atau bahkan tema gelap!
Kalau kamu mau versi siap pakai dalam bentuk .xlb bisa dididwnload di sini. Selamat mencoba dan semoga ngetik tanggal manual jadi tinggal kenangan 😄
Komentar
Posting Komentar