Pada UDF Terbilang sebelumnya, memiliki keterbatasan dimana Terbilang hanya mampu mengeksekusi hingga 2.147.483.647 saja.
Bagaimana agar terbilangnya bisa membaca hingga Triliun?
OK, sebelum kesana kita bahasa dulu kenapa Terbilang sebelumnya hanya sampai 2.147.483.647 saja, hal ini terjadi karena masih menggunakan TypeData long.
Pada VBA6 dan dibawahnya typedata Interget tertinggi ada pada Long, baru pada VBA7 (64bit) sudah ditambahkan Long Pointer (LongPtr) yang lebih panjang jankuannya hingga 8 Byte.
Solusi pertama jika teman-teman sudah menggunakan Office 64Bit, adalah mengubah Long menjadi LongPtr dan tambahkan Case untuk Triliun, sehingga scriptnya menjadi seperti dibawah ini
Function Terbilang(n As Currency) As String 'max 9.22337203685478E+18 (9 kuantiliun)
Dim satuan As Variant, Minus As Boolean
On Error GoTo terbilang_error
satuan = Array("", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Sepuluh", "Sebelas")
If n < 0 Then
Minus = True
n = n * -1
End If
Select Case n
Case 0 To 11
Terbilang = " " + satuan(Fix(n))
Case 12 To 19
Terbilang = Terbilang(n Mod 10) + " Belas"
Case 20 To 99
Terbilang = Terbilang(Fix(n / 10)) + " Puluh" + Terbilang(n Mod 10)
Case 100 To 199
Terbilang = " Seratus" + Terbilang(n - 100)
Case 200 To 999
Terbilang = Terbilang(Fix(n / 100)) + " Ratus" + Terbilang(n Mod 100)
Case 1000 To 1999
Terbilang = " Seribu" + Terbilang(n - 1000)
Case 2000 To 999999
Terbilang = Terbilang(Fix(n / 1000)) + " Ribu" + Terbilang(n Mod 1000)
Case 1000000 To 999999999
Terbilang = Terbilang(Fix(n / 1000000)) + " Juta" + Terbilang(n Mod 1000000)
Case 1000000000 To 999999999999#
Terbilang = Terbilang(Fix(n / 1000000000)) + " Milyar" + Terbilang(n Mod 1000000000)
Case Else
Terbilang = Terbilang(Fix(n / 1000000000000#)) + " Triliun" + Terbilang(n Mod 1000000000000#)
End Select
If Minus = True Then
Terbilang = "Minus" + Terbilang
End If
Exit Function
terbilang_error:
MsgBox Err.Description, vbCritical, "Terbilang Error"
End Function
Solusi kedua jika pada Excel kamu belum ada TypeData LongPtr, kamu bisa menggunakan Currency dengan catatan harus menambahkan Fungsi Modulus baru karena Fungsi Mod yang ada masih menggunakan typedata long di perhitungannya.
Sehingga Scriptnya menjadi seperti dibawah ini :
Function Terbilang(n As Currency) As String 'max 9.22337203685478E+18 (9 kuantiliun)
Dim satuan As Variant, Minus As Boolean
'On Error GoTo terbilang_error
satuan = Array("", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Sepuluh", "Sebelas")
If n < 0 Then
Minus = True
n = n * -1
End If
Select Case n
Case 0 To 11
Terbilang = " " + satuan(Fix(n))
Case 12 To 19
Terbilang = Terbilang(n Mod 10) + " Belas"
Case 20 To 99
Terbilang = Terbilang(Fix(n / 10)) + " Puluh" + Terbilang(n Mod 10)
Case 100 To 199
Terbilang = " Seratus" + Terbilang(n - 100)
Case 200 To 999
Terbilang = Terbilang(Fix(n / 100)) + " Ratus" + Terbilang(n Mod 100)
Case 1000 To 1999
Terbilang = " Seribu" + Terbilang(n - 1000)
Case 2000 To 999999
Terbilang = Terbilang(Fix(n / 1000)) + " Ribu" + Terbilang(n Mod 1000)
Case 1000000 To 999999999
Terbilang = Terbilang(Fix(n / 1000000)) + " Juta" + Terbilang(n Mod 1000000)
Case 1000000000 To 999999999999#
Terbilang = Terbilang(Fix(n / 1000000000)) + " Milyar" + Terbilang(Modulus(n, 1000000000))
Case Else
Terbilang = Terbilang(Fix(n / 1000000000000#)) + " Triliun" + Terbilang(Modulus(n, 1000000000000#))
End Select
If Minus = True Then
Terbilang = "Minus" + Terbilang
End If
Exit Function
terbilang_error:
MsgBox Err.Description, vbCritical, "Terbilang Error"
End Function
Dan tambahkan Function Modulus dibawahnya
Function Modulus(Angka1 As Currency, Angka2 As Currency) As Currency Dim MyMod As Currency MyMod = Int(Angka1 / Angka2) Modulus = Angka1 - (MyMod * Angka2) End Function
Simpan script diatas pada Standard Module, Jika sudah maka rumus terbilang sudah bisa digunakana.
Dan berikut ini hasil pengujuan rumus terbilang diatas.
