nhanly_123
Người hướng nội lặn lội với excel
Xin được phép khai trương bài viết đầu tiên của mình bằng 1 hàm chuyển tiền thành chữ áp dụng cho excel 365 và gg sheet
Mình đã chọn lọc các hàm làm sao để copy từ excel lên gg sheet là sử dụng được liền.
Hàm chi tiết thì mình đã đính kèm trong file
Sau đây mình sẽ phân tích về cách hoạt động của hàm để mọi người cùng đánh giá mức độ hiệu quả và cùng nhau sửa lỗi.
vì 1 cộng đồng excel lớn mạnh:
Bước 1:
mình format số theo định dạng 21 con số (tại sao lại là số 21 hồi sẽ rõ).
B1 = 2385387246
=TEXT(B1;REPT(0;21))
.
Bước 2; tách 3 số thành 1 hàng tính từ trái qua phải (mục đích để cho dễ nối chuỗi lại sau khi hoàn tất)
21 số tương đương với số tối đa là 999 nghìn tỷ và cũng vừa chia hết cho 3

Bước 3: tạo 1 bảng phụ = hàm (sau này đưa vào hàm
ở đây chúng ta có 7 dòng (mặc định)
dòng đầu tương ứng với hàng tỷ, theo sau là triệu, nghìn
=VSTACK(" tỷ ";" triệu ";" nghìn, ";" tỷ ";" triệu ";" nghìn, ";"")
.
Bước 4: xóa các hàng có "000" (sau khi chuyển số thành chữ chúng ta sẽ gộp nó lại như vầy, hàm này tạm thời dừng ở đây)

Bước 5: chơi đùa với 3 con (tạo bảng vlookup)
tạo bảng = text luôn để khi tách số ra khỏi phải chuyển thành số nữa
=HSTACK( VSTACK("1";"2";"3";"4";"5";"6";"7";"8";"9");VSTACK(" một ";" hai ";" ba ";" bốn ";" năm ";" sáu ";" bảy ";" tám ";" chín "))
.
Bước 6: tách hàng trăm
thêm 1 dòng dò "0" vào
=IFNA(VLOOKUP(LEFT(B5#);VSTACK(HSTACK("0";" không ");D15#);2;0);"")&" trăm"
.
Bước 7: làm tới hàng chục
dò hàng chục trong bảng bước 5
Nếu dò đc thì cho ra số nếu ko dò ra = #NA
thì kiểm tra hàng đơn vị có <> "0" và hàng chục = "0" nếu thỏa thì cho chữ "lẻ" vào
=IFNA( VLOOKUP(MID(B5#;2;1);D15#;2;0)&" mươi";IF((MID(B5#;2;1)="0")*(RIGHT(B5#)<>"0");" lẻ ";""))
.
Bước 8: hàng đơn vị
nếu hàng chục = 1 thì vlookup vào bảng D5# bình thường, nếu ko thì thêm "1";" mốt " vào danh sách
11 = mười một (có sẵn trong bảng vlookup)
81 = tám mươi mốt (chữ mốt ko có sẵn trong bảng mình tạo cho nên phải thêm thủ công vào)
nếu lỗi trả về rỗng
=IFNA(IF(MID(B5#;2;1)="1"; VLOOKUP(RIGHT(B5#);D15#;2;0);VLOOKUP(RIGHT(B5#);VSTACK(HSTACK("1";" mốt ");D15#);2;0));"")
.
Bước 9: nối các bước 6 & 7 & 8 & 3 lại thành 1 hàm
=IFNA(VLOOKUP(LEFT(B5#);VSTACK(HSTACK("0";" không ");D15#);2;0);"")&" trăm"&IFNA( VLOOKUP(MID(B5#;2;1);D15#;2;0)&" mươi";IF((MID(B5#;2;1)="0")*(RIGHT(B5#)<>"0");" lẻ ";""))&IFNA(VLOOKUP(RIGHT(B5#);D15#;2;0);"")&VSTACK(" tỷ ";" triệu ";" nghìn, ";" tỷ ";" triệu ";" nghìn, ";"")
.
Bước 10: áp dụng bước 9 vào bước 4 (copy đoạn IF(B5#="000";""; đưa lên trước hàm ifNA rồi enter thôi

Bước 11: nối tất cả lại
=TRIM(TEXTJOIN("";TRUE;IF(B5#="000";"";IFNA(VLOOKUP(LEFT(B5#);VSTACK(HSTACK("0";" không ");D15#);2;0);"")&" trăm"&IFNA(VLOOKUP(MID(B5#;2;1);D15#;2;0)&" mươi";IF((MID(B5#;2;1)="0")*(RIGHT(B5#)<>"0");" lẻ ";""))&IFNA(VLOOKUP(RIGHT(B5#);D15#;2;0);"")&VSTACK(" tỷ, ";" triệu ";" nghìn ";" tỷ, ";" triệu ";" nghìn ";""))))

.
Bước 12: sửa từ, loại bỏ râu ria
xóa cái "không trăm lẻ " đi (nếu có)
=IF(LEFT(E35;LEN("không trăm lẻ "))="không trăm lẻ ";SUBSTITUTE(E35;"không trăm lẻ ";"";1);E35)
đổi các chữ còn lại để đọc cho quen mồm là đc (lồng SUBSTITUTE bên ngoài thôi)
"mươi năm"->"mươi lăm"
"một mươi"->"mười"
"mươi một"->"mười một"
"mươi một"->"mươi mốt"
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(LEFT(E35;LEN("không trăm lẻ "))="không trăm lẻ ";SUBSTITUTE(E35;"không trăm lẻ ";"";1);E35);"mươi năm";"mươi lăm");"một mươi";"mười");"mươi một";"mười một")
.
Bước 13: gộp các bước lại thành 1 hàm hoàn chỉnh
Tính từ bước 12 trở về 1; nếu các bước được nhắc lại quá nhiều thì mình sẽ cho nó vào làm Let (à thêm chữ đồng vào cuối nữa)
gộp công thức tới ô cuối cùng là ngưng dc rồi đó các bạn

Bước 14; đem hàm đi test

có lỗi j thì báo mình sửa nhé
Lỗi 1:
cách sửa tương đối:
VSTACK(" tỷ tỷ, ";" triệu tỷ, ";" nghìn tỷ ";" tỷ, ";" triệu, ";" nghìn ";" ")
=ARRAYFORMULA( LET(monney;C21;bangv;HSTACK( VSTACK("1";"2";"3";"4";"5";"6";"7";"8";"9");VSTACK(" một ";" hai ";" ba ";" bốn ";" năm ";" sáu ";" bảy ";" tám ";" chín ")); tree;MID(TEXT(monney; REPT(0; 21)); SEQUENCE( 7;1;1;3);3); tex; trim(TEXTJOIN("";true; if(tree="000";""; VLOOKUP( LEFT(tree);VSTACK(HSTACK("0";" không "); bangv);2;0)&" trăm "&IF((RIGHT(tree;2)<>"00")+(RIGHT(tree;2)<>"10");IFNA( VLOOKUP(MID(tree;2;1);bangv;2;0)&" mươi";IF((RIGHT(tree)<>"0");" lẻ ";""))&IFNA( VLOOKUP(RIGHT(tree);bangv;2; ) ;"")&VSTACK(" tỷ tỷ, ";" triệu tỷ, ";" nghìn tỷ ";" tỷ, ";" triệu, ";" nghìn ";" "))))); texupper;SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(if(LEFT(tex;len("không trăm lẻ "))="không trăm lẻ ";REPLACE(tex;1;len("không trăm lẻ ");"");if(LEFT(tex;len("không trăm "))="không trăm ";REPLACE(tex;1;len("không trăm ");"");tex));"một mươi";"mười");"mươi một";"mươi mốt");"mươi năm";"mươi lăm");rmty; SUBSTITUTE( SUBSTITUTE(texupper;LEFT(texupper);UPPER( LEFT(texupper));1)&" đồng";", đồng";" đồng");trim(SUBSTITUTE(rmty;"tỷ";""; COUNTIF( SPLIT(rmty;" ";true);"tỷ,")))))
Số càng cao càng ko chính xác
Mình đã chọn lọc các hàm làm sao để copy từ excel lên gg sheet là sử dụng được liền.
Hàm chi tiết thì mình đã đính kèm trong file
Sau đây mình sẽ phân tích về cách hoạt động của hàm để mọi người cùng đánh giá mức độ hiệu quả và cùng nhau sửa lỗi.
vì 1 cộng đồng excel lớn mạnh:
Bước 1:
mình format số theo định dạng 21 con số (tại sao lại là số 21 hồi sẽ rõ).
B1 = 2385387246
=TEXT(B1;REPT(0;21))
.
Bước 2; tách 3 số thành 1 hàng tính từ trái qua phải (mục đích để cho dễ nối chuỗi lại sau khi hoàn tất)
21 số tương đương với số tối đa là 999 nghìn tỷ và cũng vừa chia hết cho 3

Bước 3: tạo 1 bảng phụ = hàm (sau này đưa vào hàm
ở đây chúng ta có 7 dòng (mặc định)
dòng đầu tương ứng với hàng tỷ, theo sau là triệu, nghìn
=VSTACK(" tỷ ";" triệu ";" nghìn, ";" tỷ ";" triệu ";" nghìn, ";"")
.
Bước 4: xóa các hàng có "000" (sau khi chuyển số thành chữ chúng ta sẽ gộp nó lại như vầy, hàm này tạm thời dừng ở đây)

Bước 5: chơi đùa với 3 con (tạo bảng vlookup)
tạo bảng = text luôn để khi tách số ra khỏi phải chuyển thành số nữa
=HSTACK( VSTACK("1";"2";"3";"4";"5";"6";"7";"8";"9");VSTACK(" một ";" hai ";" ba ";" bốn ";" năm ";" sáu ";" bảy ";" tám ";" chín "))
.
Bước 6: tách hàng trăm
thêm 1 dòng dò "0" vào
=IFNA(VLOOKUP(LEFT(B5#);VSTACK(HSTACK("0";" không ");D15#);2;0);"")&" trăm"
.
Bước 7: làm tới hàng chục
dò hàng chục trong bảng bước 5
Nếu dò đc thì cho ra số nếu ko dò ra = #NA
thì kiểm tra hàng đơn vị có <> "0" và hàng chục = "0" nếu thỏa thì cho chữ "lẻ" vào
=IFNA( VLOOKUP(MID(B5#;2;1);D15#;2;0)&" mươi";IF((MID(B5#;2;1)="0")*(RIGHT(B5#)<>"0");" lẻ ";""))
.
Bước 8: hàng đơn vị
nếu hàng chục = 1 thì vlookup vào bảng D5# bình thường, nếu ko thì thêm "1";" mốt " vào danh sách
11 = mười một (có sẵn trong bảng vlookup)
81 = tám mươi mốt (chữ mốt ko có sẵn trong bảng mình tạo cho nên phải thêm thủ công vào)
nếu lỗi trả về rỗng
=IFNA(IF(MID(B5#;2;1)="1"; VLOOKUP(RIGHT(B5#);D15#;2;0);VLOOKUP(RIGHT(B5#);VSTACK(HSTACK("1";" mốt ");D15#);2;0));"")
.
Bước 9: nối các bước 6 & 7 & 8 & 3 lại thành 1 hàm
=IFNA(VLOOKUP(LEFT(B5#);VSTACK(HSTACK("0";" không ");D15#);2;0);"")&" trăm"&IFNA( VLOOKUP(MID(B5#;2;1);D15#;2;0)&" mươi";IF((MID(B5#;2;1)="0")*(RIGHT(B5#)<>"0");" lẻ ";""))&IFNA(VLOOKUP(RIGHT(B5#);D15#;2;0);"")&VSTACK(" tỷ ";" triệu ";" nghìn, ";" tỷ ";" triệu ";" nghìn, ";"")
.
Bước 10: áp dụng bước 9 vào bước 4 (copy đoạn IF(B5#="000";""; đưa lên trước hàm ifNA rồi enter thôi

Bước 11: nối tất cả lại
=TRIM(TEXTJOIN("";TRUE;IF(B5#="000";"";IFNA(VLOOKUP(LEFT(B5#);VSTACK(HSTACK("0";" không ");D15#);2;0);"")&" trăm"&IFNA(VLOOKUP(MID(B5#;2;1);D15#;2;0)&" mươi";IF((MID(B5#;2;1)="0")*(RIGHT(B5#)<>"0");" lẻ ";""))&IFNA(VLOOKUP(RIGHT(B5#);D15#;2;0);"")&VSTACK(" tỷ, ";" triệu ";" nghìn ";" tỷ, ";" triệu ";" nghìn ";""))))

.
Bước 12: sửa từ, loại bỏ râu ria
xóa cái "không trăm lẻ " đi (nếu có)
=IF(LEFT(E35;LEN("không trăm lẻ "))="không trăm lẻ ";SUBSTITUTE(E35;"không trăm lẻ ";"";1);E35)
đổi các chữ còn lại để đọc cho quen mồm là đc (lồng SUBSTITUTE bên ngoài thôi)
"mươi năm"->"mươi lăm"
"một mươi"->"mười"
"mươi một"->"mười một"
"mươi một"->"mươi mốt"
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(LEFT(E35;LEN("không trăm lẻ "))="không trăm lẻ ";SUBSTITUTE(E35;"không trăm lẻ ";"";1);E35);"mươi năm";"mươi lăm");"một mươi";"mười");"mươi một";"mười một")
.
Bước 13: gộp các bước lại thành 1 hàm hoàn chỉnh
Tính từ bước 12 trở về 1; nếu các bước được nhắc lại quá nhiều thì mình sẽ cho nó vào làm Let (à thêm chữ đồng vào cuối nữa)
gộp công thức tới ô cuối cùng là ngưng dc rồi đó các bạn

Bước 14; đem hàm đi test

có lỗi j thì báo mình sửa nhé
Lỗi 1:

cách sửa tương đối:
VSTACK(" tỷ tỷ, ";" triệu tỷ, ";" nghìn tỷ ";" tỷ, ";" triệu, ";" nghìn ";" ")
=ARRAYFORMULA( LET(monney;C21;bangv;HSTACK( VSTACK("1";"2";"3";"4";"5";"6";"7";"8";"9");VSTACK(" một ";" hai ";" ba ";" bốn ";" năm ";" sáu ";" bảy ";" tám ";" chín ")); tree;MID(TEXT(monney; REPT(0; 21)); SEQUENCE( 7;1;1;3);3); tex; trim(TEXTJOIN("";true; if(tree="000";""; VLOOKUP( LEFT(tree);VSTACK(HSTACK("0";" không "); bangv);2;0)&" trăm "&IF((RIGHT(tree;2)<>"00")+(RIGHT(tree;2)<>"10");IFNA( VLOOKUP(MID(tree;2;1);bangv;2;0)&" mươi";IF((RIGHT(tree)<>"0");" lẻ ";""))&IFNA( VLOOKUP(RIGHT(tree);bangv;2; ) ;"")&VSTACK(" tỷ tỷ, ";" triệu tỷ, ";" nghìn tỷ ";" tỷ, ";" triệu, ";" nghìn ";" "))))); texupper;SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(if(LEFT(tex;len("không trăm lẻ "))="không trăm lẻ ";REPLACE(tex;1;len("không trăm lẻ ");"");if(LEFT(tex;len("không trăm "))="không trăm ";REPLACE(tex;1;len("không trăm ");"");tex));"một mươi";"mười");"mươi một";"mươi mốt");"mươi năm";"mươi lăm");rmty; SUBSTITUTE( SUBSTITUTE(texupper;LEFT(texupper);UPPER( LEFT(texupper));1)&" đồng";", đồng";" đồng");trim(SUBSTITUTE(rmty;"tỷ";""; COUNTIF( SPLIT(rmty;" ";true);"tỷ,")))))
Số càng cao càng ko chính xác
File đính kèm
Lần chỉnh sửa cuối: