Visual Basic for Application pada Excel
Microsoft Office Excel datang dengan membawa segudang formula bawaan yang sangat kuat untuk menyelesaikan berbagai tugas pengolahan data mulai dari yang sederhana sampai yang cukup rumit. Namun ketika formula bawaan ini pun belum dapat memenuhi kebutuhan penggunanya, maka Excel (dan juga semua aplikasi Office lainya) menyediakan swiss-army-knife cadangan, yakni Visual Basic for Application (VBA). Dengan VBA, pengguna dengan kemampuan programming dapat mengotomatisasi dengan baris-baris kode hampir seluruh aktifitas di Excel yang normalnya dilakukan dengan keyboard dan mouse secara manual. Bayangkan bahwa setiap cell pada sheet Excel menjadi objek yang dapat diprogram, dan pada akhirnya hanya imajinasi dan logika penggunanyalah yang membatasi apa yang sanggup dikerjakan oleh VBA.
Ini VBA-ku, mana VBA-mu?
Screenshot yang akan saya tampilkan pada tulisan ini menggunakan Microsoft Office 2013. Saya yakin, screenshot ini mungkin tidak jauh berbeda dengan Microsoft Office 2010, dan pasti berbeda dengan Microsoft Office 2007.
Ada 2 cara membuka layar VBA. Yang pertama melalui ribbon Developer.
Bila pada Excel Anda belum ada ribbon Developer ini, maka masuk ke menu:
File > Options > Customize Ribbondan pastikan bahwa kotak cek Developer di kolom kanan telah tercentang seperti gambar berikut:
Atau Anda dapat membukanya dengan cara lain yang lebih cepat, yakni:
ALT + F11Tampilannya kira-kira seperti berikut:
Pada gambar, ada 2 dari 3 area utama yang penting untuk diingat, yaitu Jendela Project dan Jendela Kerja. Baris-baris kode yang akan kita masukkan nanti adalah melalui Jendela Kerja.
Selanjutnya di Jendela Project, klik kanan pada tulisan VBAProject (Book1) dan klik menu:
Insert > ModulePerhatikan bahwa 'Book1' adalah nama file Excel tempat saya sedang bekerja saat ini, dan mungkin berbeda dengan nama pada komputer Anda bila membuka file yang lain. Hasilnya, pada Jendela Project akan muncul Module baru dengan nama Module1, dan pada Jendela Kerja ditampilkan isi Module1 tersebut yang masih kosong dan siap menerima baris-baris kode yang akan kita susun.
Menyusun dan Memasukkan Kode
Berikut adalah baris-baris kode yang harus kita masukkan melalui Jendela Kerja ke dalam Module1 yang telah terbuka sebelumnya. Copy semua kode ini dan paste pada Jendela Kerja.
Public Function KalimatAngka(ByVal angka As Integer) As String Select Case angka Case 1: KalimatAngka = "satu" Case 2: KalimatAngka = "dua" Case 3: KalimatAngka = "tiga" Case 4: KalimatAngka = "empat" Case 5: KalimatAngka = "lima" Case 6: KalimatAngka = "enam" Case 7: KalimatAngka = "tujuh" Case 8: KalimatAngka = "delapan" Case 9: KalimatAngka = "sembilan" End Select End Function Public Function KalimatBulan(ByVal bulan As Integer) As String Select Case bulan Case 1: KalimatBulan = "Januari" Case 2: KalimatBulan = "Februari" Case 3: KalimatBulan = "Maret" Case 4: KalimatBulan = "April" Case 5: KalimatBulan = "Mei" Case 6: KalimatBulan = "Juni" Case 7: KalimatBulan = "Juli" Case 8: KalimatBulan = "Agustus" Case 9: KalimatBulan = "September" Case 10: KalimatBulan = "Oktober" Case 11: KalimatBulan = "November" Case 12: KalimatBulan = "Desember" End Select End Function Public Function TanggalKeKalimat(ByVal tgl As Date) As String 'tempat menyimpan hasil konversi... Dim strKalimat As String 'pisahkan bagian tanggal, bulan dan tahun untuk diproses selanjutnya... Dim intTanggal, intBulan, intTahun As Integer intTanggal = Day(tgl) intBulan = Month(tgl) intTahun = Year(tgl) '--- KONVERSI TANGGAL strKalimat = "tanggal " If intTanggal >= 1 And intTanggal <= 9 Then 'angka 1-9 konversi dengan fungsi KalimatAngka()... strKalimat = strKalimat & KalimatAngka(intTanggal) ElseIf intTanggal = 10 Then 'angka 10 diperlakukan secara khusus... strKalimat = strKalimat & "sepuluh" ElseIf intTanggal = 11 Then 'angka 11 juga khusus... strKalimat = strKalimat & "sebelas" ElseIf intTanggal >= 12 And intTanggal <= 19 Then 'angka 12-19, hilangkan puluhan dan ambil satuannya... intTanggal = intTanggal - 10 'angka satuan lalu dikonversi dan ditambah dengan akhiran belas... strKalimat = strKalimat & KalimatAngka(intTanggal) & " belas" Else 'ubah intTanggal menjadi string strTanggal (format 2 digit)... Dim strTanggal As String strTanggal = Format(intTanggal, "00") 'pisahkan angka puluhan dan angka satuan dari strTanggal... Dim intPuluhan, intSatuan As Integer intTglPuluhan = CInt(Left(strTanggal, 1)) intTglSatuan = CInt(Right(strTanggal, 1)) 'konversi angka puluhan terlebih dahulu... strKalimat = strKalimat & KalimatAngka(intTglPuluhan) & " puluh" 'konversi angka satuan... If intTglSatuan > 0 Then 'bila bukan nol, angka satuan dikonversi dengan fungsi KalimatAngka()... strKalimat = strKalimat & " " & KalimatAngka(intTglSatuan) End If End If 'selesai menerjemahkan tanggal. 'masukkan spasi dan kata antara tanggal dan bulan... strKalimat = strKalimat & " bulan " '--- KONVERSI BULAN 'bulan dikonversi secara mudah dengan fungsi KalimatBulan()... strKalimat = strKalimat & KalimatBulan(intBulan) 'masukkan spasi dan kata antara bulan dan tahun... strKalimat = strKalimat & " tahun " '--- KONVERSI TAHUN 'ubah intTahun menjadi string strTahun (format menjadi 4 digit)... Dim strTahun As String strTahun = Format(intTahun, "0000") 'pisahkan masing-masing digit (ribuan, ratusan, puluhan, satuan) dari strTahun... Dim intThnRibuan, intThnRatusan, intThnPuluhan, intThnSatuan As Integer intThnRibuan = Left(strTahun, 1) intThnRatusan = Mid(strTahun, 2, 1) intThnPuluhan = Mid(strTahun, 3, 1) intThnSatuan = Right(strTahun, 1) 'konversi angka ribuannya... If intThnRibuan = 1 Then strKalimat = strKalimat & "seribu" ElseIf intThnRibuan > 1 Then strKalimat = strKalimat & KalimatAngka(intThnRibuan) & " ribu" End If 'konversi angka ratusannya... If intThnRatusan = 1 Then strKalimat = strKalimat & " seratus" ElseIf intThnRatusan > 1 Then strKalimat = strKalimat & " " & KalimatAngka(intThnRatusan) & " ratus" End If 'konversi angka puluhan dan sekaligus satuannya... If intThnPuluhan = 0 Then 'bila angka puluhannya adalah 0, langsung konversi angka satuan... If intThnSatuan > 0 Then 'namun hanya lakukan konversi bila angka satuannya bukan 0 strKalimat = strKalimat & " " & KalimatAngka(intThnSatuan) End If ElseIf intThnPuluhan = 1 Then 'bila angka puluhannya adalah 1, berarti belasan... If intThnSatuan = 0 Then strKalimat = strKalimat & " sepuluh" ElseIf intThnSatuan = 1 Then strKalimat = strKalimat & " sebelas" Else strKalimat = strKalimat & " " & KalimatAngka(intThnSatuan) & " belas" End If ElseIf intThnPuluhan >= 2 Then 'bila angka puluhannya lebih dari 1, konversi dulu angka puluhannya... strKalimat = strKalimat & " " & KalimatAngka(intThnPuluhan) & " puluh" 'lalu konversi angka satuannya... If intThnSatuan > 0 Then 'hanya angka satuan yang bukan 0 yang dikonversi... strKalimat = strKalimat & " " & KalimatAngka(intThnSatuan) End If End If 'selesai konversi tahun. 'proses konversi selesai, kembalikan hasilnya kepada fungsi... TanggalKeKalimat = strKalimat End FunctionMaka sekarang tampilan layar VBA kira-kira akan seperti berikut ini:
Penjelasan Kode
Bila Anda mau cepat saja, silahkan lewati bagian ini. Disini saya coba jelaskan proses dan logika kode secara baris per baris bagi yang tertarik. Kode ini sengaja saya tulis dengan logika sederhana agar gampang diikuti, siapa tahu juga bisa merangsang teman-teman lain untuk menemukan cara lain menyelesaikan tugas ini.
Baris 1-13 mendefenisikan fungsi KalimatAngka() yang tugasnya mengkonversi angka dasar (1-9) ke dalam kata. Begitu juga baris 15-30, medefenisikan fungsi KalimatBulan() yang mengkonversi angka bulan menjadi kata nama bulan yang sesuai. Kedua fungsi ini nantinya akan digunakan oleh fungsi utama dibawahnya, yakni fungsi TanggalKeKalimat() pada baris 32-133.
Fungsi utama TanggalKeKalimat() bekerja dengan mengkonversi bagian per bagian dari tanggal. Baris 34 mempersiapkan tempat menyimpan hasil konversi sementara. Baris 37-40 memecah data tanggal yang di-input menjadi bagian-bagian tanggal, bulan dan tahun. Dan, baris 43 menambahkan kata awal 'tanggal' pada hasil konversi.
Public Function TanggalKeKalimat(ByVal tgl As Date) As String 'tempat menyimpan hasil konversi... Dim strKalimat As String 'pisahkan bagian tanggal, bulan dan tahun untuk diproses selanjutnya... Dim intTanggal, intBulan, intTahun As Integer intTanggal = Day(tgl) intBulan = Month(tgl) intTahun = Year(tgl)Baris 44-70 adalah proses konversi yang sebenarnya dan dibagi 5 bagian besar. [Bagian 1] Untuk angka 1-9 secara gampang dapat dikonversi langsung oleh fungsi KalimatAngka() (baris 46).
'--- KONVERSI TANGGAL strKalimat = "tanggal " If intTanggal = 1 And intTanggal <= 9 Then 'angka 1-9 konversi dengan fungsi KalimatAngka()... strKalimat = strKalimat & KalimatAngka(intTanggal)[Bagian 2] Angka 10 kita perlakukan khusus karena tidak menginginkan hasil 'satu nol' tapi 'sepuluh' (baris 49).
ElseIf intTanggal = 10 Then 'angka 10 diperlakukan secara khusus... strKalimat = strKalimat & "sepuluh"[Bagian 3] Begitu juga angka 11 kita perlakukan khusus karena hasil yang benar adalah 'sebelas', bukan 'satu satu' (baris 52).
ElseIf intTanggal = 11 Then 'angka 11 juga khusus... strKalimat = strKalimat & "sebelas"[Bagian 4] Untuk angka 12-19, pertama puluhan dibuang dan hanya diambil satuannya (baris 55). Angka satuannya ini yang kemudian dikonversi dan disambung dengan 'belas' (baris 57).
ElseIf intTanggal >= 12 And intTanggal <= 19 Then 'angka 12-19, hilangkan puluhan dan ambil satuannya... intTanggal = intTanggal - 10 'angka satuan lalu dikonversi dan ditambah dengan akhiran belas... strKalimat = strKalimat & KalimatAngka(intTanggal) & " belas"Selanjutnya angka yang kemungkinan masuk pada [Bagian 5] adalah tinggal angka 20-32 (tidak ada tanggal 33). Prosesnya disini pertama dengan mengubah dan memformat integer tanggal menjadi string (baris 60-61).
Else 'ubah intTanggal menjadi string strTanggal (format 2 digit)... Dim strTanggal As String strTanggal = Format(intTanggal, "00")Lalu tanggal ini diambil angka puluhan dan satuannya (baris 63-65).
'pisahkan angka puluhan dan angka satuan dari strTanggal... Dim intPuluhan, intSatuan As Integer intTglPuluhan = CInt(Left(strTanggal, 1)) intTglSatuan = CInt(Right(strTanggal, 1))Angka puluhan lalu dikonversi dengan fungsi KalimatAngka() disambung dengan kata 'puluh' (baris 67).
'konversi angka puluhan terlebih dahulu... strKalimat = strKalimat & KalimatAngka(intTglPuluhan) & " puluh"Angka satuan dikonversi dengan fungsi yang sama juga hanya apabila angka satuannya bukan 0 (baris 69-72).
'konversi angka satuan... If intTglSatuan > 0 Then 'bila bukan nol, angka satuan dikonversi dengan fungsi KalimatAngka()... strKalimat = strKalimat & " " & KalimatAngka(intTglSatuan) End If End If 'selesai menerjemahkan tanggal.Angka bulan dikonversi langsung dengan fungsi KalimatBulan() (baris 80).
'masukkan spasi dan kata antara tanggal dan bulan... strKalimat = strKalimat & " bulan " '--- KONVERSI BULAN 'bulan dikonversi secara mudah dengan fungsi KalimatBulan()... strKalimat = strKalimat & KalimatBulan(intBulan) 'masukkan spasi dan kata antara bulan dan tahun... strKalimat = strKalimat & " tahun "Angka tahun diformat menjadi string 4 digit terlebih dahulu (baris 87-88).
'--- KONVERSI TAHUN 'ubah intTahun menjadi string strTahun (format menjadi 4 digit)... Dim strTahun As String strTahun = Format(intTahun, "0000")Lalu masing-masing digit dipisahkan secara ribuan, ratusan, puluhan dan satuan (baris 90-94).
'pisahkan masing-masing digit (ribuan, ratusan, puluhan, satuan) dari strTahun... Dim intThnRibuan, intThnRatusan, intThnPuluhan, intThnSatuan As Integer intThnRibuan = Left(strTahun, 1) intThnRatusan = Mid(strTahun, 2, 1) intThnPuluhan = Mid(strTahun, 3, 1) intThnSatuan = Right(strTahun, 1)Angka ribuan, ratusan, puluhan dan satuan ini dikonversi secara satu-persatu, mulai dari ribuan (baris 96-100). Bila angka ribuannya adalah 1 maka hasil menjadi 'seribu', bila yang lain maka konversi dengan fungsi KalimatAngka() dan sambung dengan 'ribu'.
'konversi angka ribuannya... If intThnRibuan = 1 Then strKalimat = strKalimat & "seribu" ElseIf intThnRibuan > 1 Then strKalimat = strKalimat & KalimatAngka(intThnRibuan) & " ribu" End IfAngka ratusan juga dikonversi dengan pola yang sama dengan angka ribuan (baris 102-106).
'konversi angka ratusannya... If intThnRatusan = 1 Then strKalimat = strKalimat & " seratus" ElseIf intThnRatusan > 1 Then strKalimat = strKalimat & " " & KalimatAngka(intThnRatusan) & " ratus" End IfMengkonversi angka puluhan dan satuan, proses dibagi. Bila angka puluhannya 0, maka konversi angka satuannya (juga, hanya bila 0) (baris 108-113).
'konversi angka puluhan dan sekaligus satuannya... If intThnPuluhan = 0 Then 'bila angka puluhannya adalah 0, langsung konversi angka satuan... If intThnSatuan > 0 Then 'namun hanya lakukan konversi bila angka satuannya bukan 0 strKalimat = strKalimat & " " & KalimatAngka(intThnSatuan) End IfBila angka puluhannya adalah 1 maka dikonversi dengan metode konversi angka belasan pada tanggal seperti sebelumnya (baris 116-122).
ElseIf intThnPuluhan = 1 Then 'bila angka puluhannya adalah 1, berarti belasan... If intThnSatuan = 0 Then strKalimat = strKalimat & " sepuluh" ElseIf intThnSatuan = 1 Then strKalimat = strKalimat & " sebelas" Else strKalimat = strKalimat & " " & KalimatAngka(intThnSatuan) & " belas" End IfNamun bila angka puluhannya sama dengan atau lebih besar dari 2, maka dikonversi dengan mudah oleh fungsi KalimatAngkat() (baris 125-130).
ElseIf intThnPuluhan >= 2 Then 'bila angka puluhannya lebih dari 1, konversi dulu angka puluhannya... strKalimat = strKalimat & " " & KalimatAngka(intThnPuluhan) & " puluh" 'lalu konversi angka satuannya... If intThnSatuan > 0 Then 'hanya angka satuan yang bukan 0 yang dikonversi... strKalimat = strKalimat & " " & KalimatAngka(intThnSatuan) End If End If 'selesai konversi tahun.Baris 135 mengakhiri dengan mengembalikan hasil konversi kepada fungsi TanggalKeKalimat().
'proses konversi selesai, kembalikan hasilnya kepada fungsi... TanggalKeKalimat = strKalimat End Function
Menggunakannya pada Worksheet
Sekarang Anda dapat menutup layar VBA dan pindah ke layar Excel untuk mulai menggunakan kode di atas. Ketik tanggal pada salah satu cell (contoh: cell A1) atau lihat satu cell yang berisi tanggal di dalamnya dan tandai range-nya. Pada cell lain, ketik formula sebagai berikut:
=TanggalKeKalimat("A1")Menggunakan formula tersebut, Excel akan menjalankan kode yang disusun tadi dan menampilkan hasilnya. Berikut tampilan worksheet saya untuk mencobanya.
... ... ...
Sampai disini Anda telah menggunakan VBA untuk melakukan konversi tanggal ke kalimat sesuai dengan yang diinginkan. Bila perlu, Anda dapat mengubah beberapa baris kode di atas sesuai kebutuhan (contoh: penyesuaian huruf besar/kecil, dll). Trims sudah mengikuti tulisan ini!
sudah saya coba fungsinya, tapi mandegnya ketika pada tanggal belasan di konversinya hanya keluas kata "belas" bukan "dua belas" dst...mohon pencerahan..?
BalasHapusmaaf baru ada kesempatan buka blog lagi. trims sudah mencoba dan akhirnya ketahuan bahwa ternyata masih ada kesalahan di kode program sebelumnya di antara baris 54-57. sekarang sudah diperbaiki. trims :)
Hapusmohon petunjuk bila saya mau masukkan misal tanggal 2 september maka yang muncul puluh dua september, mohon arahannya
BalasHapusoh ya, baris ke 44 ada sedikit kesalahan tadinya. sudah di update sekarang (awalnya: "... intTanggal = 1 And ...", diperbaiki menjadi "... intTanggal >= 1 ..."). trims sudah mencoba dan memberi masukan.
HapusTerima kasih atas infonya.
BalasHapusTerima kasih atas informasinya ini sangat berguna bagi saya Sekali lagi saya ucapkan terima kasih.
BalasHapusTks min, tapi ada masalah saat sy memasukan perintah diatas. Rumus nya tak berfungsi sebagaimana mestinya. Pada konversi angka ribuan, elself intThnRibuan >1 then berwarna merah dan tak berfungsi. Mohon pencerahan nya min..
BalasHapussangat membantu syekali, semoga menjadi ladang pahala jariyah
BalasHapusKomentar ini telah dihapus oleh pengarang.
BalasHapusterima kasih, sangat menbantu ilmunya.....
BalasHapussemoga kedepan ada artikel yang menambahkan "kalimat harinya"