Formula untuk Konversi Tanggal menjadi Kalimat pada Excel

  • 10
Baru-baru ini seorang teman kerja meminta bantuan untuk dibuatkan fomula/rumus untuk menerjemahkan/mengkonversi tanggal menjadi kalimat pada Excel (contoh: "09/01/2015" menjadi "tanggal satu bulan september tahun dua ribu lima belas"). Dia memulai dengan sebuah workbook Excel yang di salah satu worksheet-nya menyimpan tanggal yang dirujuk, dan di worksheet lain tanggal tersebut harus tertulis sebagai kalimat. Saya akan coba uraikan cara mudah membuat dan menggunakannya, bahkan bagi pengguna Excel yang tidak memahami programming VBA sama sekali (main copy dan paste saja, hehehe).


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 Ribbon
dan 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 + F11
Tampilannya 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 > Module
Perhatikan 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 Function
Maka 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 If
Angka 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 If
Mengkonversi 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 If
Bila 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 If
Namun 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!

10 komentar :

  1. sudah saya coba fungsinya, tapi mandegnya ketika pada tanggal belasan di konversinya hanya keluas kata "belas" bukan "dua belas" dst...mohon pencerahan..?

    BalasHapus
    Balasan
    1. maaf 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 :)

      Hapus
  2. mohon petunjuk bila saya mau masukkan misal tanggal 2 september maka yang muncul puluh dua september, mohon arahannya

    BalasHapus
    Balasan
    1. oh 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.

      Hapus
  3. Terima kasih atas informasinya ini sangat berguna bagi saya Sekali lagi saya ucapkan terima kasih.

    BalasHapus
  4. Tks 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..

    BalasHapus
  5. sangat membantu syekali, semoga menjadi ladang pahala jariyah

    BalasHapus
  6. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  7. terima kasih, sangat menbantu ilmunya.....
    semoga kedepan ada artikel yang menambahkan "kalimat harinya"

    BalasHapus