Konversi Angka ke Kalimat pada Excel dengan VBA

  • 2
Penggiat Excel yang banyak bekerja dengan keuangan, umumnya kenal dengan add-on Excel yang bernama 'Terbilang'. Add-on ini cukup ampuh dan akurat untuk mengkonversi angka menjadi kalimat. Kebetulan, seorang teman baru saja mendapatkan notebook PC barunya dengan Windows 10 dan Office 2010. Dan ternyata, add-on tersebut tidak dapat digunakan di Office 2010. Sebagai alternatif, saya coba share kode program untuk konversi angka ke kalimat menggunakan Visual Basic for Application (VBA) yang secara default telah ada di Excel.


Sebelum lanjut, bagi teman-teman yang baru saja tiba disini, mungkin perlu sedikit pemanasan dengan membaca tulisan sebelumnya terkait konversi tanggal ke kalimat, yakni Formula untuk Konversi Tanggal ke Kalimat pada Excel dan Konversi Tanggal ke Kalimat pada Excel (lanjutan).

Tulisan kali ini, saya masih belum sempat menjelaskan baris per baris kode programnya. Mungkin lain kali. Saya telah bubuhkan beberapa komentar seperlunya untuk membantu memperjelas alur program, namun bila ada yang membutuhkan penjelasan detailnya, lain waktu saya akan coba menambahkan bagian penjelasannya. Untuk sekarang, cukup copy-paste saja kode program berikut dan seharusnya ia bisa berjalan dengan baik.



Saya orang baru; Apa itu VBA pada Excel..??


Hmm, cobalah bicara dengan google. Dia tahu banyak. Untuk kali ini saya langsung mengajak teman-teman membuka Excel dan kemudian membuka layar VBA dengan menekan kombinasi tombol
Alt + F11
Berikut screenshot-nya:





Memasukkan kode program


Di tampilan tadi pada bagian Jendela Project, pilih (dengan mengklik) VBAProject dan kemudian ambil menu:
Insert > Module
Setelah itu VBA akan menambahkan Module1 pada Jendela Project. Klik-ganda di Module1 untuk membuka dan menampilkan isinya pada Jendela Kerja. Untuk sekarang, isi Module1 di Jendela Kerja masih kosong. Langsung saja, copy kode program berikut dan paste di Jendela Kerja.
Public Function SatuAngkaKeHuruf(ByVal angka As Integer) As String
    Dim strKata As String
    Select Case angka
        Case 0: strKata = "nol"
        Case 1: strKata = "satu"
        Case 2: strKata = "dua"
        Case 3: strKata = "tiga"
        Case 4: strKata = "empat"
        Case 5: strKata = "lima"
        Case 6: strKata = "enam"
        Case 7: strKata = "tujuh"
        Case 8: strKata = "delapan"
        Case 9: strKata = "sembilan"
    End Select
    SatuAngkaKeHuruf = strKata
End Function
 
Public Function TigaAngkaKeHuruf(ByVal angka As Integer) As String
    'tempat menyimpan hasil konversi...
    Dim strKalimat As String
    strKalimat = ""
    'ubah angka ke text dengan tiga karakter...
    Dim strAngka As String
    strAngka = Format(angka, "000")
    'ambil bagian ratusan dan bagian puluhan-satuan...
    Dim intRatusan, intPuluhanSatuan As Integer
    intRatusan = CInt(Left(strAngka, 1))
    intPuluhanSatuan = CInt(Right(strAngka, 2))
    'konversi bagian ratusan ke kalimat...
    If intRatusan >= 1 Then
        If intRatusan = 1 Then
            strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & "seratus"
        Else
            strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & SatuAngkaKeHuruf(intRatusan) & " ratus"
        End If
    End If
    'konversi bagian puluhan-satuan ke kalimat...
    Dim intPuluhan, intSatuan As Integer
    If intPuluhanSatuan >= 1 And intPuluhanSatuan <= 9 Then
        strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & SatuAngkaKeHuruf(intPuluhanSatuan)
    ElseIf intPuluhanSatuan = 10 Then
        strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & "sepuluh"
    ElseIf intPuluhanSatuan = 11 Then
        strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & "sebelas"
    ElseIf intPuluhanSatuan >= 12 And intPuluhanSatuan <= 19 Then
        intSatuan = intPuluhanSatuan - 10
        strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & SatuAngkaKeHuruf(intSatuan) & " belas"
    ElseIf intPuluhanSatuan >= 20 Then
        Dim strPuluhanSatuan As String
        strPuluhanSatuan = Format(intPuluhanSatuan, "00")
        intPuluhan = CInt(Left(strPuluhanSatuan, 1))
        intSatuan = CInt(Right(strPuluhanSatuan, 1))
        strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & SatuAngkaKeHuruf(intPuluhan) & " puluh"
        If intSatuan > 0 Then
            strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & SatuAngkaKeHuruf(intSatuan)
        End If
    End If
    'hasil akhir...
    TigaAngkaKeHuruf = strKalimat
End Function
 
Public Function NamaRibuan(ByVal urutan As Integer) As String
    Dim strNama As String
    Select Case urutan
        Case 1: strNama = ""
        Case 2: strNama = "ribu"
        Case 3: strNama = "juta"
        Case 4: strNama = "milyar"
        Case 5: strNama = "trilyun"
        Case 6: strNama = "ribu trilyun"
    End Select
    NamaRibuan = strNama
End Function
 
Public Function AngkaKeKalimat(ByVal angka As Double, Optional ByVal presisi As Integer = 0) As String
    'periksa nilai negatif dan simpan untuk nanti...
    Dim isNegatif As Boolean
    If angka < 0 Then
        isNegatif = True
    Else
        isNegatif = False
    End If
    'hilangkan status negatif...
    angka = Abs(angka)
    'pisahkan dan ambil bagian nondesimal-nya dan desimal-nya...
    Dim intNonDecimal, intDecimal As Integer
    intNonDecimal = Int(angka)
    If presisi = 0 Then
        intDecimal = 0
    Else
        intDecimal = Int((angka - CDec(intNonDecimal)) * WorksheetFunction.Power(10, presisi))
    End If
    'tempat menyimpan hasil konversi...
    Dim strKalimat As String
    strKalimat = ""
     
    'proses konversi bagian nondesimal...
     
    'ubah bagian nondesimal ke text...
    Dim strNonDecimal As String
    strNonDecimal = CStr(intNonDecimal)
    'hitung jumlah sub-bagian per tiga digit...
    Dim intCount As Integer
    intCount = WorksheetFunction.RoundUp(Len(strNonDecimal) / 3, 0)
    'proses loop konversi setiap loop sub-bagian...
    Dim strWorking, strRibuan, strResult As String
    For i = 1 To intCount
        strNonDecimal = Left(strNonDecimal, Len(strNonDecimal) - 3 * IIf(i = 1, 0, 1))
        strWorking = strNonDecimal
        If Len(strWorking) > 3 Then
            strWorking = Right(strWorking, 3)
        End If
        strRibuan = NamaRibuan(i)
        strResult = TigaAngkaKeHuruf(CInt(strWorking))
        If strResult <> "" Then
            strKalimat = TigaAngkaKeHuruf(CInt(strWorking)) & IIf(strRibuan <> "", " " & strRibuan, "") & IIf(strKalimat <> "", " ", "") & strKalimat
        End If
    Next i
     
    'proses konversi bagian desimal...
     
    'lakukan konversi hanya bila parameter kedua (presisi) telah ditentukan...
    If presisi > 0 Then
        Dim strDecimal, strFormatPresisi, strPresisi As String
        strFormatPresisi = String(presisi, "0")
        strDecimal = Format(intDecimal, strFormatPresisi)
        If strKalimat = "" Then strKalimat = "nol"
        strKalimat = strKalimat & IIf(strKalimat <> "", " ", "") & "koma"
        For i = 1 To presisi
            strPresisi = Right(strDecimal, Len(strDecimal) - (i - 1))
            strKalimat = strKalimat & " " & SatuAngkaKeHuruf(CInt(Left(strPresisi, 1)))
        Next i
    End If
    'hasil akhir konversi...
    AngkaKeKalimat = IIf(isNegatif, "negatif ", "") & Replace(strKalimat, "satu ribu", "seribu")
    'ubah huruf pertama menjadi huruf besar...
    AngkaKeKalimat = UCase(Left(AngkaKeKalimat, 1)) & LCase(Right(AngkaKeKalimat, Len(AngkaKeKalimat) - 1))
End Function






Menggunakan Formula di Worksheet Excel


Okey, sekarang cukup dengan VBA, kita pindah ke tampilan worksheet Excel untuk mencoba gunakan formula tadi. Format penggunaannya:
=AngkaKeKalimat(angka, [presisi])
Formula menerima 2 parameter. Untuk parameter pertama, yakni angka, adalah angka yang akan dikonversi menjadi kalimat. Dan parameter kedua, yakni presisi, adalah jumlah angka dibelakang koma yang ikut dikonversi. Bila parameter kedua ini tidak diberikan, maka dianggap presisi = 0 (artinya, angka dibelakang koma tidak ikut dikonversi).



Selamat mencoba!

2 komentar :