Word can do this without a macro, which Excel cannot. Here is the field, what it produces, and the three places it stops.
Plain words
{ =1234 \* CardText \* Lower } one thousand two hundred thirty-four
Check shape
{ =1234.56 \* DollarText \* Lower } one thousand two hundred thirty-four and 56/100
01 · what Word has
{ =1234 \* CardText } writes "one thousand two hundred thirty-four" into the document, with no code and nothing to install.
This is a real advantage Word has over Excel, which ships with nothing of the kind. A field is a small instruction embedded in the text; it calculates and displays a result, and it updates when you tell it to. The two switches that matter here are CardText, which gives plain words, and DollarText, which gives the check shape with the cents over one hundred.
There is one detail that stops most people before they start: the braces have to be inserted with Ctrl+F9. Typing { and } from the keyboard produces ordinary characters and the field never runs, which is why so many people conclude the feature does not exist.
02 · how to insert it
01
This inserts an empty pair of field braces. Typing { and } from the keyboard does not work — Word treats them as ordinary characters and the field never runs.
02
For example =1234 \* CardText. The equals sign matters: it makes the field a calculation rather than a reference.
03
This updates the field and shows the result. Alt+F9 toggles between the code and the result if you need to go back and edit it.
04
Under a million you get words. Over it, an error — which is the limit worth knowing before you rely on the field for a contract.
03 · where it stops
The field is genuinely useful and it is not a complete solution. These three are worth knowing before you rely on it in a document that matters.
01
From one million up the field returns an error instead of words. That is the ceiling most people meet first, because an amount small enough to stay under it is usually small enough not to need writing out.
02
The lowest value the field will convert is zero. A credit, an adjustment or anything expressed as a negative has to be handled another way.
03
A second switch controls case — \* Upper, \* Lower, \* FirstCap, \* Caps — and none of them produces the Title Case a check line uses, where the word after a hyphen is also capitalised.
The first is the one that bites. A million is not a large amount in a contract, a property transaction or an invoice between companies, and the field does not degrade gracefully — it returns an error where the words should be, which is easy to miss in a long document that was updated after it was written.
04 · a note for translators
Not the document's. The field takes its language from the Office installation, so a Spanish contract written on an English-language Word will get "one thousand two hundred" in the middle of it.
For an English document this is invisible, because the behaviour and the requirement happen to agree. It is worth knowing anyway: if you write in more than one language, the field is reliable in exactly one of them, and silently wrong in the others.
The Spanish and Portuguese pages on this site have to lead with that warning. This one does not, which is the clearest example of why these pages are written separately rather than translated.
05 · the macro
The macro below has none of the three limits: it goes into the trillions, handles negatives,
produces Title Case for a check line, and can add a currency word. Paste it into a module with
Alt+F11, then select a number in the document and run
SpellSelection.
Visual Basic for Applications — Word
' ============================================================
' NumberToWords — spell a number or an amount in English
' Generated by numerosaletras.org/en/number-to-words-word
'
' Paste into a module (Alt+F11 > Insert > Module). Word has no
' cells, so call it from a macro or replace a selection:
' Selection.Text = NumberToWords(1234.56)
'
' Hyphenates twenty-one to ninety-nine, leaves out the "and"
' after the hundreds (American usage), and keeps the scale words
' singular.
' ============================================================
Option Explicit
Private Function Under20En(ByVal n As Long) As String
Dim w As Variant
w = Array("", "one", "two", "three", "four", "five", "six", "seven", _
"eight", "nine", "ten", "eleven", "twelve", "thirteen", _
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
Under20En = w(n)
End Function
Private Function Under100En(ByVal n As Long) As String
Dim tens As Variant, t As Long, u As Long
tens = Array("", "", "twenty", "thirty", "forty", "fifty", _
"sixty", "seventy", "eighty", "ninety")
If n < 20 Then
Under100En = Under20En(n)
Exit Function
End If
t = n \ 10
u = n Mod 10
If u = 0 Then
Under100En = tens(t)
Else
' The hyphen is not decoration: twenty-one is one word.
Under100En = tens(t) & "-" & Under20En(u)
End If
End Function
Private Function Under1000En(ByVal n As Long) As String
Dim h As Long, rest As Long, out As String
h = n \ 100
rest = n Mod 100
If h > 0 Then out = Under20En(h) & " hundred"
If rest > 0 Then
If Len(out) > 0 Then out = out & " "
out = out & Under100En(rest)
End If
Under1000En = out
End Function
Private Function DigitsEn(ByVal text As String) As String
Dim i As Long, out As String, d As Long
For i = 1 To Len(text)
d = CLng(Mid(text, i, 1))
If Len(out) > 0 Then out = out & " "
If d = 0 Then
out = out & "zero"
Else
out = out & Under20En(d)
End If
Next i
DigitsEn = out
End Function
' Capitalises the first letter of every word, including after a hyphen,
' which is what a check line needs: "Twenty-Three", not "Twenty-three".
Private Function TitleCaseEn(ByVal text As String) As String
Dim i As Long, ch As String, prev As String, out As String
prev = " "
For i = 1 To Len(text)
ch = Mid(text, i, 1)
If prev = " " Or prev = "-" Then
out = out & UCase(ch)
Else
out = out & ch
End If
prev = ch
Next i
TitleCaseEn = out
End Function
Public Function NumberToWords(ByVal value As Variant) As String
Dim wholeValue As Double, centsValue As Long, centsText As String
Dim groups As Variant, i As Long, groupValue As Long
Dim result As String, scales As Variant, rest As Double
If Not IsNumeric(value) Then
NumberToWords = "Not a number"
Exit Function
End If
Dim negative As Boolean
negative = (value < 0)
value = Abs(value)
wholeValue = Int(value)
centsValue = CLng((value - wholeValue) * 100 + 0.5)
If centsValue >= 100 Then centsValue = 99
centsText = Format(centsValue, "00")
scales = Array("", " thousand", " million", " billion", " trillion")
If wholeValue = 0 Then
result = "zero"
Else
rest = wholeValue
Dim parts(0 To 4) As String
i = 0
Do While rest > 0 And i <= 4
groupValue = CLng(rest - Int(rest / 1000) * 1000)
If groupValue > 0 Then
parts(i) = Under1000En(groupValue) & scales(i)
End If
rest = Int(rest / 1000)
i = i + 1
Loop
For i = 4 To 0 Step -1
If Len(parts(i)) > 0 Then
If Len(result) > 0 Then result = result & " "
result = result & parts(i)
End If
Next i
End If
If negative Then result = "negative " & result
NumberToWords = TitleCaseEn(result)
NumberToWords = NumberToWords & " and " & Format(centsValue, "00") & "/100"
End Function
' ------------------------------------------------------------
' Replaces the selected number with its words. Select a figure
' in the document and run this from the Macros dialog.
' ------------------------------------------------------------
Public Sub SpellSelection()
Dim raw As String
raw = Trim(Selection.Text)
raw = Replace(raw, ",", "")
If Not IsNumeric(raw) Then
MsgBox "Select a number first."
Exit Sub
End If
Selection.Text = NumberToWords(CDbl(raw))
End Sub
Copied
06 · questions
Q01
Yes. Word has a field switch for it — { =1234 \* CardText } produces "one thousand two hundred thirty-four" — and unlike Excel, this is genuinely built in. It has real limits, but for an English document under a million it works with no code at all.
Q02
CardText writes the number as plain words. DollarText writes it in the check shape, with the cents as a fraction over one hundred: "one thousand two hundred thirty-four and 56/100". If you are filling in an amount line, DollarText is the one you want.
Q03
Most likely the number is a million or more, which is where the field stops. It can also happen if the braces were typed by hand rather than inserted with Ctrl+F9, or if the equals sign is missing — without it the field is not a calculation and has nothing to convert.
Q04
Because it writes in the language of the Office installation, not the language of the document. For an English document that is exactly what you want, and it is the reason this page is more useful than its Spanish equivalent — there, the same field returns English into a Spanish contract.
Q05
Add a second switch: \* Upper for capitals, \* FirstCap for a leading capital, \* Lower for lowercase. What none of them gives you is Title Case with the letter after a hyphen capitalised, which is what a check line wants — that needs the macro.
Q06
No. Fields update on F9, when you print, or when the document is opened depending on your settings. If you change the number and the words stay the same, select the field and press F9. This catches people out on documents that are edited over time.
Q07
When the amount reaches a million, when it can be negative, when you need Title Case, or when you want a currency word in the output. The field covers the simple cases well and stops abruptly; the macro has none of those ceilings because it shares its algorithm with the converter on this site.
Q08
The body is the same — the macro on this page is the Excel one with a Word entry point added, since Word has no cells to reference. The Excel page has the sheet version plus a LAMBDA for anywhere macros are blocked.
Under a million, in an English document, with simple capitalisation, the built-in field is the right answer and takes four keystrokes. Past any of those, take the macro.