Giới Thiệu
Nhiều người dùng Excel gặp khó khăn khi cần chuyển số thành chữ (viết bằng lời) để làm chứng từ, hợp đồng, séc... Bài viết này cung cấp 4 phương pháp chính chuyển số thành chữ tiếng Anh (One, Two...) và 3 phương pháp bổ sung chuyển sang định dạng Text đơn giản.
File Thực Hành
Tải file đính kèm để làm theo các ví dụ.
4 Cách Chuyển Số Thành Chữ (Tiếng Anh)
Sử dụng phiên bản Microsoft 365 (các phiên bản khác tương tự).
1. Kết Hợp Nhiều Hàm (Không Cần VBA)
Sử dụng 4 hàm: LEFT, MID, TEXT, CHOOSE. Công thức dài nhưng logic lặp lại.
Cú Pháp Các Hàm:
- LEFT(text, [num_chars]): Lấy ký tự từ bên trái.
- MID(text, start_num, num_chars): Lấy ký tự từ giữa.
- TEXT(value, format_text): Định dạng số thành chuỗi (ví dụ: "000000000.00" để có độ dài cố định 12 ký tự).
- CHOOSE(index_num, value1, ...): Chọn giá trị theo chỉ số (1→One, 2→Two...).
Công Thức Hoàn Chỉnh (ô C5, số ở B5):
=CHOOSE(LEFT(TEXT(B5,"000000000.00"))+1,,"One","Two","Three","Four","Five","Six","Seven","Eight","Nine")
&IF(--LEFT(TEXT(B5,"000000000.00"))=0,,IF(AND(--MID(TEXT(B5,"000000000.00"),2,1)=0,--MID(TEXT(B5,"000000000.00"),3,1)=0)," Hundred"," Hundred and "))
&CHOOSE(MID(TEXT(B5,"000000000.00"),2,1)+1,,,"Twenty ","Thirty ","Forty ","Fifty ","Sixty ","Seventy ","Eighty ","Ninety ")
&IF(--MID(TEXT(B5,"000000000.00"),2,1)<>1,CHOOSE(MID(TEXT(B5,"000000000.00"),3,1)+1,,"One","Two","Three","Four","Five","Six","Seven","Eight","Nine"),
CHOOSE(MID(TEXT(B5,"000000000.00"),3,1)+1,"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"))
&IF((--LEFT(TEXT(B5,"000000000.00"))+MID(TEXT(B5,"000000000.00"),2,1)+MID(TEXT(B5,"000000000.00"),3,1))=0,,IF(AND((--MID(TEXT(B5,"000000000.00"),4,1)+MID(TEXT(B5,"000000000.00"),5,1)+MID(TEXT(B5,"000000000.00"),6,1)+MID(TEXT(B5,"000000000.00"),7,1))=0,(--MID(TEXT(B5,"000000000.00"),8,1)+RIGHT(TEXT(B5,"000000000.00")))>0)," Million and "," Million "))
... (tiếp tục tương tự cho hàng Nghìn, Trăm, Chục, Đơn vị) ...
💡 Giải Thích Logic:
- TEXT(B5,"000000000.00"): Chuẩn hóa số thành chuỗi 12 ký tự (9 số nguyên + 2 thập phân + dấu chấm).
- Xử lý theo nhóm 3 chữ số: Triệu (Million) → Nghìn (Thousand) → Trăm/Chục/Đơn vị.
- Dùng CHOOSE tra từ điển: 1-9, 10-19, 20-90.
- Dùng IF/AND xử lý từ "Hundred", "Hundred and", "Thousand", "Thousand and", "Million", "Million and".
⚠️ Hạn Chế:
- Giới hạn số tối đa: 999,999,999 (gần 1 tỷ).
- Xử lý phần thập phân chưa hoàn hảo (chỉ đọc từng chữ số "point one two...").
- Công thức do Mr. Pete M. sáng tạo.
Áp Dụng: Nhập công thức ở C5 → Enter → Kéo Fill Handle xuống các ô dưới.
2. Sử Dụng Hàm VLOOKUP (Tra Bảng Đã Chuẩn Bị)
Phù hợp cho danh sách số cố định, không quá lớn.
Các Bước:
- Tạo bảng tra: Cột B (Số), Cột C (Chữ viết sẵn).
- Dùng công thức:
=VLOOKUP(B12, B4:C9, 2, FALSE). - B12: Số cần chuyển. B4:C9: Bảng tra. 2: Cột trả về (Chữ). FALSE: Khớp chính xác.
3. Tự Tạo Hàm Bằng VBA (User Defined Function - UDF)
Linh hoạt nhất, dùng như hàm Excel bình thường: =number_converting_into_words(B5).
Các Bước Tạo Hàm:
- Tab Developer → Visual Basic (Alt+F11).
- Menu Insert → Module.
- Dán mã VBA sau vào Module:
Function number_converting_into_words(ByVal MyNumber)
Dim x_string As String, whole_num As Integer, x_string_pnt, x_string_Num
Dim x_pnt As String, x_numb As String, x_P() As Variant, x_DP
Dim x_cnt As Integer, x_output, x_T As String, x_my_len As Integer
On Error Resume Next
x_P = Array("", "Thousand ", "Million ", "Billion ", "Trillion ", " ", " ", " ", " ")
x_numb = Trim(Str(MyNumber))
x_DP = InStr(x_numb, ".")
x_pnt = ""
x_string_Num = ""
' Xử lý phần thập phân
If x_DP > 0 Then
x_pnt = " point "
x_string = Mid(x_numb, x_DP + 1)
x_string_pnt = Left(x_string, Len(x_numb) - x_DP)
For whole_num = 1 To Len(x_string_pnt)
x_string = Mid(x_string_pnt, whole_num, 1)
x_pnt = x_pnt & get_digit(x_string) & " "
Next whole_num
x_numb = Trim(Left(x_numb, x_DP - 1))
End If
' Xử lý phần nguyên
x_cnt = 0
x_output = ""
x_T = ""
x_my_len = 0
x_my_len = Int(Len(Str(x_numb)) / 3)
If (Len(Str(x_numb)) Mod 3) = 0 Then x_my_len = x_my_len - 1
Do While x_numb <> ""
If x_my_len = x_cnt Then
x_T = get_hundred_digit(Right(x_numb, 3), False)
Else
If x_cnt = 0 Then
x_T = get_hundred_digit(Right(x_numb, 3), True)
Else
x_T = get_hundred_digit(Right(x_numb, 3), False)
End If
End If
If x_T <> "" Then x_output = x_T & x_P(x_cnt) & x_output
If Len(x_numb) > 3 Then
x_numb = Left(x_numb, Len(x_numb) - 3)
Else
x_numb = ""
End If
x_cnt = x_cnt + 1
Loop
x_output = x_output & x_pnt
number_converting_into_words = x_output
End Function
Function get_hundred_digit(xHDgt, y_b As Boolean)
Dim x_R_str As String, x_string_Num As String, x_string As String
Dim y_I As Integer, y_bb As Boolean
x_string_Num = xHDgt
x_R_str = ""
On Error Resume Next
y_bb = True
If Val(x_string_Num) = 0 Then Exit Function
x_string_Num = Right("000" & x_string_Num, 3)
x_string = Mid(x_string_Num, 1, 1)
If x_string <> "0" Then
x_R_str = get_digit(Mid(x_string_Num, 1, 1)) & "Hundred "
Else
If y_b Then x_R_str = "and " : y_bb = False Else x_R_str = " " : y_bb = False
End If
If Mid(x_string_Num, 2, 2) <> "00" Then
x_R_str = x_R_str & get_ten_digit(Mid(x_string_Num, 2, 2), y_bb)
End If
get_hundred_digit = x_R_str
End Function
Function get_ten_digit(x_TDgt, y_b As Boolean)
Dim x_string As String, y_I As Integer
Dim x_array_1() As Variant, x_array_2() As Variant, x_T As Boolean
x_array_1 = Array("Ten ", "Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen ")
x_array_2 = Array("", "", "Twenty ", "Thirty ", "Forty ", "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety ")
x_string = ""
x_T = True
On Error Resume Next
If Val(Left(x_TDgt, 1)) = 1 Then
y_I = Val(Right(x_TDgt, 1))
If y_b Then x_string = "and "
x_string = x_string & x_array_1(y_I)
Else
y_I = Val(Left(x_TDgt, 1))
If Val(Left(x_TDgt, 1)) > 1 Then
If y_b Then x_string = "and "
x_string = x_string & x_array_2(Val(Left(x_TDgt, 1)))
x_T = False
End If
If x_string = "" Then If y_b Then x_string = "and "
If Right(x_TDgt, 1) <> "0" Then x_string = x_string & get_digit(Right(x_TDgt, 1))
End If
get_ten_digit = x_string
End Function
Function get_digit(xDgt)
Dim x_string As String, x_array_1() As Variant
x_array_1 = Array("Zero ", "One ", "Two ", "Three ", "Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine ")
x_string = ""
On Error Resume Next
x_string = x_array_1(Val(xDgt))
get_digit = x_string
End Function
- Lưu (Ctrl+S) → Đóng VBE → Quay lại Excel.
- Dùng hàm:
=number_converting_into_words(B5)→ Enter → Kéo Fill Handle.
Ưu Điểm: Xử lý số lớn (tỷ, nghìn tỷ...), phần thập phân đọc từng chữ số ("point one two"), không giới hạn độ dài như công thức.
4. VBA Chuyển Số Thành Chữ Có Đơn Vị Tiền Tệ (USD)
Mở rộng phương pháp 3: Xuất ra dạng "Three Hundred Seventy Five Dollars and Sixty Five Cents".
Mã VBA (Module 2):
Function Convert_Number_into_word_with_currency(ByVal whole_number)
Dim converted_into_dollar, converted_into_cent
my_ary = Array("", "", " Thousand ", " Million ", " Billion ", " Trillion ")
whole_number = Trim(Str(whole_number))
x_decimal = InStr(whole_number, ".")
If x_decimal > 0 Then
converted_into_cent = get_ten(Left(Mid(whole_number, x_decimal + 1) & "00", 2))
whole_number = Trim(Left(whole_number, x_decimal - 1))
End If
xIndex = 1
Do While whole_number <> ""
xHundred = ""
xValue = Right(whole_number, 3)
If Val(xValue) <> 0 Then
xValue = Right("000" & xValue, 3)
If Mid(xValue, 1, 1) <> "0" Then xHundred = get_digit(Mid(xValue, 1, 1)) & " Hundred "
If Mid(xValue, 2, 1) <> "0" Then
xHundred = xHundred & get_ten(Mid(xValue, 2))
Else
xHundred = xHundred & get_digit(Mid(xValue, 3))
End If
End If
If xHundred <> "" Then converted_into_dollar = xHundred & my_ary(xIndex) & " Dollars "
If Len(whole_number) > 3 Then whole_number = Left(whole_number, Len(whole_number) - 3) Else whole_number = ""
xIndex = xIndex + 1
Loop
' Xử lý từ "Dollar"/"Dollars", "Cent"/"Cents" số ít/nhiều
Select Case converted_into_dollar
Case "": converted_into_dollar = " Zero Dollars"
Case "One ": converted_into_dollar = " One Dollar"
Case Else: converted_into_dollar = converted_into_dollar & "Dollars"
End Select
Select Case converted_into_cent
Case "": converted_into_cent = " and Zero Cents"
Case "One ": converted_into_cent = " and One Cent"
Case Else: converted_into_cent = " and " & converted_into_cent & " Cents"
End Select
Convert_Number_into_word_with_currency = converted_into_dollar & converted_into_cent
End Function
Function get_ten(pTens)
Dim my_output As String
my_output = ""
If Val(Left(pTens, 1)) = 1 Then
Select Case Val(pTens)
Case 10: my_output = "Ten"
Case 11: my_output = "Eleven"
Case 12: my_output = "Twelve"
Case 13: my_output = "Thirteen"
Case 14: my_output = "Fourteen"
Case 15: my_output = "Fifteen"
Case 16: my_output = "Sixteen"
Case 17: my_output = "Seventeen"
Case 18: my_output = "Eighteen"
Case 19: my_output = "Nineteen"
End Select
Else
Select Case Val(Left(pTens, 1))
Case 2: my_output = "Twenty "
Case 3: my_output = "Thirty "
Case 4: my_output = "Forty "
Case 5: my_output = "Fifty "
Case 6: my_output = "Sixty "
Case 7: my_output = "Seventy "
Case 8: my_output = "Eighty "
Case 9: my_output = "Ninety "
End Select
my_output = my_output & get_digit(Right(pTens, 1))
End If
get_ten = my_output
End Function
Function get_digit(pDigit)
Select Case Val(pDigit)
Case 1: get_digit = "One"
Case 2: get_digit = "Two"
Case 3: get_digit = "Three"
Case 4: get_digit = "Four"
Case 5: get_digit = "Five"
Case 6: get_digit = "Six"
Case 7: get_digit = "Seven"
Case 8: get_digit = "Eight"
Case 9: get_digit = "Nine"
Case Else: get_digit = ""
End Select
End Function
Sử Dụng: =Convert_Number_into_word_with_currency(B5).
3 Cách Chuyển Số Sang Định Dạng Text (Không Phải Viết Bằng Chữ)
Nếu chỉ cần ô hiển thị căn lề trái như văn bản (không tính toán):
Cách 1: Đổi Định Dạng Ô Sang Text
- Chọn ô/cột → Tab Home → Number → chọn Text.
- Hoặc Ctrl+1 → Tab Number → chọn Text.
Cách 2: Dùng Hàm TEXT
=TEXT(B5, "0") hoặc =TEXT(B5, "@").
Cách 3: Thêm Dấu Nháy Đơn
Gõ '123 trước khi nhập.
Kết Luận
Tùy nhu cầu mà chọn:
- Ít số, cố định: VLOOKUP tra bảng.
- Nhiều số, cần tự động, không rào cản bảo mật: VBA UDF (Phương pháp 3 hoặc 4).
- Chỉ cần định dạng Text: Cách 1/2/3 phần bổ sung.
Hãy tải file thực hành và thử nghiệm. Đừng quên truy cập ExcelDemy để học thêm!
Bài Viết Liên Quan
- Cách Chuyển Ngày Sang Văn Bản YYYYMMDD (3 Cách Nhanh)
- Chuyển Ngày Sang Tên Tháng Trong Excel (8 Cách)