Try this new UDF that I have written:
Function NumberWords(Value As Double, Optional Style As Integer, Optional Enclose As Boolean, Optional CurrencyRef As String) As Variant
' ------------------------------------------------------------------------------------------------------------
' XXX XXX XXXXXXXX XXXXXXXXX A New Way of Doing Things!
' XXX XXX XXXXXXXXX XXXXXXXXX
' XXX XXX XXX XXX XXX
' XXX XXX XXX XXX XXXXXX
' XXX XXX XXX XXX XXXXXX
' XXX XXX XXX XXX XXX
' XXXXXXXXX XXXXXXXXX XXX EXCEL
' XXXXXXX XXXXXXXX XXX USER DEFINED FUNCTION By: Larry Hash - 2009 Email: lhasha@usa.com
' ------------------------------------------------------------------------------------------------------------
'DESCRIPTION
'Returns verbose english word string that represents a specified value.
'Optional style selection results in (1) lowercase, (2) Sentence Case, or (3) UPPERCASE.
'Optional enclosure value of TRUE adds leading and trailing asteriks (****) to word string.
'Optional CurrencyRef adds a verbose currency name to the end of the word string (i.e. dollar, euro etc.).
'Current function limits value inputs to -999999999.99 to 999999999.99
Dim NWord(100) As String
'DEFINE NUMBER WORD ARRAY 0 THROUGH 99
NWord(0) = "zero": NWord(1) = "one": NWord(2) = "two": NWord(3) = "three": NWord(4) = "four"
NWord(5) = "five": NWord(6) = "six": NWord(7) = "seven": NWord(8) = "eight": NWord(9) = "nine"
NWord(10) = "ten": NWord(11) = "eleven": NWord(12) = "twelve": NWord(13) = "thirteen"
NWord(14) = "fourteen": NWord(15) = "fifteen": NWord(16) = "sixteen": NWord(17) = "seventeen"
NWord(18) = "eighteen": NWord(19) = "nineteen": NWord(20) = "twenty": NWord(21) = "twenty-one"
NWord(22) = "twenty-two": NWord(23) = "twenty-three": NWord(24) = "twenty-four"
NWord(25) = "twenty-five": NWord(26) = "twenty-six": NWord(27) = "twenty-seven"
NWord(28) = "twenty-eight": NWord(29) = "twenty-nine": NWord(30) = "thirty": NWord(31) = "thirty-one"
NWord(32) = "thirty-two": NWord(33) = "thirty-three": NWord(34) = "thirty-four"
NWord(35) = "thirty-five": NWord(36) = "thirty-six": NWord(37) = "thirty-seven"
NWord(38) = "thirty-eight": NWord(39) = "thirty-nine": NWord(40) = "forty": NWord(41) = "forty-one"
NWord(42) = "forty-two": NWord(43) = "forty-three": NWord(44) = "forty-four": NWord(45) = "forty-five"
NWord(46) = "forty-six": NWord(47) = "forty-seven": NWord(48) = "forty-eight": NWord(49) = "forty-nine"
NWord(50) = "fifty": NWord(51) = "fifty-one": NWord(52) = "fifty-two": NWord(53) = "fifty-three"
NWord(54) = "fifty-four": NWord(55) = "fifty-five": NWord(56) = "fifty-six": NWord(57) = "fifty-seven"
NWord(58) = "fifty-eight": NWord(59) = "fifty-nine": NWord(60) = "sixty": NWord(61) = "sixty-one"
NWord(62) = "sixty-two": NWord(63) = "sixty-three": NWord(64) = "sixty-four": NWord(65) = "sixty-five"
NWord(66) = "sixty-six": NWord(67) = "sixty-seven": NWord(68) = "sixty-eight": NWord(69) = "sixty-nine"
NWord(70) = "seventy": NWord(71) = "seventy-one": NWord(72) = "seventy-two": NWord(73) = "seventy-three"
NWord(74) = "seventy-four": NWord(75) = "seventy-five": NWord(76) = "seventy-six": NWord(77) = "seventy-seven"
NWord(78) = "seventy-eight": NWord(79) = "seventy-nine": NWord(80) = "eighty": NWord(81) = "eighty-one"
NWord(82) = "eighty-two": NWord(83) = "eighty-three": NWord(84) = "eighty-four": NWord(85) = "eighty-five"
NWord(86) = "eighty-six": NWord(87) = "eighty-seven": NWord(88) = "eighty-eight": NWord(89) = "eighty-nine"
NWord(90) = "ninety": NWord(91) = "ninety-one": NWord(92) = "ninety-two": NWord(93) = "ninety-three"
NWord(94) = "ninety-four": NWord(95) = "ninety-five": NWord(96) = "ninety-six": NWord(97) = "ninety-seven"
NWord(98) = "ninety-eight": NWord(99) = "ninety-nine"
'ROUND VALUE TO NEAREST 100THS
Value = Round(Value, 2)
CurrencyRef = LCase(CurrencyRef)
'ERROR IF VALUE EXCEEDS UPWARD LIMITS (MUST BE LESS TAHN ONE BILLION)
If Abs(Value) > 999999999.99 Then Word = CVErr(xlErrNum): GoTo ErrorOut
'ASSIGN NEGATIVE TO WORD IF VALUE IS LESS THAN ZERO
If Value < 0 Then PreFix = "negative ": Value = Abs(Value)
'CONSTRUCT FRACTIONAL STRING
NStr = Trim(Str(Int(Value)))
TDec = Str(Value)
If InStr(1, TDec, ".") = 0 Then TDec = ".00"
If InStr(1, TDec, ".") = Len(TDec) - 1 Then TDec = TDec + "0"
NRem = Mid(TDec, InStr(1, TDec, ".") + 1)
If Len(NRem) > 2 Then NRem = Mid(NRem, 1, 2)
'CONSTRUCT VERBOSE NUMBER WORDS
If Len(NStr) < 3 Then 'ONES AND TENS
Word = NWord(Val(NStr))
End If
If Len(NStr) = 3 Then 'HUNDREDS
Word = NWord(Val(Mid(NStr, 1, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 2, 2)))
End If
If Len(NStr) = 4 Then 'THOUSANDS
Word = NWord(Val(Mid(NStr, 1, 1))) + " thousand "
Word = Word + NWord(Val(Mid(NStr, 2, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 3, 2)))
End If
If Len(NStr) = 5 Then 'TENS OF THOUSANDS
Word = NWord(Val(Mid(NStr, 1, 2))) + " thousand "
Word = Word + NWord(Val(Mid(NStr, 3, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 4, 2)))
End If
If Len(NStr) = 6 Then 'HUNDREDS OF THOUSANDS
Word = NWord(Val(Mid(NStr, 1, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 2, 2))) + " thousand "
Word = Word + NWord(Val(Mid(NStr, 4, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 5, 2)))
End If
If Len(NStr) = 7 Then 'MILLIONS
Word = NWord(Val(Mid(NStr, 1, 1))) + " million "
Word = Word + NWord(Val(Mid(NStr, 2, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 3, 2))) + " thousand "
Word = Word + NWord(Val(Mid(NStr, 5, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 6, 2)))
End If
If Len(NStr) = 8 Then 'TENS OF MILLIONS
Word = NWord(Val(Mid(NStr, 1, 2))) + " million "
Word = Word + NWord(Val(Mid(NStr, 3, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 4, 2))) + " thousand "
Word = Word + NWord(Val(Mid(NStr, 6, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 7, 2)))
End If
If Len(NStr) = 9 Then 'HUNDREDS OF MILLIONS
Word = NWord(Val(Mid(NStr, 1, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 2, 2))) + " million "
Word = Word + NWord(Val(Mid(NStr, 4, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 5, 2))) + " thousand "
Word = Word + NWord(Val(Mid(NStr, 7, 1))) + " hundred "
Word = Word + NWord(Val(Mid(NStr, 8, 2)))
End If
'ADD LEADING NEGATIVE TO WORD IF VALUE IS LESS THAN ZERO
Word = PreFix + Word
'ADD FRACTIONAL 100THS TO WORD
Word = Trim(Word + " and " + NRem + "/100" + " " + CurrencyRef)
'REMOVE UNEEDED REFERENCES
Word = Replace(Word, "zero ", "")
Word = Replace(Word, "hundred thousand hundred ", "hundred thousand ")
Word = Replace(Word, "thousand hundred ", "thousand ")
Word = Replace(Word, "million hundred thousand ", "million ")
Word = Replace(Word, "million hundred ", "million ")
'ADD BACK ZERO ON ZERO INTEGER VALUE
If Mid(Word, 1, 3) = "and" Then Word = "zero " + Word
'----STYLE OPTIONS---- Default or 1 = lowercase, 2 = Sentence Case, 3 = UPPERCASE
If Style > 3 Then Word = CVErr(xlErrValue): GoTo ErrorOut
'MAKE WORD SENTENCE CASE
If Style = 2 Then
Mid(Word, 1, 1) = UCase(Mid(Word, 1, 1))
For X = 2 To Len(Word)
If Mid(Word, X, 1) = " " Or Mid(Word, X, 1) = "-" Then Mid(Word, X + 1, 1) _
= UCase(Mid(Word, X + 1, 1))
Next X
End If
'MAKE WORD UPPERCASE
If Style = 3 Then
Word = UCase(Word)
End If
'----ENCLOSURE OPTION---- Default and FLASE = No enclosure, TRUE = Enclosure
'ENCLOSE WORD WITH LEADING AND TRAILING ASTERICS
If Enclose = True Then Word = "**** " + Word + " ****"
ErrorOut:
'RETURN VERBOSE NUMBER WORD STRING OR ERROR CODE
NumberWords = Word
End Function