Question: In Excel, I’m seeking a way to transform a numeric value in Kuwaiti Dinars into words. For instance, if it’s 120.050 KWD, then it should be converted to “One Hundred Twenty Kuwaiti Dinars and Fifty Fils Only.” Similarly, if the value is 100 KWD, it should be converted to “One Hundred Kuwaiti Dinars Only.
Solution:
1. Press Alt + F11 keys to open the Microsoft Visual Basic for Application window.
2. Click Insert > Module and paste below VBA to the new Module window.
Function SpellKD(ByVal MyNumber)
'**** Created by Ariful Islam
'**** arifulsh.com
'**** Last updated 02-April-2021
'**** SpellKD shows KD to precede, and to show "" for 0 Fils)
'****************' Main Function *'****************
Dim Kuwaiti_Dinar, Fils, Temp
Dim DecimalPlace, Count
ReDim Place(9) As String
Place(2) = " Thousand "
Place(3) = " Lac "
Place(4) = " Crore "
Place(5) = " Arab " ' String representation of amount
MyNumber = Trim(Str(MyNumber)) ' Position of decimal place 0 if none
DecimalPlace = InStr(MyNumber, ".")
' Convert Fils and set MyNumber to Dinar amount
If DecimalPlace > 0 Then
Fils = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2))
MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
End If
Count = 1
Do While MyNumber <> ""
If Count = 1 Then Temp = GetHundreds(Right(MyNumber, 3))
If Count > 1 Then Temp = GetHundreds(Right(MyNumber, 2))
If Temp <> "" Then Kuwaiti_Dinar = Temp & Place(Count) & Kuwaiti_Dinar
If Count = 1 And Len(MyNumber) > 3 Then
MyNumber = Left(MyNumber, Len(MyNumber) - 3)
Else
If Count > 1 And Len(MyNumber) > 2 Then
MyNumber = Left(MyNumber, Len(MyNumber) - 2)
Else
MyNumber = ""
End If
End If
Count = Count + 1
Loop
Select Case Kuwaiti_Dinar
Case ""
KD = ""
Case "One"
KD = "One Kuwaiti Dinar"
Case Else
'****************************************************************
'modified the following two lines to display "KD" to precede
' rem'd the first line and added the second line
'****************************************************************
'KD = KD & " KD"
Kuwaiti_Dinar = Kuwaiti_Dinar & " Kuwaiti Dinar"
End Select
Select Case Fils
Case ""
'****************************************************************
'modified the following two lines to display nothing for no Fils
' rem'd the first line and added the second line
'****************************************************************
'Fils = " and No Fils"
'****************************************************************
'modified the following line to display " Only" for no Fils
' rem'd the first line and added the second line
'****************************************************************
'Fils = ""
Fils = " Only"
Case "One"
Fils = " and One Fils"
Case Else
Fils = " and " & Fils & " Fils"
End Select
SpellKD = Kuwaiti_Dinar & Fils
End Function
'*******************************************
' Converts a number from 100-999 into text *
'*******************************************
Function GetHundreds(ByVal MyNumber)
Dim Result As String
If Val(MyNumber) = 0 Then Exit Function
MyNumber = Right("000" & MyNumber, 3) 'Convert the hundreds place
If Mid(MyNumber, 1, 1) <> "0" Then
Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred "
End If
'Convert the tens and ones place
If Mid(MyNumber, 2, 1) <> "0" Then
Result = Result & GetTens(Mid(MyNumber, 2))
Else
Result = Result & GetDigit(Mid(MyNumber, 3))
End If
GetHundreds = Result
End Function
'*********************************************
' Converts a number from 10 to 99 into text. *
'*********************************************
Function GetTens(TensText)
Dim Result As String
Result = "" ' null out the temporary function value
If Val(Left(TensText, 1)) = 1 Then ' If value between 10-19
Select Case Val(TensText)
Case 10: Result = "Ten"
Case 11: Result = "Eleven"
Case 12: Result = "Twelve"
Case 13: Result = "Thirteen"
Case 14: Result = "Fourteen"
Case 15: Result = "Fifteen"
Case 16: Result = "Sixteen"
Case 17: Result = "Seventeen"
Case 18: Result = "Eighteen"
Case 19: Result = "Nineteen"
Case Else
End Select
Else ' If value between 20-99
Select Case Val(Left(TensText, 1))
Case 2: Result = "Twenty"
Case 3: Result = "Thirty"
Case 4: Result = "Forty"
Case 5: Result = "Fifty"
Case 6: Result = "Sixty"
Case 7: Result = "Seventy"
Case 8: Result = "Eighty"
Case 9: Result = "Ninety"
Case Else
End Select
Result = Result & GetDigit _
(Right(TensText, 1)) 'Retrieve ones place
End If
GetTens = Result
End Function
'*******************************************
' Converts a number from 1 to 9 into text. *
'*******************************************
Function GetDigit(Digit)
Select Case Val(Digit)
Case 1: GetDigit = "One"
Case 2: GetDigit = "Two"
Case 3: GetDigit = "Three"
Case 4: GetDigit = "Four"
Case 5: GetDigit = "Five"
Case 6: GetDigit = "Six"
Case 7: GetDigit = "Seven"
Case 8: GetDigit = "Eight"
Case 9: GetDigit = "Nine"
Case Else: GetDigit = ""
End Select
End Function
However, the counting mechanism will only recognize the initial two digits of fils and cannot exceed 99 fils.
Sample File : Download
Like it
21