Hỗ trợ hàm UDF đếm ký tự

Liên hệ QC

Tình nghĩa giang hồ

Thanh sơn bất cải, lục thủy trường lưu
Tham gia
29/9/20
Bài viết
330
Được thích
429
Chào anh em GPE.
Ngay từ thuở ban đầu hàm LEN trong Excel được sinh ra để đếm ký tự tiếng Mỹ.
Nhưng đối với tiếng Việt của chúng ta thì hơi khác một tí.
VD: Cố Nhân
Nếu đếm bằng Tiếng Mỹ thì chữ Cố Nhân có 7 ký tự, còn đếm bằng tiếng Việt thì tới 10 ký tự.
Mình mong muốn có hàm LEN_TIENG_VIET để đếm ký tự tiếng Việt.
Nhờ mọi người hỗ trợ giúp, cảm ơn mọi người.
 

File đính kèm

  • Đếm ký tự.jpg
    Đếm ký tự.jpg
    50.6 KB · Đọc: 26
Nếu đếm bằng Tiếng Mỹ thì chữ Cố Nhân có 7 ký tự, còn đếm bằng tiếng Việt thì tới 10 ký tự.
"Cố Nhân" tiếng Việt vẫn là 7 ký tự, nhưng được "gõ" 10 lần.

Bài này muốn đếm số lần "gõ" , tạo 2 mảng:

1. Tạo mảng ký tự (Unicode dựng sẵn hoặc Unicode tổ hợp).

2. Tạo mảng số lần gõ (tương ứng mảng trên với số lần gõ là 1,2 hoặc 3.

Dùng vòng lặp => cắt từng ký tự : so sánh với mảng trên và lấy kết quả mảng dưới.

.
 
Upvote 0
Căng nhỉ.

Trước khi làm bài chắc phải lấy sách tiếng Việt cấp tiểu học đọc lại các định nghĩa:

Chữ cái, ký tự, từ, từ đơn, từ ghép.
 
Upvote 0
Gửi bác đoạn code sau, phiên bản: Lượm lặt sưu tầm
Cách sử dụng = =LenUTF8(A2)


Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As Long, ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As Long) As Long
#Else
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
#End If
Private Const CP_UTF8 = 65001
Function LenUTF8(UnicodeStr As String) As Long
Dim b() As Byte
b = UnicodeStrToUTF8Bytes(UnicodeStr)
LenUTF8 = UBound(b) - LBound(b) + 1
End Function
Public Function UnicodeStrToUTF8Bytes(UnicodeStr As String) As Byte()
Dim nBytes As Long
Dim Buffer() As Byte
UnicodeStrToUTF8Bytes = vbNullString
If Len(UnicodeStr) < 1 Then Exit Function
nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(UnicodeStr), -1, 0&, 0&, 0&, 0&)
ReDim Buffer(nBytes - 2)
nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(UnicodeStr), -1, ByVal VarPtr(Buffer(0)), nBytes - 1, 0&, 0&)
UnicodeStrToUTF8Bytes = Buffer
End Function
 
Upvote 0
Mình mới test thử, ngon lành cành đào rồi.
Cảm ơn người anh em Xuyên Đảo Băng Hồ nhé.
 
Upvote 0
Mà nào giờ mình nghe chữ tiếng Mỹ, cũng ngồ ngộ.
Tiếng Mỹ với tiếng Anh có khác không vậy bạn ?
 
Upvote 0
Gửi bác đoạn code sau, phiên bản: Lượm lặt sưu tầm
Cách sử dụng = =LenUTF8(A2)


Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As Long, ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As Long) As Long
#Else
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
#End If
Private Const CP_UTF8 = 65001
Function LenUTF8(UnicodeStr As String) As Long
Dim b() As Byte
b = UnicodeStrToUTF8Bytes(UnicodeStr)
LenUTF8 = UBound(b) - LBound(b) + 1
End Function
Public Function UnicodeStrToUTF8Bytes(UnicodeStr As String) As Byte()
Dim nBytes As Long
Dim Buffer() As Byte
UnicodeStrToUTF8Bytes = vbNullString
If Len(UnicodeStr) < 1 Then Exit Function
nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(UnicodeStr), -1, 0&, 0&, 0&, 0&)
ReDim Buffer(nBytes - 2)
nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(UnicodeStr), -1, ByVal VarPtr(Buffer(0)), nBytes - 1, 0&, 0&)
UnicodeStrToUTF8Bytes = Buffer
End Function

Bài viết gốc tôi viết ngày 24-11-2021 tại đây: https://bluesofts.net/Lap-trinh-VBA/nang-cao-level2/Lap-trinh-VBA-tao-ham-đem-so-ky-tu-UTF8
 
Upvote 0
Mà nào giờ mình nghe chữ tiếng Mỹ, cũng ngồ ngộ.
Tiếng Mỹ với tiếng Anh có khác không vậy bạn ?ASCII
Trời, tiếng Mỹ tiếng Anh mà cũng không biết phân biệt sao?

Điển hình vài từ viết khác nhau: từ centre là tiếng Anh, viết theo tiếng Mỹ là center.
kerb là tiếng Anh, curb là tiếng Bắc Mỹ (Mỹ và Canada)
Và những từ có nghĩa khác nhau:
pavement tiếng Anh là lề đường, tiếng Mỹ là mặt đường.
Và những từ đọc khác nhau:
lieutenant, đọc theo Anh là lép-te-năng, theo Mỹ là lu-té-nâng

Còm-pu-tơ do Mỹ làm chủ cho nên ngôn từ về ngành này cũng theo tiêu chuẩn Mỹ.

Chú thích: người Việt Nam, kể cả những nơi công quyền, miệng thì oang oang từ điển Oxford. Nhưng thực tế ra chúng ta dùng tiếng Anh theo tiêu chuẩn Mỹ.
 
Upvote 0
Trời, tiếng Mỹ tiếng Anh mà cũng không biết phân biệt sao?

Thế hệ của chú học tiếng Anh nên rành thôi, còn thế hệ chúng tôi toàn học tiếng Nga, tiếng Pháp nhé.
Hồi đó tiếng Nga là số 1 không phải tiếng Anh, tiếng Mỹ.
“Kìa ai đang say sưa theo tiếng Anh, hay tiếng Pháp/ Còn tôi yêu say tiếng Nga như cuộc đời tha thiết/ Giục ta đi xây tương lai sáng ngời ước mơ/ Yêu sao câu thơ ngân nga thắm tình Puskin... Đừng nói, đừng nói từ biệt, bạn quý của ta/ Đừng nói câu từ biệt/ Mãi mãi tiếng Nga cùng ta...”.
 
Upvote 0
Ghen tức ghê đi. Tại sao bài này không bị chủ diễn đàn phê là "dùng ngôn từ không sạch sẽ" :mad: (và phạt ban cua ban còng 1 tháng)

Chú thích: theo dạng bông đá thì từ ấy ra 3 đúng rồi.
Cái này kiểu như tang vật, đẹp xấu gì cũng mang ra làm bằng chứng được. Không bắt được :D
 
Upvote 0
Web KT

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

Back
Top Bottom