Đổi Số Thành Chữ Trong Excel: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao

Mở Đầu

Trong công việc văn phòng, kế toán, tài chính hay bất kỳ lĩnh vực nào liên quan đến việc xử lý dữ liệu số, việc đổi số thành chữ là một nhu cầu thường gặp. Ví dụ, khi lập hợp đồng, báo cáo tài chính, phiếu chi, hoặc bảng lương, chúng ta thường phải viết số tiền dưới dạng chữ để tránh sai sót và tăng tính pháp lý. Microsoft Excel, một trong những công cụ bảng tính phổ biến nhất hiện nay, cung cấp nhiều cách để thực hiện việc này, từ việc sử dụng công thức tùy chỉnh, hàm tích hợp, tới việc viết macro VBA. Bài viết dưới đây sẽ cung cấp cho bạn một hướng dẫn chi tiết, đầy đủ và thực tiễn để chuyển đổi số thành chữ trong Excel, bao gồm:

  1. Giới thiệu tổng quan về nhu cầu và các phương pháp.
  2. Cách dùng hàm tích hợp (nếu có) và hàm người dùng (User Defined Function – UDF) trong Excel.
  3. Tạo hàm UDF bằng VBA cho tiếng Việt và tiếng Anh.
  4. Sử dụng các hàm Text, CONCATENATE, và các hàm logic để xây dựng công thức không VBA.
  5. Xử lý các trường hợp đặc biệt: số thập phân, âm, lớn hơn một tỷ, và định dạng tiền tệ.
  6. Thực hành trên các ví dụ thực tế: hợp đồng mua bán, phiếu chi, báo cáo lương.
  7. Tối ưu hiệu suất, bảo mật macro và cách chia sẻ file.
  8. Các công cụ và add‑in hỗ trợ (Power Query, Power Automate).

Bài viết được chia thành nhiều phần, mỗi phần sẽ giải thích chi tiết từng bước, kèm ví dụ thực tế và mã nguồn. Nhờ vậy, dù bạn là người mới bắt đầu hay đã có kinh nghiệm lập trình VBA, đều có thể áp dụng ngay vào công việc của mình.

1. Tại Sao Cần Đổi Số Thành Chữ Trong Excel?

1.1. Yêu Cầu Pháp Lý và Kiểm Soát Rủi Ro

  • Hợp đồng: Pháp luật thường yêu cầu số tiền phải được viết bằng chữ và số để tránh tranh chấp.
  • Phiếu chi, hoá đơn: Đối với các cơ quan tài chính, việc ghi chữ giúp kiểm tra tính hợp lệ và giảm lỗi nhập liệu.

1.2. Tăng Tính Thẩm Mỹ và Đọc Hiểu

  • Khi báo cáo cho cấp trên, việc có số tiền ở dạng chữ giúp người đọc nhanh nắm bắt nội dung mà không cần phải tính toán lại.

1.3. Tự Động Hóa và Tiết Kiệm Thời Gian

  • Thay vì nhập thủ công, một công thức hoặc macro sẽ tự động cập nhật chữ khi số thay đổi, giảm công sức và sai sót.

2. Các Phương Pháp Đổi Số Thành Chữ Trong Excel

Phương phápƯu điểmNhược điểm
Công thức Excel thuần (TEXT, REPT, MID…)Không cần bật macro, an toàn cho môi trường doanh nghiệp nghiêm ngặt.Phức tạp, giới hạn ở các số nhỏ, không hỗ trợ âm và số thập phân lớn.
Hàm UDF (User Defined Function) bằng VBALinh hoạt, hỗ trợ đa ngôn ngữ, xử lý số lớn, thập phân, âm.Cần bật macro, có thể gặp vấn đề bảo mật nếu chia sẻ file.
Add‑in/Tiện ích bên thứ baGiao diện thân thiện, thường có sẵn các tùy chọn định dạng.Phụ thuộc vào nhà cung cấp, có thể mất phí.
Power QueryXử lý dữ liệu lớn, không cần macro.Hạn chế trong việc chuyển đổi sang chữ (cần custom M code).

Trong phần tiếp theo, chúng ta sẽ tập trung vào công thức thuần và UDF bằng VBA, vì đây là hai cách phổ biến nhất và có thể áp dụng ngay.

3. Đổi Số Thành Chữ Bằng Công Thức Excel Thuần

3.1. Giới Thiệu Cơ Bản

Excel không có hàm tích hợp sẵn để chuyển số thành chữ (trong tiếng Việt). Tuy nhiên, bằng cách kết hợp các hàm TEXT, MID, RIGHT, LEFT, IF, CHOOSE, REPT, chúng ta có thể xây dựng một công thức để chuyển đổi các số đơn giản (đến hàng chục nghìn) sang dạng chữ.

3.2. Công Thức Đổi Số 0‑999

Dưới đây là công thức chuyển một số trong khoảng 0‑999 thành chữ tiếng Việt (không có dấu). Giả sử ô A1 chứa số cần chuyển:

=IF(A1=0,"khong",
TRIM(
IF(INT(A1/100)>0,CHOOSE(INT(A1/100),"mot","hai","ba","bon","nam","sau","bay","tam","chin","muoi")&" tram ","") &
IF(MOD(INT(A1/10),10)=0, IF(MOD(A1,100)=0,"", "linh " & CHOOSE(MOD(A1,10)+1,"mot","hai","ba","bon","nam","sau","bay","tam","chin")), IF(MOD(INT(A1/10),10)=1, "muoi " & CHOOSE(MOD(A1,10)+1,"","mot","hai","ba","bon","lam","sau","bay","tam","chin"), CHOOSE(MOD(INT(A1/10),10)+1,"mot","hai","ba","bon","nam","sau","bay","tam","chin") & " muoi " & IF(MOD(A1,10)=0,"",CHOOSE(MOD(A1,10)+1,"mot","hai","ba","bon","lam","sau","bay","tam","chin")) )
)
))

Giải thích:
– INT(A1/100) lấy hàng trăm.
– CHOOSE chuyển số 1‑9 thành chữ.
– MOD lấy phần còn lại.
– Các điều kiện IF xử lý trường hợp “linh”, “muoi”, “lam” (năm ở hàng đơn vị sau “muoi” thường viết “lam”).

Lưu ý: Công thức trên không có dấu và chưa xử lý “tỷ”, “nghìn” hay số âm. Đối với các trường hợp phức tạp hơn, ta nên dùng VBA.

3.3. Mở Rộng Đến 999 999

Để mở rộng tới nghìn, chúng ta chia số thành hai phần: phần nghìn và phần còn lại, sau đó ghép lại.

Giả sử ô A1 chứa số cần chuyển (0‑999 999). Đặt công thức sau vào ô B1:

=IF(A1=0,"khong",
TRIM(
IF(INT(A1/1000)>0, SUBSTITUTE( IF(INT(A1/1000)=1,"mot","") & IF(INT(A1/1000)>=2,CHOOSE(MOD(INT(A1/1000),10)+1,"mot","hai","ba","bon","nam","sau","bay","tam","chin") & " tram ","") & IF(MOD(INT(A1/1000),100)=0,"",""), " "," ") & "nghin ","") &
IF(MOD(A1,1000)>0, SUBSTITUTE( IF(INT(MOD(A1,1000)/100)>0,CHOOSE(INT(MOD(A1,1000)/100),"mot","hai","ba","bon","nam","sau","bay","tam","chin") & " tram ","") & IF(MOD(INT(MOD(A1,1000)/10),10)=0, IF(MOD(MOD(A1,1000),100)=0,"","linh " & CHOOSE(MOD(MOD(A1,1000),10)+1,"mot","hai","ba","bon","nam","sau","bay","tam","chin")), IF(MOD(INT(MOD(A1,1000)/10),10)=1, "muoi " & CHOOSE(MOD(MOD(A1,1000),10)+1,"","mot","hai","ba","bon","lam","sau","bay","tam","chin"), CHOOSE(MOD(INT(MOD(A1,1000)/10),10)+1,"mot","hai","ba","bon","nam","sau","bay","tam","chin") & " muoi " & IF(MOD(MOD(A1,1000),10)=0,"",CHOOSE(MOD(MOD(A1,1000),10)+1,"mot","hai","ba","bon","lam","sau","bay","tam","chin")) ) ), " "," ")
,"")
))

Công thức này khá dài và khó bảo trì, nhưng nó minh họa cách chia số thành các khối (nghìn, trăm, chục) và ghép lại. Khi số vượt quá triệu, cách tiếp cận này trở nên không thực tế, vì vậy chúng ta chuyển sang VBA.

4. Đổi Số Thành Chữ Bằng VBA (UDF)

4.1. Lý Do Chọn VBA

  • Độ linh hoạt: Xử lý mọi kích thước số (tới hàng tỷ, thậm chí hơn).
  • Đọc dễ: Mã VBA rõ ràng, dễ chỉnh sửa để thêm quy tắc viết “lăm”, “mười lăm”, “một trăm lẻ năm”,…
  • Tái sử dụng: Khi tạo UDF, chỉ cần gọi hàm trong bất kỳ ô nào, giống như hàm chuẩn.

4.2. Cách Tạo Macro UDF

  1. Mở VBA Editor: Nhấn Alt + F11.
  2. Chèn Module mới: Insert > Module.
  3. Dán mã dưới đây vào cửa sổ module.
  4. Lưu file dưới dạng .xlsm (macro‑enabled workbook).

4.3. Mã VBA Đổi Số Thành Chữ Tiếng Việt

Đổi Số Thành Chữ Trong Excel
Đổi Số Thành Chữ Trong Excel
Option Explicit '------------------------------
' Hàm chính: ConvertNumberToWords
' Đầu vào: Variant (số hoặc chuỗi)
' Đầu ra: String (số viết bằng chữ tiếng Việt, có dấu)
'------------------------------
Public Function ConvertNumberToWords(ByVal Number As Variant) As String Dim sNumber As String Dim isNegative As Boolean ' Kiểm tra giá trị rỗng hoặc không phải số If IsEmpty(Number) Or IsNull(Number) Then ConvertNumberToWords = "" Exit Function End If On Error GoTo ErrHandler sNumber = CStr(Number) sNumber = Trim(sNumber) ' Xử lý dấu âm If Left(sNumber, 1) = "-" Then isNegative = True sNumber = Mid(sNumber, 2) End If ' Loại bỏ dấu phẩy, dấu chấm (định dạng tiền tệ) sNumber = Replace(sNumber, ",", "") sNumber = Replace(sNumber, ".", "") If Not IsNumeric(sNumber) Then ConvertNumberToWords = "Không phải số" Exit Function End If Dim integerPart As String Dim decimalPart As String Dim posDec As Long posDec = InStr(1, CStr(Number), ".") If posDec > 0 Then integerPart = Left(sNumber, posDec - 1) decimalPart = Mid(sNumber, posDec + 1) Else integerPart = sNumber decimalPart = "" End If Dim result As String result = ConvertIntegerPart(CLng(integerPart)) If decimalPart <> "" Then result = result & " phẩy " & ConvertDecimalPart(decimalPart) End If If isNegative Then result = "Âm " & result ConvertNumberToWords = result Exit Function ErrHandler: ConvertNumberToWords = "Lỗi chuyển đổi"
End Function '------------------------------
' Chuyển phần nguyên (không có dấu thập phân)
'------------------------------
Private Function ConvertIntegerPart(ByVal n As Long) As String Dim units() As String units = Split("không,một,hai,ba,bốn,năm,sáu,bảy,tám,chín", ",") Dim scales() As String scales = Split("","") ' placeholder để đồng nhất chỉ số Select Case n Case 0 ConvertIntegerPart = "không" Exit Function Case Is < 0 ConvertIntegerPart = "âm " & ConvertIntegerPart(Abs(n)) Exit Function End Select Dim words As String words = "" If n \ 1000000000 > 0 Then words = words & ConvertIntegerPart(n \ 1000000000) & " tỷ " n = n Mod 1000000000 End If If n \ 1000000 > 0 Then words = words & ConvertIntegerPart(n \ 1000000) & " triệu " n = n Mod 1000000 End If If n \ 1000 > 0 Then words = words & ConvertIntegerPart(n \ 1000) & " nghìn " n = n Mod 1000 End If If n \ 100 > 0 Then words = words & units(n \ 100) & " trăm " n = n Mod 100 If n = 0 Then ConvertIntegerPart = Trim(words) Exit Function End If If n < 10 Then words = words & "lẻ " End If If n \ 10 > 0 Then Select Case n \ 10 Case 1 words = words & "mười " Case Else words = words & units(n \ 10) & " mươi " End Select n = n Mod 10 End If If n > 0 Then Select Case n Case 1 If InStr(words, "mươi") > 0 Then words = words & "mốt " Else words = words & "một " End If Case 4 If InStr(words, "mươi") > 0 Then words = words & "tư " Else words = words & "bốn " End If Case 5 If InStr(words, "mươi") > 0 Then words = words & "lăm " Else words = words & "năm " End If Case Else words = words & units(n) & " " End Select End If ConvertIntegerPart = Trim(words)
End Function '------------------------------
' Chuyển phần thập phân (chuỗi ký tự)
'------------------------------
Private Function ConvertDecimalPart(ByVal dec As String) As String Dim i As Long, ch As String Dim result As String result = "" For i = 1 To Len(dec) ch = Mid(dec, i, 1) Select Case ch Case "0": result = result & "không " Case "1": result = result & "một " Case "2": result = result & "hai " Case "3": result = result & "ba " Case "4": result = result & "bốn " Case "5": result = result & "năm " Case "6": result = result & "sáu " Case "7": result = result & "bảy " Case "8": result = result & "tám " Case "9": result = result & "chín " Case Else: result = result & "" End Select Next i ConvertDecimalPart = Trim(result)
End Function

Giải Thích Chi Tiết

Thành phầnMô tả
ConvertNumberToWordsHàm chính, nhận bất kỳ giá trị nào (số, chuỗi), xử lý dấu âm, tách phần nguyên và thập phân, trả về chuỗi hoàn chỉnh.
ConvertIntegerPartĐệ quy, chia số thành tỷ, triệu, nghìn, trăm, chục, đơn vị. Xử lý các quy tắc đặc biệt: “lẻ”, “mốt”, “tư”, “lăm”.
ConvertDecimalPartĐọc từng chữ số thập phân, trả về dạng “phẩy một hai ba…”. Có thể tùy chỉnh để bỏ “phẩy” nếu không cần.
unitsMảng chứa các từ “không, một, …, chín”.
If InStr(words, "mươi") > 0Kiểm tra ngữ cảnh để quyết định viết “mốt”, “tư”, “lăm”.

4.4. Cách Sử Dụng

Giả sử ô A2 chứa giá trị 1234567.89. Trong ô B2 nhập công thức:

=ConvertNumberToWords(A2)

Kết quả sẽ là:

một triệu hai trăm ba mươi bốn nghìn năm trăm sáu mươi bảy phẩy tám chín

Nếu muốn không có dấu “phẩy” (chỉ hiển thị phần nguyên), có thể gọi hàm ConvertIntegerPart trực tiếp:

=ConvertIntegerPart(A2)

4.5. Định Dạng Tiền Tệ (VNĐ)

Để hiển thị dạng “… đồng”, chỉ cần nối chuỗi:

=ConvertNumberToWords(A2) & " đồng"

Hoặc tạo một UDF phụ:

Public Function ConvertToCurrency(ByVal Number As Variant) As String ConvertToCurrency = ConvertNumberToWords(Number) & " đồng"
End Function

Sau khi lưu, dùng:

=ConvertToCurrency(A2)

5. Đổi Số Thành Chữ Tiếng Anh (UDF)

Nhiều doanh nghiệp quốc tế cần xuất báo cáo bằng tiếng Anh. Dưới đây là phiên bản UDF cho tiếng Anh, hỗ trợ tới trillion (10^12).

Public Function NumberToWordsEN(ByVal Number As Variant) As String Dim s As String, isNeg As Boolean If IsNumeric(Number) = False Then NumberToWordsEN = "Invalid number" Exit Function End If If Number < 0 Then isNeg = True Number = Abs(Number) End If s = ConvertIntegerEN(CLng(Number)) If isNeg Then s = "Minus " & s NumberToWordsEN = s
End Function Private Function ConvertIntegerEN(ByVal n As Long) As String Dim units As Variant, teens As Variant, tens As Variant units = Array("", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine") teens = Array("Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen") tens = Array("", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety") Dim result As String result = "" If n \ 1000000000000 > 0 Then result = result & ConvertIntegerEN(n \ 1000000000000) & " Trillion " n = n Mod 1000000000000 End If If n \ 1000000000 > 0 Then result = result & ConvertIntegerEN(n \ 1000000000) & " Billion " n = n Mod 1000000000 End If If n \ 1000000 > 0 Then result = result & ConvertIntegerEN(n \ 1000000) & " Million " n = n Mod 1000000 End If If n \ 1000 > 0 Then result = result & ConvertIntegerEN(n \ 1000) & " Thousand " n = n Mod 1000 End If If n \ 100 > 0 Then result = result & units(n \ 100) & " Hundred " n = n Mod 100 End If If n >= 20 Then result = result & tens(n \ 10) & " " n = n Mod 10 ElseIf n >= 10 Then result = result & teens(n - 10) & " " n = 0 End If If n > 0 Then result = result & units(n) & " " ConvertIntegerEN = Trim(result)
End Function

Cách dùng: =NumberToWordsEN(1520300) → “One Million Five Hundred Twenty Thousand Three Hundred”.

6. Xử Lý Các Trường Hợp Đặc Biệt

6.1. Số Âm

  • Công thức thuần: Thêm IF(A1<0,"Âm "& ... ).
  • VBA: Hàm đã tự động thêm “Âm” nếu số < 0.

6.2. Số Thập Phân

  • VBA: ConvertNumberToWords trả về “… phẩy …”. Nếu muốn “điểm” thay vì “phẩy”, thay phẩy bằng điểm trong mã.
  • Công thức: Sử dụng TEXT(A1,"0.00") để tách phần thập phân, rồi dùng MID/RIGHT để chuyển từng chữ số.

6.3. Số Rất Lớn (trên 2^31‑1)

  • VBA Long chỉ hỗ trợ tới 2.147.483.647. Đối với số lớn hơn, cần dùng Decimal hoặc Currency. Một cách đơn giản là xử lý chuỗi:
Dim s As String
s = CStr(Number) 'đọc dưới dạng chuỗi, không chuyển sang Long

Sau đó chia chuỗi thành các nhóm 3 ký tự từ phải sang trái và gọi ConvertIntegerPart cho mỗi nhóm.

6.4. Định Dạng Tiền Tệ Với Đơn Vị

  • VNĐ: “… đồng”.
  • USD: “… dollars”.
  • EUR: “… euros”.
    Bạn có thể tạo hàm:
Public Function ConvertCurrency(ByVal Number As Variant, ByVal CurrencyUnit As String) As String ConvertCurrency = ConvertNumberToWords(Number) & " " & CurrencyUnit
End Function

Sử dụng: =ConvertCurrency(A2,"USD").

7. Tối Ưu Hiệu Suất Và Bảo Mật

7.1. Khi Nào Nên Tránh VBA?

  • Khi file được chia sẻ rộng rãi trong môi trường không cho phép macro (ví dụ: một số công ty tài chính nghiêm ngặt).
  • Khi muốn đảm bảo tính tương thích với Excel Online hoặc Google Sheets.

7.2. Cách Tối Ưu VBA

  • Sử dụng Static mảng để tránh khởi tạo lại mỗi lần gọi hàm.
  • Giảm số lần gọi hàm đệ quy: lưu kết quả trong biến tạm.
  • Tắt tính năng ScreenUpdating khi chạy macro lớn:
Application.ScreenUpdating = False
'...code...
Application.ScreenUpdating = True

7.3. Bảo Mật Macro

  • Ký số (digital signature) để người dùng tin tưởng macro.
  • Lưu ở dạng .xlsm và thiết lập Trust Center để chỉ cho phép macro từ nguồn đáng tin cậy.
  • Khi chia sẻ, có thể export module (File > Export) và cung cấp file .bas để người nhận tự import vào workbook sạch.

8. Sử Dụng Power Query Để Đổi Số Thành Chữ

Power Query (Get & Transform) không có hàm sẵn có để chuyển số thành chữ, nhưng chúng ta có thể tạo hàm M tùy chỉnh:

let NumberToVietnamese = (n as number) as text => let units = {"không","một","hai","ba","bốn","năm","sáu","bảy","tám","chín"}, tens = {"","mười","hai mươi","ba mươi","bốn mươi","năm mươi","sáu mươi","bảy mươi","tám mươi","chín mươi"}, Convert = (x as number) as text => if x < 10 then units{x+1} else if x < 20 then "mười " & if x = 15 then "lăm" else units{(x-10)+1} else let t = Number.IntegerDivide(x,10), u = Number.Mod(x,10), txt = tens{t+1} & if u = 0 then "" else " " & if u = 1 then "mốt" else if u = 5 then "lăm" else units{u+1} in txt, result = if n = 0 then "không" else if n < 0 then "âm " & Convert(-n) else Convert(n) in result
in NumberToVietnamese
  • Cách dùng: Trong Power Query, vào Add Column > Custom Column, nhập công thức NumberToVietnamese(Số).
  • Ưu điểm: Không cần macro, hoạt động trên Excel Desktop và Excel Online.
  • Nhược điểm: Chỉ hỗ trợ số trong khoảng 0‑99 nếu không mở rộng thêm logic.

9. Ứng Dụng Thực Tế

9.1. Hợp Đồng Mua Bán

ÔNội DungCông Thức
B2Số tiền (VNĐ)=1234567890
C2Số tiền bằng chữ=ConvertNumberToWords(B2) & " đồng"
D2Số tiền bằng chữ (viết hoa)=UPPER(ConvertNumberToWords(B2) & " đồng")

Kết quả:
– C2: một tỷ hai trăm ba mươi bốn triệu năm trăm sáu mươi bảy nghìn tám trăm chín mươi đồng
– D2: MỘT TỶ HAI TRĂM BA MƯƠI BỐN TRIỆU NĂM TRĂM SẤU SAU NGHÌN TÁM TRĂM CHÍN MƯƠI ĐÔNG

9.2. Phiếu Chi

ABC
NgàySố tiềnSố tiền bằng chữ
01/06/20262,350,000=ConvertNumberToWords(B2) & " đồng"
Kết quảhai triệu ba trăm năm mươi ngàn đồng

9.3. Bảng Lương

Giả sử cột E là Lương (VNĐ), cột F là Lương bằng chữ:

=ConvertNumberToWords(E2) & " đồng"

Khi thay đổi lương trong E, cột F tự động cập nhật mà không cần chỉnh sửa công thức.

10. Tổng Kết

  • Công thức thuần thích hợp cho các số nhỏ, không cần bật macro, nhưng rất khó bảo trì.
  • VBA UDF là giải pháp mạnh mẽ, linh hoạt, hỗ trợ số lớn, âm, thập phân và đa ngôn ngữ.
  • Power Query cung cấp một cách không macro, nhưng hiện tại chỉ thích hợp cho các nhóm số nhỏ.
  • Khi triển khai trong môi trường doanh nghiệp, cần cân nhắc bảo mật macro, định dạng tiền tệ, và độ tương thích (Desktop vs Online).

Với các đoạn mã và hướng dẫn trên, bạn đã có bộ công cụ đầy đủ để thực hiện việc đổi số thành chữ trong Excel cho mọi nhu cầu: hợp đồng, báo cáo tài chính, phiếu chi, hay bảng lương. Hãy thử áp dụng ngay và chia sẻ kinh nghiệm của mình để cộng đồng người dùng Excel ngày càng phát triển!

⚠️
LƯU Ý QUAN TRỌNG: Miễn trừ trách nhiệm: Mặc dù chúng tôi luôn nỗ lực để đảm bảo tính chính xác và cập nhật của thông tin, nhưng các quy định về giáo dục và tuyển sinh có thể thay đổi theo thời gian. BigSchool không chịu trách nhiệm về bất kỳ sai sót nào hoặc kết quả phát sinh từ việc sử dụng thông tin trên trang này. Độc giả nên liên hệ trực tiếp với nhà trường hoặc cơ quan chức năng để có thông tin mới nhất. Ngoài ra, BigSchool tuyệt đối không bán sản phẩm, khóa học hay cung cấp dịch vụ được nhắc đến trong bài.

Viết một bình luận