SPELLNUMBER

Returns the text after converting a number into words.


Remarks

You can use the SPELLNUMBERREVERSE function to go in the opposite direction.
For instructions on how to add a function to a workbook refer to the page under Inserting Functions
* The equivalent JavaScript function is SPELLNUMBER
* Thanks to Bernd Plumhoff (sulprobil.com) for his contribution.


This function returns the same value for positive and negative numbers.
All numbers will be rounded to the nearest 2 decimal places.
This function will only return the correct text for numbers less than 999,999,999,999,999 (nine hundred trillion).
link - http://cpap.com.br/orlando/excelspellnumbermore.asp
link - support.microsoft.com/en-gb/office/convert-numbers-into-words-a0d166fb-e1ea-4090-95c8-69442cd55d98


dbMyNumber - The number you want to convert to text. 
sMainUnitPlural - The unit to use for whole numbers.
sMainUnitSingle - The unit to use for single whole numbers.
sDecimalUnitPlural - (Optional) The unit to use for decimal values.
sDecimalUnitSingle - (Optional) The unit to use for single decimal values.

Public Function SPELLNUMBER(ByVal dbMyNumber As Double, _
                            ByVal sMainUnitPlural As String, _
                            ByVal sMainUnitSingle As String, _
                   Optional ByVal sDecimalUnitPlural As String = "", _
                   Optional ByVal sDecimalUnitSingle As String = "") As Variant

   Dim sMyNumber As String
   Dim sConcat As String
   Dim sDecimalText As String
   Dim sTemp As String
   Dim iDecimalPlace As Integer
   Dim iCount As Integer

   ReDim Place(9) As String
   Application.Volatile (True)
   Place(2) = "Thousand"
   Place(3) = "Million"
   Place(4) = "Billion"
   Place(5) = "Trillion"
   sMyNumber = Trim(CStr(dbMyNumber))
   iDecimalPlace = InStr(dbMyNumber, ".")

   If (iDecimalPlace > 0) Then
      sDecimalText = GetTens(Left(Mid(Round(sMyNumber, 2), iDecimalPlace + 1) & "00", 2))
      If Len(sDecimalText) > 0 Then
         sMyNumber = Trim(Left(sMyNumber, iDecimalPlace - 1))
      Else
         sMyNumber = ""
      End If
   End If
   iCount = 1
   Do While sMyNumber <> ""
       sTemp = GetHundreds(sMyNumber, Right(sMyNumber, 3), iDecimalPlace)
       If (sTemp <> "") Then
          If (iCount > 1) And (LCase(Left(Trim(sConcat), 3)) <> "and") Then
             sConcat = ", " & sConcat
          End If
          sConcat = sTemp & Place(iCount) & sConcat
       End If
       If (Len(sMyNumber) > 3) Then
           sMyNumber = Left(sMyNumber, Len(sMyNumber) - 3)
       Else
           sMyNumber = ""
       End If
       iCount = iCount + 1
   Loop
   Select Case Trim(sConcat)
       Case "": sConcat = "No " & sMainUnitPlural
       Case "One": sConcat = "One " & sMainUnitSingle
       Case Else: sConcat = sConcat & sMainUnitPlural
   End Select
   If (iDecimalPlace > 0) Then
       If (Len(sDecimalUnitPlural) > 0 And Len(sDecimalUnitSingle) > 0) Then
          sConcat = sConcat & ", "
           Select Case Trim(sDecimalText)
               Case "": sDecimalText = "No " & sDecimalUnitPlural
               Case "One": sDecimalText = "One " & sDecimalUnitSingle
               Case Else: sDecimalText = sDecimalText & sDecimalUnitPlural
           End Select
       Else
       sConcat = sConcat & " and "
       sDecimalText = Mid(Trim(Str(dbMyNumber)), iDecimalPlace + 1) & "/100"
       End If
   End If
   SPELLNUMBER = Trim(sConcat & sDecimalText)
End Function

Function GetHundreds(ByVal sMyNumber As String, _
                     ByVal sHundredNumber As String, _
                     ByVal iDecimal As Integer) As String

    Dim sResult As String
    
    If (sHundredNumber = "0") Then
       Exit Function
    End If
    sHundredNumber = Right("000" & sHundredNumber, 3)
    If Mid(sHundredNumber, 1, 1) <> "0" Then
        sResult = GetDigit(Mid(sHundredNumber, 1, 1)) & "Hundred"
    End If
    If (sMyNumber > 1000) And (Mid(sHundredNumber, 3, 1) <> "0" Or _
                               Mid(sHundredNumber, 2, 1) <> "0") Or _
       (Len(sResult) > 0) And (Mid(sHundredNumber, 3, 1) <> "0" Or _
                               Mid(sHundredNumber, 2, 1) <> "0") Then
       sResult = sResult & " and "
    End If
    If Mid(sHundredNumber, 2, 1) <> "0" Then
       sResult = sResult & GetTens(Mid(sHundredNumber, 2))
    Else
       If Mid(sHundredNumber, 3, 1) <> "0" Then
          sResult = sResult & GetDigit(Mid(sHundredNumber, 3))
       Else
          sResult = sResult & " "
       End If
    End If
    GetHundreds = sResult
End Function

Function GetTens(ByVal sTensText As String) As String

    Dim sResult As String

    sResult = ""
    If Left(sTensText, 1) = 1 Then
        Select Case sTensText
            Case "10": sResult = "Ten "
            Case "11": sResult = "Eleven "
            Case "12": sResult = "Twelve "
            Case "13": sResult = "Thirteen "
            Case "14": sResult = "Fourteen "
            Case "15": sResult = "Fifteen "
            Case "16": sResult = "Sixteen "
            Case "17": sResult = "Seventeen "
            Case "18": sResult = "Eighteen "
            Case "19": sResult = "Nineteen "
            Case Else
        End Select
    Else
        Select Case Left(sTensText, 1)
            Case "2": sResult = "Twenty "
            Case "3": sResult = "Thirty "
            Case "4": sResult = "Forty "
            Case "5": sResult = "Fifty "
            Case "6": sResult = "Sixty "
            Case "7": sResult = "Seventy "
            Case "8": sResult = "Eighty "
            Case "9": sResult = "Ninety "
            Case Else
        End Select
        sResult = sResult & GetDigit(Right(sTensText, 1))
    End If
    GetTens = sResult
End Function

Function GetDigit(ByVal sDigit As String) As String
    Select Case sDigit
        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

© 2024 Better Solutions Limited. All Rights Reserved. © 2024 Better Solutions Limited TopPrevNext