[góc chia sẻ] (gg sheet & excel 365) Hàm chuyển tiền thành chữ (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

nhanly_123

Người hướng nội lặn lội với excel
Tham gia
21/7/22
Bài viết
45
Được thích
26
Donate (Momo)
Donate
Giới tính
Nam
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
1680802683952.png

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)
1680802701450.png
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
1680803478461.png
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 ";""))))
1680807397130.png
.
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
1680807117535.png
Bước 14; đem hàm đi test
1680807177225.png

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

Lỗi 1:
339982743_224914026862060_2456242956812795051_n.jpg

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:
@nhanly_123 : Tôi nói đến cách đọc số thành tiền theo quy định. Chứ chưa nói đến vấn đề kỹ thuật cách hàm hoạt động.
Tôi thử với số ở A48, dùng code đọc số thì ra kết quả như sau: "Tám trăm ba mươi hai triệu, chín trăm chín mươi bốn nghìn, chín trăm lẻ hai tỷ, ba trăm tám mươi hai triệu, một trăm ba mươi nghìn, chín trăm bốn mươi bốn đồng."
1) Không hiểu có thêm chữ "chín trăm bốn mươi bốn đồng" ở đâu ra?
2) Chữ "một trăm ba mươi nghìn" chứ không tương ứng với số 131.
3) Giữa các nhóm 3 số thì nên có dấu phảy giữa các nhóm chữ tương ứng.
 
@nhanly_123 : Tôi nói đến cách đọc số thành tiền theo quy định. Chứ chưa nói đến vấn đề kỹ thuật cách hàm hoạt động.
Tôi thử với số ở A48, dùng code đọc số thì ra kết quả như sau: "Tám trăm ba mươi hai triệu, chín trăm chín mươi bốn nghìn, chín trăm lẻ hai tỷ, ba trăm tám mươi hai triệu, một trăm ba mươi nghìn, chín trăm bốn mươi bốn đồng."
1) Không hiểu có thêm chữ "chín trăm bốn mươi bốn đồng" ở đâu ra?
2) Chữ "một trăm ba mươi nghìn" chứ không tương ứng với số 131.
3) Giữa các nhóm 3 số thì nên có dấu phảy giữa các nhóm chữ tương ứng.
kiểm tra lại bạn ơi, 131.000 = "một trăm ba mươi mốt nghìn đông"
1680831424441.png
 
Hiện tại Add-In tôi sử dụng chỉ đọc đến 14 số. Từ số 15 trở lên là chịu, không đọc thành chữ được.
Số ở A48 có đến 18 số. Ngành nào dùng đến số khủng như vậy? @nhanly_123 ?
 
Hiện tại Add-In tôi sử dụng chỉ đọc đến 14 số. Từ số 15 trở lên là chịu, không đọc thành chữ được.
Số ở A48 có đến 18 số. Ngành nào dùng đến số khủng như vậy? @nhanly_123 ?
thừa vẫn tốt hơn thiếu,
add-in thì có thể sử dụng cho các phiên bản excel thấp hơn, còn hàm này là hàm mảng bị giới hạn ở các phiên bản mới nên khả năng nó rộng hơn, có thể ko áp dụng dc nhưng có cái để dùng cũng tốt mà
Bài đã được tự động gộp:

ok, tôi nhầm sang cell mà tôi dùng add in VND() để đọc số từ A48.
Còn trên file của bạn thì vẫn là như tôi trích dẫn.
mình thêm dấu phẩy vào rồi ấy, còn j nữa ko bạn :D
 
thừa vẫn tốt hơn thiếu,
add-in thì có thể sử dụng cho các phiên bản excel thấp hơn, còn hàm này là hàm mảng bị giới hạn ở các phiên bản mới nên khả năng nó rộng hơn, có thể ko áp dụng dc nhưng có cái để dùng cũng tốt mà
Bài đã được tự động gộp:


mình thêm dấu phẩy vào rồi ấy, còn j nữa ko bạn :D
Bạn tham khảo, hàm này chắc excel 2016 dùng được.
1680835965294.png
 
Hy vọng 10 năm nữa có cơ hội dùng, giờ còn đang Office 2021 free nên toàn "#NAME?".
Dù sao thì ngồi gõ =vnd() vẫn nhanh hơn.
 
add-in thì có thể sử dụng cho các phiên bản excel thấp hơn, còn hàm này là hàm mảng bị giới hạn ở các phiên bản mới nên khả năng nó rộng hơn, có thể ko áp dụng dc nhưng có cái để dùng cũng tốt mà
Giờ mới thấy hàm _xlfn ......... không dùng được cho Excel 2010 32bit.
Thay đổi sang sang số khác trong A48 rồi sang B48 nháy kép / nhấn Enter hay Ctrl+Shift+Enter đều ra lỗi #NAME?

Add - In chắc dùng được cho tất cả các phiên bản Excel trong khoảng 25 năm gần đây.
 
Hy vọng 10 năm nữa có cơ hội dùng, giờ còn đang Office 2021 free nên toàn "#NAME?".
Dù sao thì ngồi gõ =vnd() vẫn nhanh hơn.
Làm cho vui thôi, cái hàm ở trên là hồi mới vào diễn đàn, thấy hàm mảng hay nên nghiên cứu, viết cái trên để luyện tập.
Hồi xưa cũng làm 1 cái cho mấy chị ở cơ quan, nhưng xài cột phụ nhiều.
 
Hiện tại Add-In tôi sử dụng chỉ đọc đến 14 số. Từ số 15 trở lên là chịu, không đọc thành chữ được.
Số ở A48 có đến 18 số. Ngành nào dùng đến số khủng như vậy?
1. Đô chính xác của số trong máy vi tính là 15 chữ số. Add-ins chỉ đọc tới 14 là bị hụt mất 1.
2. Máy nào mà có tới 18 chữ số? Trừ phi 3 chữ số cuối cùng là 0's

Chú: thời buổi hiện nay mấy cái hàm này người ta viết lại với Lambda và Let. Mấy giải thuật đời trước 2020 là xưa rồi.
 
1. Đô chính xác của số trong máy vi tính là 15 chữ số. Add-ins chỉ đọc tới 14 là bị hụt mất 1.
2. Máy nào mà có tới 18 chữ số? Trừ phi 3 chữ số cuối cùng là 0's

Chú: thời buổi hiện nay mấy cái hàm này người ta viết lại với Lambda và Let. Mấy giải thuật đời trước 2020 là xưa rồi.
Đúng bác. Đã mất công xài bản mới thì tận dụng những hàm mới cho gọn. Còn xài bản cũ cứ add-ins, hoặc cột phụ cho gọn. Sai còn dễ sửa.
 
1. Đô chính xác của số trong máy vi tính là 15 chữ số
Cái này theo tìm hiểu sơ sơ của em thì muốn tính toán số dài hơn 15 số là tất cả quá trình tính toán (+-*/ lũy thừa, căn, ...............) buộc phải thực hiện bằng các loại lập trình phải không bác.
VD: Định dạng text cho cell rồi nhập thì được, nhưng cho hàm text vào nó cũng chả ra thể thống gì.
Em đang định tính thử tài sản của lão Musk đổi ra tờ 1 ZWD rồi cuộn tròn liên tiếp lại xem được bao nhiêu nanomet mà có vẻ khó khăn quá.
 

File đính kèm

  • 1680849045551.png
    1680849045551.png
    7.5 KB · Đọc: 14
Cái này theo tìm hiểu sơ sơ của em thì muốn tính toán số dài hơn 15 số là tất cả quá trình tính toán (+-*/ lũy thừa, căn, ...............) buộc phải thực hiện bằng các loại lập trình phải không bác.
Tìm kiếm theo từ khóa Very Large Integer..

Em đang định tính thử tài sản của lão Musk đổi ra tờ 1 ZWD rồi cuộn tròn liên tiếp lại xem được bao nhiêu nanomet mà có vẻ khó khăn quá.
Có thiện chí, nhưng đi sai đường.
Tài sản lão Musk giúp gì cho kiến thức bạn?
Muốn con số lớn thì tìm con số tổng ngân lưu hằng ngày của The Fed (the US Federal Reserve System), vừa học thêm kiến thức.
 
@ tác giả topic: Làm sao (công thức, code, hay cách gì gì đó) để dùng được cho tất cả các phiên bản Excel trong khoảng 25 năm gần đây. Thì chắc hợp lý hơn nhỉ?
Trong toàn bộ những người sử dụng Office thì đâu phải tất cả họ sử dụng Office từ phiên bản năm 2020 đến 2023.
 
Hai quan niệm trái ngược về phát triển phần mềm (software development)

1. Hoài cổ: phần mềm phải phù hợp vói các phiên bản thượng cổ (backward compatibility). Rất tiếc, các phiên bản cũ sẽ giới hạn phần mềm rất nhiều. Điển hình cấu trúc Excel 4 khác hẳn Excel 78, 2003 khác hẳn 2010 và khác 2019.

2. Cấp tiến: phần mềm có những chỗ dễ cập nhật với những thêm thắt mới. Tức con đường MS 365, rất tiếc là MS lỡ mang một đống ứng dụng trên thị truonwgf cho nên bắt buộc phải backward compatibility. Như con ngựa thiên lý mã bị vác thêm chiếc cày.
Nếu một ngày nào đó Google Sheets qua mặt Excel 365 thì phần lớn là ở điểm này. (GS không phải vác chếc cày)
 
Hai quan niệm trái ngược về phát triển phần mềm (software development)

1. Hoài cổ: phần mềm phải phù hợp vói các phiên bản thượng cổ (backward compatibility). Rất tiếc, các phiên bản cũ sẽ giới hạn phần mềm rất nhiều. Điển hình cấu trúc Excel 4 khác hẳn Excel 78, 2003 khác hẳn 2010 và khác 2019.

2. Cấp tiến: phần mềm có những chỗ dễ cập nhật với những thêm thắt mới. Tức con đường MS 365, rất tiếc là MS lỡ mang một đống ứng dụng trên thị truonwgf cho nên bắt buộc phải backward compatibility. Như con ngựa thiên lý mã bị vác thêm chiếc cày.
Nếu một ngày nào đó Google Sheets qua mặt Excel 365 thì phần lớn là ở điểm này. (GS không phải vác chếc cày)
GS không vác cày nhưng lại vác theo cái túi. --=0
 
Em có thử áp con chát GPT trong trang tính của Google. Thấy test thử nó tương đối đúng. Hi vọng con Bot này nó không lươn lẹo. Chứ mà đọc tùm lum là mình cũng toi luôn
1680866599313.png
 
GPT chưa đủ trình độ tách dấu phẩy mỗi cấp số nghìn đơn vị đâu người ơi.
Nó trả lời được là do nó có tài nguyên máy tính siêu mạnh, dữ liệu siêu khủng. Chứ nó không có tri giác và trí tuệ.

Một lần gọi nó, với nhiều tham số. Tiêu hao số tiền đủ cho bạn "ăn cơm cả tháng".

"Chúng ta đang cùng nhau tàn phá trái đất một cách nhanh nhất"
 
Có thiện chí, nhưng đi sai đường.
Em đang định tính thử tài sản của lão Musk đổi ra tờ 1 ZWD rồi cuộn tròn liên tiếp lại xem được bao nhiêu nanomet
Không những sai đường mà lại còn sai toán lý hóa các loại. Có biết 1 nanomet so với 1 mét lớn cỡ nào không?
Với lại làm gì có loại tiền ZWD, chỉ có APD thôi (dollar âm phủ), bảo đảm đo bằng megamet, gigamet, tetramet trở lên.
 
Sau khi share bài lên các group fb thì mình nhận ra là thuật toán mình làm ở bài trên nó vẫn bị lỗi và không thể sửa đc
Nên mình viết lại thuật toán mới, ưu điểm phiên bản này là dễ sửa lỗi hơn.
1680927424117.png
Sau bước 4 là dùng textjoin nối chuỗi lại với nhau và dùng SUBSTITUTE để xóa các trường hợp lỗi chữ thôi
Full hàm:

=LET(money;TEXT(B49;REPT(0;21));haichin;VSTACK("hai";"ba";"bốn";"năm";"sáu";"bảy";"tám";"chín");bangv;HSTACK(TEXT(SEQUENCE(10;1;0);"@");VSTACK("không";"một";haichin)&" trăm";SUBSTITUTE(SUBSTITUTE(VSTACK("lẻ";"mười";haichin)&" mươi";"lẻ mươi";"lẻ");"mười mươi";"mười");VSTACK("";"một";haichin));bonso;MID(money;SEQUENCE(4;1;10;3);3);baso;MID(money;SEQUENCE(3;1;1;3);3);tn;VSTACK(" tỷ, ";" triệu, ";" nghìn, ");ttn;VSTACK(" tỷ, ";" triệu, ";" nghìn, ";"");tex;TRIM(TEXTJOIN(;TRUE;IF(baso="000";"";VLOOKUP(MID(baso;1;1);bangv;1+1;FALSE)&" "&VLOOKUP(MID(baso;2;1);bangv;2+1;FALSE)&" "&VLOOKUP(MID(baso;3;1);bangv;3+1;FALSE)&tn);IF((INDEX(bonso;1)<>"000")+(SUM(baso*1)=0);"";" tỷ, "))&TEXTJOIN(;TRUE;IF(bonso="000";"";VLOOKUP(MID(bonso;1;1);bangv;1+1;FALSE)&" "&VLOOKUP(MID(bonso;2;1);bangv;2+1;FALSE)&" "&VLOOKUP(MID(bonso;3;1);bangv;3+1;FALSE)&ttn);" đồng"));viet_hoa;SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(LEFT(tex;LEN("không trăm lẻ "))="không trăm lẻ ";SUBSTITUTE(tex;"không trăm lẻ ";"";1);IF(LEFT(tex;LEN("không trăm "))="không trăm ";SUBSTITUTE(tex;"không trăm ";"";1);IF(LEFT(tex;LEN("lẻ nghìn, "))="lẻ nghìn, ";SUBSTITUTE(tex;"lẻ nghìn, ";"";1);tex)));"lẻ triệu, ";"triệu, ");"lẻ nghìn, ";"nghìn, ");"lẻ đồng";" đồng");"mươi năm";"mươi lăm");"mươi một";"mươi mốt");"lẻ tỷ, ";"tỷ, ");"nghìn, tỷ, ";"nghìn tỷ, ");"triệu, tỷ, ";"triệu tỷ, ");", đồng";" đồng");TRIM(SUBSTITUTE(viet_hoa;LEFT(viet_hoa);UPPER(LEFT(viet_hoa));1)))

1680929496243.png
 

File đính kèm

Lần chỉnh sửa cuối:
Thử thì phải thử mấy cái số độc độc kiểu 1000010101001001, chứ thử mấy cái số bình thường thì sao bẫy hết lỗi.
À lỗi thiệt, đổi số 1 bên phải thành số 0 thì nó lại chạy bt
Bài đã được tự động gộp:

Thử thì phải thử mấy cái số độc độc kiểu 1000010101001001, chứ thử mấy cái số bình thường thì sao bẫy hết lỗi.
đã tìm ra lỗi, khi bạn bấm con số đặc biệt này vào thì excel nó nhận dạng là số nhị phân, ko phải số thực, cho nên hàm sẽ tính toán lỗi, lấy ô nhị phân đó *1 là hết lỗi
1680934137193.png
 
Lần chỉnh sửa cuối:
Thử lại vs hàm này:

Mã:
=LET(money;TEXT(B49*1;REPT(0;21));haichin;VSTACK("hai";"ba";"bốn";"năm";"sáu";"bảy";"tám";"chín");bangv;HSTACK(TEXT(SEQUENCE(10;1;0);"@");VSTACK("không";"một";haichin)&" trăm";SUBSTITUTE(SUBSTITUTE(VSTACK("lẻ";"mười";haichin)&" mươi";"lẻ mươi";"lẻ");"mười mươi";"mười");VSTACK("";"một";haichin));bonso;MID(money;SEQUENCE(4;1;10;3);3);baso;MID(money;SEQUENCE(3;1;1;3);3);tn;VSTACK(" tỷ, ";" triệu, ";" nghìn, ");ttn;VSTACK(" tỷ, ";" triệu, ";" nghìn, ";"");tex;TRIM(TEXTJOIN(;TRUE;IF(baso="000";"";VLOOKUP(MID(baso;1;1);bangv;1+1;FALSE)&" "&VLOOKUP(MID(baso;2;1);bangv;2+1;FALSE)&" "&VLOOKUP(MID(baso;3;1);bangv;3+1;FALSE)&tn);IF((INDEX(bonso;1)<>"000")+(SUM(baso*1)=0);"";" tỷ, "))&TEXTJOIN(;TRUE;IF(bonso="000";"";VLOOKUP(MID(bonso;1;1);bangv;1+1;FALSE)&" "&VLOOKUP(MID(bonso;2;1);bangv;2+1;FALSE)&" "&VLOOKUP(MID(bonso;3;1);bangv;3+1;FALSE)&ttn);" đồng"));viet_hoa;SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(LEFT(tex;LEN("không trăm lẻ "))="không trăm lẻ ";SUBSTITUTE(tex;"không trăm lẻ ";"";1);IF(LEFT(tex;LEN("không trăm "))="không trăm ";SUBSTITUTE(tex;"không trăm ";"";1);IF(LEFT(tex;LEN("lẻ nghìn, "))="lẻ nghìn, ";SUBSTITUTE(tex;"lẻ nghìn, ";"";1);tex)));"lẻ triệu, ";"triệu, ");"lẻ nghìn, ";"nghìn, ");"lẻ đồng";" đồng");"mươi năm";"mươi lăm");"mươi một";"mươi mốt");"lẻ tỷ, ";"tỷ, ");"nghìn, tỷ, ";"nghìn tỷ, ");"triệu, tỷ, ";"triệu tỷ, ");", đồng";" đồng");TRIM(SUBSTITUTE(viet_hoa;LEFT(viet_hoa);UPPER(LEFT(viet_hoa));1))) đồng");TRIM(SUBSTITUTE(viet_hoa;LEFT(viet_hoa);UPPER(LEFT(viet_hoa));1)))
 
Lần chỉnh sửa cuối:
Thử để vào đây xem sao.
Mã:
=LET(money;TEXT(B49*1;REPT(0;21));haichin;VSTACK("hai";"ba";"bốn";"năm";"sáu";"bảy";"tám";"chín");bangv;HSTACK(TEXT(SEQUENCE(10;1;0);"@");VSTACK("không";"một";haichin)&" trăm";SUBSTITUTE(SUBSTITUTE(VSTACK("lẻ";"mười";haichin)&" mươi";"lẻ mươi";"lẻ");"mười mươi";"mười");VSTACK("";"một";haichin));bonso;MID(money;SEQUENCE(4;1;10;3);3);baso;MID(money;SEQUENCE(3;1;1;3);3);tn;VSTACK(" tỷ, ";" triệu, ";" nghìn, ");ttn;VSTACK(" tỷ, ";" triệu, ";" nghìn, ";"");tex;TRIM(TEXTJOIN(;TRUE;IF(baso="000";"";VLOOKUP(MID(baso;1;1);bangv;1+1;FALSE)&" "&VLOOKUP(MID(baso;2;1);bangv;2+1;FALSE)&" "&VLOOKUP(MID(baso;3;1);bangv;3+1;FALSE)&tn);IF((INDEX(bonso;1)<>"000")+(SUM(baso*1)=0);"";" tỷ, "))&TEXTJOIN(;TRUE;IF(bonso="000";"";VLOOKUP(MID(bonso;1;1);bangv;1+1;FALSE)&" "&VLOOKUP(MID(bonso;2;1);bangv;2+1;FALSE)&" "&VLOOKUP(MID(bonso;3;1);bangv;3+1;FALSE)&ttn);" đồng"));viet_hoa;SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(LEFT(tex;LEN("không trăm lẻ "))="không trăm lẻ ";SUBSTITUTE(tex;"không trăm lẻ ";"";1);IF(LEFT(tex;LEN("không trăm "))="không trăm ";SUBSTITUTE(tex;"không trăm ";"";1);IF(LEFT(tex;LEN("lẻ nghìn, "))="lẻ nghìn, ";SUBSTITUTE(tex;"lẻ nghìn, ";"";1);tex)));"lẻ triệu, ";"triệu, ");"lẻ nghìn, ";"nghìn, ");"lẻ đồng";" đồng");"mươi năm";"mươi lăm");"mươi một";"mươi mốt");"lẻ tỷ, ";"tỷ, ");"nghìn, tỷ, ";"nghìn tỷ, ");"triệu, tỷ, ";"triệu tỷ, ");", đồng";" đồng");TRIM(SUBSTITUTE(viet_hoa;LEFT(viet_hoa);UPPER(LEFT(viet_hoa));1))) đồng");TRIM(SUBSTITUTE(viet_hoa;LEFT(viet_hoa);UPPER(LEFT(viet_hoa));1)))
 
Tại hạ xin bái phục!!!
Nhưng khẳng định lại là Office 2021 không dùng được. Hy vọng các bạn có thể update cho Office 2003 đến 2021 với. Dân ta còn nghèo, còn rất nhiều người chưa tiếp cận được 3 chai 65.
Bài đã được tự động gộp:


 
Tại hạ xin bái phục!!!
Nhưng khẳng định lại là Office 2021 không dùng được. Hy vọng các bạn có thể update cho Office 2003 đến 2021 với. Dân ta còn nghèo, còn rất nhiều người chưa tiếp cận được 3 chai 65.
Bài đã được tự động gộp:
Hình như bạn ko biết là Google sheets miễn phí sử dụng đúng k
 
Hình như bạn ko biết là Google sheets miễn phí sử dụng đúng k
Cái này thì mình biết, nhưng dùng không quen so với Office. Trừ khi bị cấm dùng Office hoặc Microsoft phá sản, hoặc tất cả mọi người cùng chuyển sang thì may ra.
 
Cái này thì mình biết, nhưng dùng không quen so với Office. Trừ khi bị cấm dùng Office hoặc Microsoft phá sản, hoặc tất cả mọi người cùng chuyển sang thì may ra.
Rảnh rỗi thì bạn cứ sd thử xem, trước mình cũng chê như bạn đấy, nhưng dùng rồi thì ghiền.
Thứ 1 về tính tiện lợi, nó chạy trên nền web, hàm đc cập nhật liên tục, nên trừ khi bạn ko vô mạng dc thì những tính năng miễn phí của nó cũng quá dư dả cho mình sd.
Thứ 2 tự động lưu file, máy có lỡ sụp nguồn hay cúp điện thì mình cũng an tâm nhắm mắt ngủ.
Thứ 3 dễ dàng chia sẻ và phân quyền chia sẻ
Thứ 4 đc tích hợp sẵn các function hay ho từ Google
Thứ 5 trình chỉnh sửa code dễ dàng fix bug và tự động đề xuất câu lệnh
So với việc phải trả phí sd như 365 thì tính năng của Google sheets quá ư là tự do trong việc giúp mình tự học hỏi
 
Thứ nhất là mình không chê, vì vẫn đang dùng Gmail, dùng gói rẻ nhất của Google One. Google là cái gì đó nó cực quan trọng, từ mail để đăng nhập các nơi, từ map để mò đường lung tung, từ Drive để đồng bộ file, từ Sheets, Docs để xem Office trên điện thoại cho đỡ nặng, từ Youtube để xem Thái Sơn Hoa Dương, từ Photos để lưu ảnh, từ Find Device để tìm trộm.... Nếu 1 ngày mà Google phá sản thì sẽ không biết thế lào luôn.
Nhưng hiện giờ với Office thì Google tạm thời là người đến sau, nên phải chờ suất đến lượt.
Thứ 2 tự động lưu file
Cái này không được. Mình thường dựa vào ngày chỉnh sửa để xem file cũ hay mới nên với mình cái này không phù hợp.
 
Rảnh rỗi thì bạn cứ sd thử xem, trước mình cũng chê như bạn đấy, nhưng dùng rồi thì ghiền.
Thứ 1 về tính tiện lợi, nó chạy trên nền web, hàm đc cập nhật liên tục, nên trừ khi bạn ko vô mạng dc thì những tính năng miễn phí của nó cũng quá dư dả cho mình sd.
Thứ 2 tự động lưu file, máy có lỡ sụp nguồn hay cúp điện thì mình cũng an tâm nhắm mắt ngủ.
Thứ 3 dễ dàng chia sẻ và phân quyền chia sẻ
Thứ 4 đc tích hợp sẵn các function hay ho từ Google
Thứ 5 trình chỉnh sửa code dễ dàng fix bug và tự động đề xuất câu lệnh
So với việc phải trả phí sd như 365 thì tính năng của Google sheets quá ư là tự do trong việc giúp mình tự học hỏi
Đối với tôi thì đã quá muộn để có thể chuyển qua G.Sheets. Thứ nhất là tôi cũng không còn đi làm nữa nên không có nhu cầu và động cơ thay đổi. Thứ hai, tôi thường dùng VBA và đã quá quen dùng nó hơn là công thức nên không muốn chuyển qua G.sheets để rồi phải học thêm google apps script.
 
Con số 1 cuối cùng đâu rồi?

1681148198953.png
 
cái bác thấy ở ô A1 nó vẫn là số nhị phân, khi *1 nó trở thành số thực. Mà thằng excel này nó tự làm tròn hàng chục khi con số trở nên quá lớn.
Hình ảnh dưới đây cho thấy mình đã thêm số 1 vào hàng đơn vị nhưng nó tự làm tròn thành số 0. VÌ thế công thức trả về như thế.
cái này mình ko biết sửa.
1681180549378.png
Bài đã được tự động gộp:

Đối với tôi thì đã quá muộn để có thể chuyển qua G.Sheets. Thứ nhất là tôi cũng không còn đi làm nữa nên không có nhu cầu và động cơ thay đổi. Thứ hai, tôi thường dùng VBA và đã quá quen dùng nó hơn là công thức nên không muốn chuyển qua G.sheets để rồi phải học thêm google apps script.
Người sd rành như bác thì dùng bên nào cũng được. Còn đối với những người mới sd thì nên chọn gg sheet vì sẽ giúp cho việc support dễ dàng hơn rất nhiều. Những vấn đề lỗi file các thứ cũng dc khắc phục.
Nhu cầu công ty càng ngày càng cao, mà cứ ôm mãi cái excel 2003, 2010 thì vba cũng khó mà gánh ko nổi. Người ta ko có tiền nâng cấp phần mềm excel, cũng như ko có tiền để thuê đội ngũ cập nhật phần mềm cho công ty, thì đương nhiên người ta cũng k có tiền để thuê người viết code vba. Trong khi đó gg sheet miễn phí thì ko ai dùng.
 
Lần chỉnh sửa cuối:
cái bác thấy ở ô A1 nó vẫn là số nhị phân, khi *1 nó trở thành số thực. Mà thằng excel này nó tự làm tròn hàng chục khi con số trở nên quá lớn.
Hình ảnh dưới đây cho thấy mình đã thêm số 1 vào hàng đơn vị nhưng nó tự làm tròn thành số 0. VÌ thế công thức trả về như thế.
cái này mình ko biết sửa.
Chuyển về text là được. Thêm dấu nháy trước số.
1681183604160.png
Không biết quy tắc đọc những số lớn thì như thế nào. Nhưng theo mình thì để tỷ tỷ hợp lý hơn.
Chủ thớt tham khảo thêm ở đây nhé.
 
Hy vọng các bạn có thể update cho Office 2003 đến 2021 với.
Để hôm nào đẹp trời tôi sẽ gửi lên. Công thức sẽ sử dụng được trên Office 2007 trở lên (Office 2003 quá lạc hậu, nhiều hạn chế nên rất khó) và sẽ ngắn hơn công thức ở đây nhiều (chắc chỉ bằng 1/2).
 
Tôi chỉ quan tâm đến việc đọc đúng hay sai. Thiếu số 1 ở cuối thì tôi ý kiến, còn nhị phân hay không nhị phân thì chưa bàn tới.
Nếu bác gõ số thực (gõ thêm số khác 1 và 0) thì hàm sẽ ra kết quả đúng.
Bài đã được tự động gộp:

Để hôm nào đẹp trời tôi sẽ gửi lên. Công thức sẽ sử dụng được trên Office 2007 trở lên (Office 2003 quá lạc hậu, nhiều hạn chế nên rất khó) và sẽ ngắn hơn công thức ở đây nhiều (chắc chỉ bằng 1/2).
Nếu có cách khác ngắn gọn hơn, hi vọng là bác chia sẻ thuật toán để viết ra nó nhé.
Xin học hỏi thêm.
 
Lần chỉnh sửa cuối:
Nếu bác gõ số thực (gõ thêm số khác 1 và 0) thì hàm sẽ ra kết quả đúng.
Tôi viết hóa đơn có tổng tiền hóa đơn, tôi tính tổng 1 báo cáo, nếu kết quả chỉ ra 1 và 0 thì tôi thêm vào cái gì? Thêm vào để ra báo cáo sai á hả?
Hóa đơn sai là ở tù, báo cáo sai là bị đuổi. Làm như chuyện đùa của con nít.
 
Tôi viết hóa đơn có tổng tiền hóa đơn, tôi tính tổng 1 báo cáo, nếu kết quả chỉ ra 1 và 0 thì tôi thêm vào cái gì? Thêm vào để ra báo cáo sai á hả?
Hóa đơn sai là ở tù, báo cáo sai là bị đuổi. Làm như chuyện đùa của con nít.
như em đã nói ở trên, nếu số chỉ có 1 và 0, thì hàm nó tự chuyển theo định dạng cần thiết để cho ra kết quả (việc chỉ hiển thị 1 và 0 khi anh gõ vào và hiển thị ra bản chất nó ko phải là số, nó là nhị phân), nhưng khi số quá dài thì excel tự động làm tròn hàng đơn vị, (cái này em ko biết sửa).
  • Cái số anh nhìn vào nó là nhị phân (excel ko làm tròn số nhị phân)
  • Cái số hàm xử lý là số thực (bị excel làm tròn)
  • Anh thử định dạng number rồi gõ số dài ngoằn như vậy vào xem, nó tự động làm tròn hàng đơn vị luôn. Hàm ko thấy số nên nó ko xử lý được thôi anh.
Nếu anh có xem kỹ cách em làm thì em tách từng số ra vlookup với 1 cái bảng cho trước để cho ra chữ số. cho nên số nào nó ra chữ nấy, ko trật đc.
Vấn đề nằm ở định dạng ô ban đầu. định dạng ô đúng thì hàm sẽ chạy ra đúng.
Thêm nữa, trường hợp anh đưa ra rất ít khi gặp
1. vì số quá lớn, 1triệu tỷ
2. số chỉ có 1 và 0
nên trong trường hợp cực kỳ hiếm này cần phải để ý kỹ hơn đến kết quả thôi.
Em đã từng test rất nhiều công thức khác của các anh em đi trươc. Ko có công thức nào đếm được tới Triệu Tỷ cả. Em cũng phải kiểm tra kết quả khi gặp trường hợp đặc biệt như thế này thôi.
 
Đang rảnh nên góp vui chút hàm 365 đọc số thành chữ không giới hạn độ dài (kết quả tạm ổn), text hay number đều được
Mã:
=LET(
tbl_1,{"","một","hai","ba","bốn","năm","sáu","bảy","tám","chín"},
tbl_2,{0,1,2,3,4,5,6,7,8,9},
tbl_3,{"triệu";"ngàn";""},
fnc_1,LAMBDA(arr,LET(
       tbl_2,MAP(ROW($1:$3),LAMBDA(e,
                       IF(e=1,IF(INDEX(arr,e)="","",INDEX(arr,e)&" trăm"),
                       IF(e=2,IF(INDEX(arr,e)="",IF(OR(INDEX(arr,e-1)="",INDEX(arr,e+1)=""),"","lẻ"),IF(INDEX(arr,e)="một","mười",INDEX(arr,e)&" mươi")),
                       INDEX(arr,e))))),
        TEXTJOIN(" ",,tbl_2))),
fnc_split,LAMBDA(t,LET(arr_split,MID(t,SEQUENCE(LEN(t)),1),
        INDEX(tbl_1,MATCH(--arr_split,tbl_2,0)))),
fnc_vndc9,LAMBDA(txt_ip,LET(
        txt,REPT(0,9-LEN(txt_ip))&txt_ip,
        txt_split,MID(txt,SEQUENCE(3,,0)*3+1,3),
        arr_res,MAP(txt_split,LAMBDA(t,fnc_1(fnc_split(t)))),
        TEXTJOIN(", ",,FILTER(arr_res&" "&tbl_3,txt_split<>"000")))),
fnc_vnd_full,LAMBDA(txt_ip0,LET(
        n,INT((LEN(txt_ip0)-1)/9)+1,
        txt0,REPT(0,n*9-LEN(txt_ip0))&txt_ip0,
        txt_splitc9,MID(txt0,SEQUENCE(n,,0)*9+1,9),
        arr_ty,MAP(SEQUENCE(n),LAMBDA(e,IF(e<n," tỷ"," "))),
        txt_res1,SUBSTITUTE(TRIM(TEXTJOIN(", ",,IFERROR(MAP(txt_splitc9,LAMBDA(e,fnc_vndc9(e))),"")&arr_ty)& " đồng"),", đồng"," đồng"),
        UPPER(LEFT(txt_res1))&MID(txt_res1,2,LEN(txt_res1)))),
fnc_vnd_full(A1))
 

File đính kèm

Bây h mình mới xem hàm của bạn, đúng thật là có chạy tới triệu tỷ, nhưng vấn đề đặt ra là excel làm tròn hàng đơn vị nếu như người dùng nhập hàng đơn vị vào số triệu tỷ. Về cách thức hàm của bạn cũng tách 3 số ra để dò giống mình nên cơ chế nó cũng như nhau.
Bài đã được tự động gộp:

Đang rảnh nên góp vui chút hàm 365 đọc số thành chữ không giới hạn độ dài (kết quả tạm ổn), text hay number đều được
Mã:
=LET(
tbl_1,{"","một","hai","ba","bốn","năm","sáu","bảy","tám","chín"},
tbl_2,{0,1,2,3,4,5,6,7,8,9},
tbl_3,{"triệu";"ngàn";""},
fnc_1,LAMBDA(arr,LET(
       tbl_2,MAP(ROW($1:$3),LAMBDA(e,
                       IF(e=1,IF(INDEX(arr,e)="","",INDEX(arr,e)&" trăm"),
                       IF(e=2,IF(INDEX(arr,e)="",IF(OR(INDEX(arr,e-1)="",INDEX(arr,e+1)=""),"","lẻ"),IF(INDEX(arr,e)="một","mười",INDEX(arr,e)&" mươi")),
                       INDEX(arr,e))))),
        TEXTJOIN(" ",,tbl_2))),
fnc_split,LAMBDA(t,LET(arr_split,MID(t,SEQUENCE(LEN(t)),1),
        INDEX(tbl_1,MATCH(--arr_split,tbl_2,0)))),
fnc_vndc9,LAMBDA(txt_ip,LET(
        txt,REPT(0,9-LEN(txt_ip))&txt_ip,
        txt_split,MID(txt,SEQUENCE(3,,0)*3+1,3),
        arr_res,MAP(txt_split,LAMBDA(t,fnc_1(fnc_split(t)))),
        TEXTJOIN(", ",,FILTER(arr_res&" "&tbl_3,txt_split<>"000")))),
fnc_vnd_full,LAMBDA(txt_ip0,LET(
        n,INT((LEN(txt_ip0)-1)/9)+1,
        txt0,REPT(0,n*9-LEN(txt_ip0))&txt_ip0,
        txt_splitc9,MID(txt0,SEQUENCE(n,,0)*9+1,9),
        arr_ty,MAP(SEQUENCE(n),LAMBDA(e,IF(e<n," tỷ"," "))),
        txt_res1,SUBSTITUTE(TRIM(TEXTJOIN(", ",,IFERROR(MAP(txt_splitc9,LAMBDA(e,fnc_vndc9(e))),"")&arr_ty)& " đồng"),", đồng"," đồng"),
        UPPER(LEFT(txt_res1))&MID(txt_res1,2,LEN(txt_res1)))),
fnc_vnd_full(A1))
khá là hay đấy, tạm ổn là sao bạn.
Hàm của bạn mà đưa lên google sheet chạy dc luôn thì lợi hại hơn mình r
 
Lần chỉnh sửa cuối:
"tạm ổn" tức là là người ta viết nhẹ nhàng khiêm tốn. :)

----
Cỡ triệu tỉ mà sai số thì phăng teo mạng luôn á.
 
Bây h mình mới xem hàm của bạn, đúng thật là có chạy tới triệu tỷ, nhưng vấn đề đặt ra là excel làm tròn hàng đơn vị nếu như người dùng nhập hàng đơn vị vào số triệu tỷ. Về cách thức hàm của bạn cũng tách 3 số ra để dò giống mình nên cơ chế nó cũng như nhau.
Bài đã được tự động gộp:


khá là hay đấy, tạm ổn là sao bạn.
Hàm của bạn mà đưa lên google sheet chạy dc luôn thì lợi hại hơn mình r
Với tôi kết quả nó chỉ tạm ổn thôi
GG sheet nhiều hàm nó phát triển dựa trên hàm Excel nhưng không đa dạng như excel, chỉnh lại chút là được, bạn xem link file GG sheet
 
Hình như phải sửa chút từ "mốt" và "lăm" nữa các bác ạ.
 
như em đã nói ở trên, nếu số chỉ có 1 và 0, thì hàm nó tự chuyển theo định dạng cần thiết để cho ra kết quả (việc chỉ hiển thị 1 và 0 khi anh gõ vào và hiển thị ra bản chất nó ko phải là số, nó là nhị phân), nhưng khi số quá dài thì excel tự động làm tròn hàng đơn vị, (cái này em ko biết sửa).
  • Cái số anh nhìn vào nó là nhị phân (excel ko làm tròn số nhị phân)
  • Cái số hàm xử lý là số thực (bị excel làm tròn)
  • Anh thử định dạng number rồi gõ số dài ngoằn như vậy vào xem, nó tự động làm tròn hàng đơn vị luôn. Hàm ko thấy số nên nó ko xử lý được thôi anh.
Nếu anh có xem kỹ cách em làm thì em tách từng số ra vlookup với 1 cái bảng cho trước để cho ra chữ số. cho nên số nào nó ra chữ nấy, ko trật đc.
Vấn đề nằm ở định dạng ô ban đầu. định dạng ô đúng thì hàm sẽ chạy ra đúng.
Thêm nữa, trường hợp anh đưa ra rất ít khi gặp
1. vì số quá lớn, 1triệu tỷ
2. số chỉ có 1 và 0
nên trong trường hợp cực kỳ hiếm này cần phải để ý kỹ hơn đến kết quả thôi.
Em đã từng test rất nhiều công thức khác của các anh em đi trươc. Ko có công thức nào đếm được tới Triệu Tỷ cả. Em cũng phải kiểm tra kết quả khi gặp trường hợp đặc biệt như thế này thôi.
Tôi nhắc lại là tôi chỉ quan tâm đến đúng và sai. Tôi không cần biết nhị phân hay không nhị phân, định dạng hay không định dạng. Tôi cũng không cần biết bạn tách số kiểu gì, lookup kiểu nào.
- Một trường hợp sai nhìn thấy (và cả những trường hợp chưa nhìn thấy), là cái sai phải sửa. Nói thêm là tôi nhìn thấy chứ tôi không tự nghĩ mà đưa ra
- Cái sai phải sửa mà "ko biết sửa", không sửa, thì hàm không có giá trị sử dụng
-Hàm không có giá trị sử dụng mà mang tiếng chia sẻ thì cái chia sẻ đó vô giá trị.
Tôi có thể thông báo rằng chủ đề chia sẻ này vô giá trị, và khuyến cáo mọi người đừng đem về dùng.
 
Bây h mình mới xem hàm của bạn, đúng thật là có chạy tới triệu tỷ, nhưng vấn đề đặt ra là excel làm tròn hàng đơn vị nếu như người dùng nhập hàng đơn vị vào số triệu tỷ. Về cách thức hàm của bạn cũng tách 3 số ra để dò giống mình nên cơ chế nó cũng như nhau.
Như bạn thấy, cái hàm củ chuối của mình vẫn đọc được số lẻ hàng đơn vị của số có 22 chữ số. Nên không thể nói cơ chế như nhau được.
Thực ra mình tách đến từng chữ số một, cụ thể hàm mid mình chỉ lấy 1 chữ số, tuy nhiên mình chia làm 3 cột để đọc từng bộ 3 số, nên không bị giới hạn về độ dài của số.
Cái hàm ban đầu mình chỉ làm cho 15 số, còn hơn nữa chưa test hết nên sẽ có sai. Nhưng tùy biến và chỉnh sửa sẽ dễ hơn cái bạn đang làm. Mình tin là nếu dùng hàm let, sẽ rút gọn hơn nữa nhưng thực sự mình chưa rành hàm này nên chưa làm.
 
...
- Cái sai phải sửa mà "ko biết sửa", không sửa, thì hàm không có giá trị sử dụng
...
Bất cứ cái gì không thể triệt được chỗ sai thì khong có giá trị sử dụng. Trừ phi có khuyến cáo cho người dùng rằng "hàm không bảo đảm kết quả khi gặp trong trường hợp ..."
Tuy nhiên, nếu tôi bí quá, cần phải tung cho người dùng một sản phẩm dở dang thì tôi sẽ đặt thêm trường hợp sai thì cho kết quả "Cảnh báo! Hàm không đọc được dữ liệu này"

Tuy nhiên, theo nhận xét thì thớt quá chủ quan khi tung lên thành "chia sẻ". Đáng lẽ phải khiêm nhường hơn, đưa lên và nhờ người khác test giùm.

Chú thích:
Thớt chưa rành về "số" trong máy tính cho nên lý luận như vậy.
Excel chắc chắn làm tròn số nhị phân . Bởi vì nó chứa số thực (Double) theo dạng nhị phân.
Double có 16 bytes, tức 64 bít. Tiêu chuẩn chứa số cho phép dùng 53 bít để chứa chữ số, cho nên chỉ có thể chứa đến 15 chữ số. 11 bít còn lại dùng để chứa lũy thừa (^10).
Excel mặc định số là Double. VBA mới cho chọn Byte, Int, Long Single, hay Double.
Kiểu Single chỉ chính xác tới 8 chữ số. Bởi vậy mới có từ Single (single precision) và Double (double precision). Double đơn giản có nghĩa là tăng đôi đọ chính xác lên.
Có dạng số Decimal chứa được giá trị chính xác đến 28 chữ số. Nhưng chỉ dùng được trong VBA và cũng hơi khó khai báo.
 
Tôi nhắc lại là tôi chỉ quan tâm đến đúng và sai. Tôi không cần biết nhị phân hay không nhị phân, định dạng hay không định dạng. Tôi cũng không cần biết bạn tách số kiểu gì, lookup kiểu nào.
- Một trường hợp sai nhìn thấy (và cả những trường hợp chưa nhìn thấy), là cái sai phải sửa. Nói thêm là tôi nhìn thấy chứ tôi không tự nghĩ mà đưa ra
- Cái sai phải sửa mà "ko biết sửa", không sửa, thì hàm không có giá trị sử dụng
-Hàm không có giá trị sử dụng mà mang tiếng chia sẻ thì cái chia sẻ đó vô giá trị.
Tôi có thể thông báo rằng chủ đề chia sẻ này vô giá trị, và khuyến cáo mọi người đừng đem về dùng.
nghe BQT mà nói vậy thì cũng hơi buồn, nhưng mà thôi kệ.
Mình thông tin lại cho các bạn theo dõi khác thông tin mình rút ra đc như sau:
.
số mà BQT báo lỗi là số "một triệu tỷ đồng" = 16 con số
các số dưới 16 số vẫn hoạt động bình thường.
lỗi tìm ra là vì excel ko thể xử lý số quá 15 chữ số (như bạn Vetmini đã giải thích, cái này mình ko biết thiệt)
Cách giải quyết là sử dụng thuật toán không liên quan đến định dạng số, format text rồi mới xử lý.
.
Về tiêu đề chia sẻ, mình muốn chia sẻ thuật toán viết nên cái hàm này một cách trực quan để "những người khác" nhìn vào dễ hiểu hơn, dễ làm theo. Và truyền cảm hứng học tập cho các bạn khác.
Và cũng như luyện tập và cập nhật thông tin hữu ích cho bản thân. Mình gọi đó là chia sẻ.
.
Còn khái niệm về chia sẻ của BQT là mọi thứ chia sẻ phải hoạt động ở mọi tình huống, không có giới hạn thì mới đáng để chia sẻ thì sẽ ko có bài đăng nào như thế này cả.
Nhờ vào bài này mình biết đc 1 hàm khác của bạn excel_lv1.5 đã chia sẻ khá là hay, không giới hạn ký tự. Mình sẽ lưu lại và nghiên cứu.
Nhờ vào bài này mình biết đc thông tin mà bạn Vetmini đã chia sẻ.
Nhờ vào bài này mình biết đc 1 anh BQT ko quan tâm tới gì ngoài kết quả cuối cùng.
.
Mình thấy hàm của mình nó chạy tốt khi dưới 16 chữ số.
Trong bài viết này cũng có rất nhiều người chia sẻ hàm chuyển tiền thành chữ rất hay, hoạt động trên cả 2 nền tảng. Không nhờ bài viết này có lẽ mình ko nghĩ nó có tồn tại nữa.
.
Rất cám ơn các bạn đã hỗ trợ mình.
đặc biệt là 2 bạn excel_lv1.5Vetmini đã cung cấp các thông tin hữu ích của mình.
cám ơn các bạn khác hỗ trợ mình sửa lỗi vặt trong cái hàm này.
Rất cám ơn các bạn nhiệt tình!


1681202117049.png
 

File đính kèm

  • 1681200514378.png
    1681200514378.png
    38.4 KB · Đọc: 2
  • 1681202890397.png
    1681202890397.png
    44.9 KB · Đọc: 2
Bất cứ cái gì không thể triệt được chỗ sai thì khong có giá trị sử dụng. Trừ phi có khuyến cáo cho người dùng rằng "hàm không bảo đảm kết quả khi gặp trong trường hợp ..."
Tuy nhiên, nếu tôi bí quá, cần phải tung cho người dùng một sản phẩm dở dang thì tôi sẽ đặt thêm trường hợp sai thì cho kết quả "Cảnh báo! Hàm không đọc được dữ liệu này"
Đã không khuyến cáo lại còn xúi thêm 1 số bất kỳ khác 0 và 1 vào.
Báo cáo 1,000,010,101,001,001 sai thì cứ thêm số 2 hoặc số bất kỳ vào (chắc là chỗ nào cũng được). Rồi xách lên nộp cho kiểm toán nhỉ?
số mà BQT báo lỗi là số "một triệu tỷ đồng" = 16 con số
số mà BQT báo lỗi là số "một triệu tỷ đồng" = 16 con số ...
Còn khái niệm về chia sẻ của BQT là mọi thứ chia sẻ phải hoạt động ở mọi tình huống, không có giới hạn thì mới đáng để chia sẻ thì sẽ ko có bài đăng nào như thế này cả.
Tôi nhận xét sai trên cương vị người dùng, chứ không trên cương vị BQT. Cái sai rành rành trước mắt thì phải nói.
Tôi lại còn quan niệm rằng phải hoàn thiện mới chia sẻ, thấy sai thì phải sửa, còn chưa chắc hoàn thiện thì chỉ làm như anh VetMini nói:
"Cảnh báo! Hàm không đọc được dữ liệu này"
Đáng lẽ phải khiêm nhường hơn, đưa lên và nhờ người khác test giùm.
Thứ 2: Nếu tôi là người dùng mà bị sai, tôi phải cảnh báo cho những người dùng khác, dù có phải là BQT hay không.
 
Lần chỉnh sửa cuối:
1681204992557.png

1681204951948.png

1681204981744.png

1681204967430.png


Thế này gọi là cố tình bóp lệch sự thật á.
Bài đầu mình nêu 'chia sẻ' làm việc được con số có 21 chữ số.
Có người chỉ ra có chỗ sai ở số có hơn 15 chữ số.
Một hồi lâu thì chấp nhận cái sai nhưng lại bóp méo quan điểm chia sẻ.
Trọng tâm ở đây là mình viết cái gì phải thống nhất từ đầu tới cuối.
======================> Sửa bài đầu thành áp dụng với con số có dưới 16 chữ số đi là được.
 
Đã không khuyến cáo lại còn xúi thêm 1 số bất kỳ khác 0 và 1 vào.
Báo cáo 1,000,010,101,001,001 sai thì cứ thêm số 2 hoặc số bất kỳ vào (chắc là chỗ nào cũng được). Rồi xách lên nộp cho kiểm toán nhỉ?
hàm chưa xog, chưa thể đặt khuyến cáo trong hàm trừ khi không thể nào sửa lỗi được nữa.
Việc em thêm số khác 1 và 0 vào để chứng mình vì lỗi số ban đầu là số nhị phân nên nó lỗi. Em đã nhận là hàm sai và fix trong hàm ngay sau đó.
Còn cái số quá 16 ký tự nó mất hàng đơn vị thì ko sửa đc, sẽ thêm cảnh báo vô hàm thôi.
Nhưng mà có vẻ anh thích bắt bẻ em hơn là giúp em sửa hàm.
Bài đã được tự động gộp:

View attachment 288791

View attachment 288788

View attachment 288790

View attachment 288789


Thế này gọi là cố tình bóp lệch sự thật á.
Bài đầu mình nêu 'chia sẻ' làm việc được con số có 21 chữ số.
Có người chỉ ra có chỗ sai ở số có hơn 15 chữ số.
Một hồi lâu thì chấp nhận cái sai nhưng lại bóp méo quan điểm chia sẻ.
Trọng tâm ở đây là mình viết cái gì phải thống nhất từ đầu tới cuối.
======================> Sửa bài đầu thành áp dụng với con số có dưới 16 chữ số đi là được.
ban đầu mình nghĩ nếu làm theo cách này nó sẽ ko lỗi, nên viết bài như vậy, nhưng sau này biết ko sửa đc thì mình đâu sửa bài lại đc nữa đâu.
Hồi mới đăng đâu có ai nói cho mình giới hạn của thuật toán này để mình sửa bài lại đâu.
À có bạn Vetmini có nhắc đến chuyện này mà mình đọc ko hiểu lúc đó.
 
Lần chỉnh sửa cuối:
Nhưng mà có vẻ anh thích bắt bẻ em hơn là giúp em sửa hàm.
Tôi nhắc lại là tôi đứng trên cương vị người dùng. Nếu sai không sửa thì tôi phải cảnh báo cho những người dùng khác, không cần phải là BQT.
Vả lại tôi sửa làm gì nếu có những hàm khác dùng được, chưa thấy sai?
 
nghe BQT mà nói vậy thì cũng hơi buồn, nhưng mà thôi kệ.
...
Bạn không nên dùng từ BQT như vậy.
Ở đây ai cũng hiểu là bạn kia góp ý "theo quan điểm của bất cứ thành viên nào khác".
Và bạn ấy không hề có ý "đại diện BQT".

Nên biết rõ rằng thành viên BQT chỉ đại diện BQT khi cần khuyến cáo về kỷ luật (vi phạm luật diễn đàn).
 
Tự ái vậy là dở rồi. Nên nhớ ngoài phạm vi thì phải báo lỗi chứ không phải trả về kết quả sai.
Và một khi đã công bố thì phải chuẩn nhất có thể chứ không nên sửa đi sửa lại năm lần bảy lượt như thế.
 
Tôi nhắc lại là tôi đứng trên cương vị người dùng. Nếu sai không sửa thì tôi phải cảnh báo cho những người dùng khác, không cần phải là BQT.
Vả lại tôi sửa làm gì nếu có những hàm khác dùng được, chưa thấy sai?
à, làm em tường thành viên BQT thiệt. Nếu ko từng trải hàm thì làm sao biết hàm nó sai đc.
Bạn không nên dùng từ BQT như vậy.
Ở đây ai cũng hiểu là bạn kia góp ý "theo quan điểm của bất cứ thành viên nào khác".
Và bạn ấy không hề có ý "đại diện BQT".

Nên biết rõ rằng thành viên BQT chỉ đại diện BQT khi cần khuyến cáo về kỷ luật (vi phạm luật diễn đàn).
cái này mới biết.
Tự ái vậy là dở rồi. Nên nhớ ngoài phạm vi thì phải báo lỗi chứ không phải trả về kết quả sai.
Và một khi đã công bố thì phải chuẩn nhất có thể chứ không nên sửa đi sửa lại năm lần bảy lượt như thế.
ok bạn, đã rút kinh nghiệm
 
Đang rảnh nên góp vui chút hàm 365 đọc số thành chữ không giới hạn độ dài (kết quả tạm ổn), text hay number đều được
Mình cũng góp vui chút dùng hàm Let để đọc số, mong sự góp ý từ bạn.

Mã:
=LET(doc_so,
    TRIM(TEXTJOIN(", ",,
        LET(l,SEQUENCE(ROUNDUP(LEN(A2)/3,0),,1,3),m,MOD(2*LEN(A2),3),
            tr,--MID(A2,l-m,1),ch,--MID(A2,l-m+1,1),dv,--MID(A2,l-m+2,1),
            chuso,{"không ","một ","hai ","ba ","bốn ","năm ","sáu ","bảy ","tám ","chín "},
            doc_tr,IFERROR(IF(tr+ch+dv>0,INDEX(chuso,tr+1)&"trăm ",""),""),
            doc_ch,IFERROR(IF(ch+dv>0,IF(ch=0,"lẻ ",IF(ch=1,"mười ",INDEX(chuso,ch+1)&"mươi ")),""),""),
            doc_dv,IF(dv>0,IF(dv=1,IF(IFERROR(ch,0)>1,"mốt ","một "),IF(IFERROR(dv,0)=5,IF(IFERROR(ch,0)=0,"năm ","lăm "),INDEX(chuso,dv+1))),""),
            doc_hang,IF(IFERROR(tr,0)+IFERROR(ch,0)+dv>0,INDEX({"","ngàn","triệu"},MOD((MAX(l)-l)/3,3)+1),""),
            doc_ty,IF(MOD(MAX(l)-l,9)=0,REPT(" tỷ",(MAX(l)-l)/9),""),
        doc_tr&doc_ch&doc_dv&doc_hang&doc_ty))),
    SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(doc_so,LEFT(doc_so),UPPER(LEFT(doc_so)),1),"tỷ, tỷ","tỷ"),", tỷ"," tỷ"))&" đồng."
1681290435758.png
 

File đính kèm

Ai mà rãnh rỗi dư thời gian đi chép hàm dài như vậy vào từng ô. Máy tính chắc mạnh và nhiều RAM lắm?
Excel 365 và Google Spreadsheets? Phải chăng Named Function và Lambda không đủ khả năng?
Đặt Name với tên hàm Spell với biểu thức trong hàm Lambda: =Lambda(so,Let(s,so,xx, ....)
Chỉ cần gõ =Spell(A1) là xong rồi.
 
Lần chỉnh sửa cuối:

Bài viết mới nhất

Back
Top Bottom