Skip to main content

Cara Sederhana Membuat Fungsi Terbilang di MS Acess VBA


Di berbagai macam tagihan atau kuitansi, kita sering menjumpai baris yang berisi kata "Terbilang". Baris terbilang ini merupakan fungsi yang digunakan untuk menjelaskan angka jumlah tertagih/dibayarkan dalam bentuk kata-kata. Sebagai contoh, selembar tagihan telepon dari operator seluler berjumlah sebesar Rp 446.999 yang diucapkan menjadi Empat Ratus Empat Puluh Enam Ribu Sembilan Ratus Sembilan Puluh Sembilan Rupiah.

Baris Terbilang pada tagihan telepon seluler
Baris terbilang ini mungkin nampak sepele. Kenapa sepele? Karena ada banyak tagihan yang diterbitkan oleh berbagai macam perusahaan tetapi tidak menampilkan baris terbilang seperti ini. Entah dianggap tidak penting atau karena tidak tahu cara membuat program fungsi terbilang menggunakan aplikasi komputer, saya kurang tahu juga. Secara pribadi, saya lebih suka baris terbilang dicantumkan dalam sebuah tagihan, karena dapat menghindarkan kita dari kesalahan baca, apabila jumlah yang dituliskan dengan angka tida terbaca dengan jelas. Apalagi bila tagihan itu berupa kuitansi yang ditulis tangan (secara manual), maka makna terbilang akan menjadi penting.

Berikut ini adalah kode VBA di MS Access yang digunakan untuk menuliskan fungsi terbilang.


Function terbilang(curAngka As Currency, strKodeMataUang As String) As String
  Dim strPengucapan As String, strAngka As String
  Dim str3Digit As String, strSen, strPuluhan As String
  Dim strRatusan As Integer, intPuluhan As Integer, intSatuan As Integer
  Dim intLoopCount As Integer, intNilaiAwal As Integer
  Dim boolAdaSen As Boolean
  Dim strBacaAngka(21) As String
  strBacaAngka(0) = ""
  strBacaAngka(1) = "satu"
  strBacaAngka(2) = "dua"
  strBacaAngka(3) = "tiga"
  strBacaAngka(4) = "empat"
  strBacaAngka(5) = "lima"
  strBacaAngka(6) = "enam"
  strBacaAngka(7) = "tujuh"
  strBacaAngka(8) = "delapan"
  strBacaAngka(9) = "sembilan"
  strBacaAngka(10) = "sepuluh"
  strBacaAngka(11) = "sebelas"
  strBacaAngka(12) = "dua belas"
  strBacaAngka(13) = "tiga belas"
  strBacaAngka(14) = "empat belas"
  strBacaAngka(15) = "lima belas"
  strBacaAngka(16) = "enam belas"
  strBacaAngka(17) = "tujuh belas"
  strBacaAngka(18) = "delapan belas"
  strBacaAngka(19) = "sembilan belas"
  strBacaAngka(20) = "dua puluh"
'Jika curAngka=0 tuliskan VOID dan keluar dari fungsi
  If Nz(curAngka) = 0 Then
    terbilang = "VOID"
    Exit Function
  End If
'Pengaturan awal
  strAngka = Format(curAngka, "000000000000.00") 'Memformat angka menjadi teks sepanjang 15 karakter
  Debug.Print Format(curAngka, "###,###.00")
  boolAdaSen = False
  strSen = Mid(strAngka, 14, 2) 'Cek nilai sen sepanjang 2 karakter di sebelah kanan strAngka
  If Val(strSen) <> 0 Then boolAdaSen = True 'Jika nilai sen tidak sama dengan nol, berarti ada sen.
  
  strPengucapan = ""
  intLoopCount = 1 'intLoopCount mulai dari 1
  intNilaiAwal = 1
'Mulai proses looping dengan Do While
  Do While intLoopCount <= 4 'Lakukan perhitungan di bawah ini bila intLoop kurang dari atau sama dengan 4
    str3Digit = Mid(strAngka, intNilaiAwal, 3) 'Mengambil strAngka sepanjang tiga digit
    strRatusan = Val(Mid(str3Digit, 1, 1)) 'Mengambil bagian dari str3Digit yang menjadi ratusan
    intPuluhan = Val(Mid(str3Digit, 2, 2)) 'Mengambil bagian dari str3Digit yang menjadi puluhan
    intSatuan = Val(Mid(str3Digit, 3, 1)) 'Mengambil bagian dari str3Digit yang menjadi satuan
    
    If Val(str3Digit) >= 100 Then 'Jika nilai integer dari str3Digit lebih dari atau sama dengan 100, maka
      If Val(str3Digit) < 200 Then 'Jika nilai integer dari str3Digit kurang dari 200, maka
        strPengucapan = strPengucapan & "seratus " 'Diucapkan 'seratus'
      Else 'bila lebih dari atau sama dengan 200. maka
        strPengucapan = strPengucapan & strBacaAngka(strRatusan) & " ratus " 'ucapkan sesuai dengan array ditambah ratus
      End If
    End If
    If intPuluhan < 21 Then
      strPengucapan = strPengucapan & " " & strBacaAngka(intPuluhan)
    Else
      strPuluhan = CStr(intPuluhan)
      strPengucapan = strPengucapan & strBacaAngka(Val(Left(strPuluhan, 1))) & " puluh " & strBacaAngka(Val(Right(strPuluhan, 1)))
    End If
    
    If curAngka >= 1000000000 And intLoopCount = 1 Then
      strPengucapan = strPengucapan & " milyar"
    End If
    
    If curAngka >= 1000000 And intLoopCount = 2 Then
      If str3Digit <> "000" Then strPengucapan = strPengucapan & " juta "
    End If
    
    If curAngka >= 1000 And intLoopCount = 3 Then
      If curAngka < 2000 Then
        strPengucapan = "seribu"
      Else
        If str3Digit <> "000" Then strPengucapan = strPengucapan & " ribu "
      End If
    End If
    
    intLoopCount = intLoopCount + 1
    intNilaiAwal = intNilaiAwal + 3
    If intLoopCount <> 1 Then strPengucapan = strPengucapan & " "
  Loop
  strPengucapan = strPengucapan & " " & ejaMataUang(strKodeMataUang)
  If boolAdaSen Then
    If Val(strSen) < 21 Then
      strPengucapan = strPengucapan & IIf(curAngka < 1, "", " dan ") & _
                    strBacaAngka(Val(strSen)) & " sen"
    Else
      strPuluhan = CStr(intPuluhan)
      strPengucapan = strPengucapan & IIf(curAngka < 1, "", " dan ") & _
                    strBacaAngka(Val(Left(Val(strSen), 1))) & " puluh " & strBacaAngka(Val(Right(Val(strSen), 1))) & _
                    " sen"
    End If
  End If
  While InStr(strPengucapan, "  ") > 0
    strPengucapan = Replace(strPengucapan, "  ", " ")
  Wend
 terbilang = Trim(UCase(strPengucapan))
End Function
Bagian awal dari fungsi itu berisi deklarasi varibel beserta pemberian nilai konstanta. Setelah itu, angka yang ingin "dibilang" dikonversi lebih dulu ke teks/string sepanjang 15 karakter digit melalui pernyataan strAngka = Format(curAngka, "000000000000.00"). Nah, dari teks sepanjang 15 karakter angka ini, kita membaginya menjadi 2 bagian, yang dipisahkan oleh tanda titik. Bagian pertama digunakan untuk membaca bilangan bulat, sepanjang 12 digit. Bagian kedua untuk membaca bilangan pecahan yang digunakan sebagai nilai sen, sepanjang dua digit di posisi paling kanan.

Bilangan bulat sepanjang 12 digit kemudian dipecah menjadi 4 bagian, masing-masing sepanjang 3 digit yang digunakan untuk membaca angka ratusan, puluhan, dan satuan. Dengan menggunakan loop melalui pernyataan Do While intLoopCount <= 4 ... Loop, kita memproses setiap 3 digit untuk membilang ratusan, puluhan, dan satuan dengan menggunakan statement if ... end if.

Loop pertama dengan panjang 3 digit merupakan angka milyar. Bila angka yang ingin "dibilang" lebih dari atau sama dengan 1 milyar, maka kita menambahkan "milyar". Loop kedua dengan panjang 3 digit merupakan angka jutaan. Bila angka yang ingin "dibilang" lebih dari atau sama dengan 1 juta, maka kita menambahkan "juta". Loop ketiga dengan panjang 3 digit merupakan angka ribuan. Bila angka yang ingin "dibilang" lebih dari atau sama dengan 1000, maka kita menambahkan "ribu".

Setelah proses looping selesai, maka kita akan membaca mata uang yang dipakai di variabel strKodeMataUang, yaitu dengan menggunakan fungsi ejaMataUang(strKodeMataUang) yang ada dalam pernyataan strPengucapan = Trim(strPengucapan) & " " & ejaMataUang(strKodeMataUang). Kode VBA dari fungsi ejaMataUang dapat dibaca di posting yang berjudul Menggunakan Array Sebagai Nilai Sebuah Konstanta (Const) di VBA Access.

Selanjutnya, bila angka yang ingin "dibilang" berisi pecahan, maka pecahan ini diproses untuk bisa diucapkan sebagai sen. Terakhir, Setelah semua proses membilang selesai, ubah semua huruf menjadi huruf besar semua.

Berkut ini adalah bebarapa contoh eksekusi fungsi terbilang di atas yang dilakukana di Immediate Window:

?terbilang(1000,"IDR")
1,000.00
SERIBU RUPIAH

?terbilang(1123,"IDR")
1,123.00
SERIBU SERATUS DUA PULUH TIGA RUPIAH

?terbilang(12345.12,"IDR")
12,345.12
DUA BELAS RIBU TIGA RATUS EMPAT PULUH LIMA RUPIAH DAN DUA BELAS SEN

?terbilang(1234531233.12,"IDR")
1,234,531,233.12
SATU MILYAR DUA RATUS TIGA PULUH EMPAT JUTA LIMA RATUS TIGA PULUH SATU RIBU DUA RATUS TIGA PULUH TIGA RUPIAH DAN DUA BELAS SEN

?terbilang(10110.21,"USD")
10,110.21
SEPULUH RIBU SERATUS SEPULUH DOLAR AMERIKA DAN DUA PULUH SATU SEN

?terbilang(10110123.01,"JPY")
10,110,123.01
SEPULUH JUTA SERATUS SEPULUH RIBU SERATUS DUA PULUH TIGA YEN JEPANG DAN SATU SEN

Comments

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access