Computer >> Hướng Dẫn Máy Tính >  >> Phần Mềm >> Office

Chuyển Số Thành Chữ Trong Excel: 4 Phương Pháp Đã Chứng Minh

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:

  1. 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).
  2. Xử lý theo nhóm 3 chữ số: Triệu (Million) → Nghìn (Thousand) → Trăm/Chục/Đơn vị.
  3. Dùng CHOOSE tra từ điển: 1-9, 10-19, 20-90.
  4. 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:

  1. Tạo bảng tra: Cột B (Số), Cột C (Chữ viết sẵn).
  2. Dùng công thức: =VLOOKUP(B12, B4:C9, 2, FALSE).
  3. 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:

  1. Tab Developer → Visual Basic (Alt+F11).
  2. Menu Insert → Module.
  3. 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
  1. Lưu (Ctrl+S) → Đóng VBE → Quay lại Excel.
  2. 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)