PDA

View Full Version : Hàm chuyển chữ thường thành chữ hoa



chibi
10-06-07, 12:20 AM
Kính gửi các bạn.
Với font TCVN3 tôi đã làm được chuyển từ chữ thường sang chữ hoa. Nay tôi gặp khó khăn đối với font UNICODE (Dùng cho tiếng Việt).
Mong được sự giúp đỡ của các bạn.
Xin cảm ơn

phamduylong
10-06-07, 11:01 AM
Trong 3 hàm chuyển câu của Excel, khi sử dụng font UNICODE tiếng Việt chỉ có hàm LOWER (chữ thường) là đúng, còn hàm PROPER (chữ hoa đầu từ) và UPPER (chữ hoa) có một số nguyên âm sai.( ví dụ UPPER("Nguyễn Trãi") cho kết quả "NGUYễN TRảI", PROPER("ấn bản" cho kết quả "ấn Bản").

Để có thể chuyển sang chữ hoa đầu từ và chữ hoa, có thể sử dụng 2 hàm:
Hàm chuyển sang chữ hoa:


Function UpperUni(uni) As String
UpperUni = UCase(uni)
End Function
Hàm chuyển sang chữ hoa đầu từ:


Function ProperUni(uni As String) As String
Dim vt As Long
If Trim(uni) = "" Then
ProperUni = uni
Else
uni = LCase(uni)
Mid(uni, 1, 1) = UCase(Mid(uni, 1, 1))
Do
vt = InStr(vt + 1, uni, " ")
If vt = 0 Then Exit Do
Mid(uni, vt + 1, 1) = UCase(Mid(uni, vt + 1, 1))
Loop
ProperUni = uni
End If
End Function
Trong tập tin UpperUni, các ô màu đỏ là các ô mà hàm UPPER và PROPER của Excel chuyển sai.

TranThanhPhong
10-06-07, 11:48 AM
Chào các bạn,

Đây là một số lưu ý về việc sử dụng Unicode lấy từ trang web của Microsoft.

Trong môi trường Windows thì Microsoft khuyến cáo là sử dụng "Unicode tổ hợp" do vậy các hàm chuyển chữ Upper, Lower,... sẽ không bị lỗi nữa.

TP.

phamduylong
16-06-07, 09:46 AM
Trong môi trường Windows thì Microsoft khuyến cáo là sử dụng "Unicode tổ hợp" do vậy các hàm chuyển chữ Upper, Lower,... sẽ không bị lỗi nữa.
TP.

Chào các bạn,
Đúng là một vấn đề hậu chuyển các bảng mã cũ như VNI, ABC, ... sang Unicode !
Chuyển sang Unicode, từ năm 2002 đến nay chúng ta vẫn chưa thống nhất là Unicode tổ hợp hay dựng sẳn. Do trình độ, bản thân tôi cũng không biết TCVN 6909:2001 theo QĐ số 72/2002/QĐ-TTg ngày 10/6/2002 của Thủ tướng Chính phủ là tổ hợp hay dựng sẳn. Nhưng có một điều dễ thấy: các trang Web khi chuyển qua Unicode đều dùng dựng sẳn, các bài viết ủng hộ Unicode tổ hợp (UNITH) cũng dùng Unicode dựng sẳn (UNIDS), các chương trình xử lý bàn phím tiếng Việt thông dụng xem Unicode dựng sẳn là chính (Unikey 4.0 xếp Unicode tổ hợp vào bảng mã khác), các văn bản hành chánh trong các cơ quan là dựng sẳn, và các bảng tính Excel của chúng ta nếu dùng Unicode thì chắc chắn là dựng sẳn.
Riêng với các hàm Excel về chuỗi như PROPER, UPPER xử lý đúng Unicode tổ hợp, nhưng khi sử dụng hàm LEN, LEFT, RIGHT, MID, .. thì vẫn bị vướng do số ký tự nhìn thấy trên màn hình khác với số ký tự thực. Ví dụ:
Unicode dựng sẳn:
LEN("CỘNG HÒA") kết quả 8
LEFT("CỘNG HÒA";4) kết quả "CỘNG"
Right("CỘNG HÒA";3) kết quả "HÒA"
Unicode tổ hợp:
LEN("CỘNG HÒA") kết quả 10 vì "Ô" và "Ò" chiếm 2 ký tự. Do đó:
LEFT("CỘNG HÒA";4) kết quả "CỘN"
Right("CỘNG HÒA";3) kết quả "ÒA"
Do đó, các hàm Excel về chuỗi vẫn không hổ trợ tốt hoàn toàn cho tiếng Việt. Điều này cũng dễ hiểu vì các hàm đó dùng chung cho nhiều ngôn ngữ, đúng với ngôn ngữ này lại sai với ngôn ngữ kia !
Mặc khác, cái mà dân Excel cần hỗ trợ là xếp ABC thì cả UNITH hoặc UNIDS đều cho kết quả giống nhau nhưng không phù hợp với ABC VN. Với UNIDS, viết chương trình sắp xếp ABC tiếng Việt tôi cảm thấy dễ hơn UNITH vì phải xử lý vừa ký tự 1 byte và 2 byte.
Do trình độ, đi sâu vào bảng mã không phải là chuyện dân Excel như bọn mình. Nhưng thực tế cho thấy trong VBA vẫn có hàm như Lcase, Ucase, ChrW, AscW hổ trợ cho Unicode dựng sẳn lẫn tổ hợp, các hàm tôi viết trong TVEXCEL01 phần lớn áp dụng cho UNIDS.
Riêng bản thân, tôi thích UNIDS hơn vì dân Excel dùng UNIDS, xử lý dữ liệu bằng UNIDS dễ hơn là UNIHT. Những cái còn vướng, diễn đàn chúng ta cố gắng khắc phục chứ không thể chờ mãi vào Microsoft được !

Mr Okebab
16-06-07, 11:24 AM
Hơi bị hay và đơn giản. Đang cần cái này, mừng quá.

Cảm ơn nhiều!!

levanduyet
16-06-07, 12:54 PM
To: Phamduylong,
Nhân đây tôi muốn hỏi, hình như Anh đã có post bài về hàm chuyển đổi trong Excel thì phải? Anh có thể tổng hợp và viết một bài, cùng với ví dụ, vì tôi thấy vấn đề này mọi người thường hay thắc mắc và gặp rắc rối.
Ví dụ như:
Hàm chuyển đổi VNI -> ABC, UNICODE,....
ABC->.........................

Lê Văn Duyệt

phamduylong
18-06-07, 03:25 PM
To: Phamduylong,
Nhân đây tôi muốn hỏi, hình như Anh đã có post bài về hàm chuyển đổi trong Excel thì phải?
Tôi sẽ tập hợp các hàm liên quan đến tiếng Việt gởi các bạn.

minhnc
18-06-07, 04:58 PM
Cái này tôi đang sử dụng tiện ích tiếng việc cũng hay.

kaishen123
03-08-11, 04:22 PM
Có 1 cách mà tôi thấy rất đơn giản, chỉ cần sử dụng Unikey thôi. Cách làm như sau: Bạn copy phần chữ muốn chuyển đổi sang chữ hoa đầu rồi click chuột phải vào biểu tượng của Unikey ở góc phải màn hình, chọn công cụ. Ở phần lựa chọn click vào phần lựa chọn dòng: Sang chữ thường,nguồn Unicode,đích Unicode, sau đó nhấn Ctrl+v dán vào 1 trang khác rồi dùng hàm proper để chuyển đổi lại thành chữ hoa đầu. Áp dụng cho phần chuyển từ chữ in hoa sang chữ Hoa đầu. Nếu chỉ cần chuyển từ chũ thường sang chữ in hoa thì chỉ cân chọn Sang chữ hoa là được

nvduc
10-09-11, 11:38 AM
Vấn đề này quá cũ rồi, bây giờ cứ Unicode dùng là ổn hết

ndu96081631
10-09-11, 12:15 PM
Vấn đề này quá cũ rồi, bây giờ cứ Unicode dùng là ổn hết
Dùng Unicode ổn thế nào vậy bạn?
Theo bạn thì trong Excel, khi dùng unicode, ta chuyển chữ hoa sang thường (hoặc ngược lại) bằng hàm nào?

PhanTuHuong
03-01-12, 11:26 AM
Dùng Unicode ổn thế nào vậy bạn?
Theo bạn thì trong Excel, khi dùng unicode, ta chuyển chữ hoa sang thường (hoặc ngược lại) bằng hàm nào?

Chúng ta nghiên cứu thủ tục Lower2Upper trong tập tin kèm theo là được, hiện nay chỉ có biện pháp thay thế thủ công thôi!

Đây là bài viết của tác giả Phạm Khánh Huy

PhanTuHuong
03-01-12, 06:44 PM
Chẳng hiểu sao tôi dùng đơn thuần hàm Ucase của VBA là chữ thường thành chữ in được hết (toàn bộ tiếng Việt như ư, ớ, ợ,...), không cần chế biến lằng nhằng hàm ChrW ở trên? Hay do Window nhỉ (đã test trên cả Excel 2003 và 2007)??

ndu96081631
03-01-12, 08:22 PM
Chẳng hiểu sao tôi dùng đơn thuần hàm Ucase của VBA là chữ thường thành chữ in được hết (toàn bộ tiếng Việt như ư, ớ, ợ,...), không cần chế biến lằng nhằng hàm ChrW ở trên? Hay do Window nhỉ (đã test trên cả Excel 2003 và 2007)??
Điều này đương nhiên mà thầy, kể cả LCase cũng dùng được luôn mà đâu cần phái biến đổi gì đâu chứ

PhanTuHuong
03-01-12, 08:48 PM
Hic hic, do không đọc kỹ hàm của thầy Phạm Duy Long, tôi cứ tưởng bài toán này chưa giải quyết xong! Ngồi lọ mọ viết lại hàm trên cơ sở của tác giả Phạm Huy Khánh (up lên cho mọi người tham khảo).


Function LowerToUpper(RangeConvert As Range) As String
Dim i As Integer, j As Integer, StrLen As Integer, StrRange As String
LowerCase = Array(ChrW(7843), ChrW(7841), ChrW(7867), ChrW(7869), ChrW(7865), _
ChrW(7881), ChrW(7883), ChrW(7887), ChrW(7885), ChrW(7911), ChrW(7909), _
ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925), ChrW(7847), ChrW(7849), _
ChrW(7851), ChrW(7845), ChrW(7853), ChrW(7857), ChrW(7859), ChrW(7861), _
ChrW(7855), ChrW(7863), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7871), _
ChrW(7879), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7889), ChrW(7897), _
ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7899), ChrW(7907), ChrW(7915), _
ChrW(7917), ChrW(7919), ChrW(7913), ChrW(7921))
UpperCase = Array(ChrW(7842), ChrW(7840), ChrW(7866), ChrW(7868), ChrW(7864), _
ChrW(7880), ChrW(7882), ChrW(7886), ChrW(7884), ChrW(7910), ChrW(7908), _
ChrW(7922), ChrW(7926), ChrW(7928), ChrW(7924), ChrW(7846), ChrW(7848), _
ChrW(7850), ChrW(7844), ChrW(7852), ChrW(7856), ChrW(7858), ChrW(7860), _
ChrW(7854), ChrW(7862), ChrW(7872), ChrW(7874), ChrW(7876), ChrW(7870), _
ChrW(7878), ChrW(7890), ChrW(7892), ChrW(7894), ChrW(7888), ChrW(7896), _
ChrW(7900), ChrW(7902), ChrW(7904), ChrW(7898), ChrW(7906), ChrW(7914), _
ChrW(7916), ChrW(7918), ChrW(7912), ChrW(7920))
LowerToUpper = UCase(RangeConvert.Text)
StrLen = Len(LowerToUpper)
StrRange = LowerToUpper
For i = 1 To StrLen
For j = 0 To 44
If Mid(StrRange, i, 1) = LowerCase(j) Then
LowerToUpper = Left(LowerToUpper, i - 1) & UpperCase(j) & Right(LowerToUpper, StrLen - i)
Exit For
End If
Next j
Next i
End Function

thuythuy1983
04-01-12, 12:55 PM
Trong 3 hàm chuyển câu của Excel, khi sử dụng font UNICODE tiếng Việt chỉ có hàm LOWER (chữ thường) là đúng, còn hàm PROPER (chữ hoa đầu từ) và UPPER (chữ hoa) có một số nguyên âm sai.( ví dụ UPPER("Nguyễn Trãi") cho kết quả "NGUYễN TRảI", PROPER("ấn bản" cho kết quả "ấn Bản").

Để có thể chuyển sang chữ hoa đầu từ và chữ hoa, có thể sử dụng 2 hàm:
Hàm chuyển sang chữ hoa:


Function UpperUni(uni) As String
UpperUni = UCase(uni)
End Function
Hàm chuyển sang chữ hoa đầu từ:


Function ProperUni(uni As String) As String
Dim vt As Long
If Trim(uni) = "" Then
ProperUni = uni
Else
uni = LCase(uni)
Mid(uni, 1, 1) = UCase(Mid(uni, 1, 1))
Do
vt = InStr(vt + 1, uni, " ")
If vt = 0 Then Exit Do
Mid(uni, vt + 1, 1) = UCase(Mid(uni, vt + 1, 1))
Loop
ProperUni = uni
End If
End Function
Trong tập tin UpperUni, các ô màu đỏ là các ô mà hàm UPPER và PROPER của Excel chuyển sai.

Minh cung dang rất cần cái công thức này, nhưng minh không biết phải copy doan code này pase vao đâu nữa. Rất mong được ban giúp đỡ. Minh xin cảm ơn!

thuythuy1983
04-01-12, 01:04 PM
Trong 3 hàm chuyển câu của Excel, khi sử dụng font UNICODE tiếng Việt chỉ có hàm LOWER (chữ thường) là đúng, còn hàm PROPER (chữ hoa đầu từ) và UPPER (chữ hoa) có một số nguyên âm sai.( ví dụ UPPER("Nguyễn Trãi") cho kết quả "NGUYễN TRảI", PROPER("ấn bản" cho kết quả "ấn Bản").

Để có thể chuyển sang chữ hoa đầu từ và chữ hoa, có thể sử dụng 2 hàm:
Hàm chuyển sang chữ hoa:


Function UpperUni(uni) As String
UpperUni = UCase(uni)
End Function
Hàm chuyển sang chữ hoa đầu từ:


Function ProperUni(uni As String) As String
Dim vt As Long
If Trim(uni) = "" Then
ProperUni = uni
Else
uni = LCase(uni)
Mid(uni, 1, 1) = UCase(Mid(uni, 1, 1))
Do
vt = InStr(vt + 1, uni, " ")
If vt = 0 Then Exit Do
Mid(uni, vt + 1, 1) = UCase(Mid(uni, vt + 1, 1))
Loop
ProperUni = uni
End If
End Function
Trong tập tin UpperUni, các ô màu đỏ là các ô mà hàm UPPER và PROPER của Excel chuyển sai.

Mình cũng đang loay hoay mãi với cái lỗi của hàm UPPER trên nhưng minh lại không biết lài phải Copy đoan code trên của bạn và pase vào đâu để có thể sử dụng hàm UPPERUNI(rext)?.Rất mong được các bạn giúp đỡ. Mình xin cảm ơn nhiều

nhhue2011
12-01-13, 10:27 AM
Mình cũng đang bị lỗi với Upper kiểu: có một số chữ ko chuyển sang in hoa đc. Bác nào chỉ giùm em với. Tks nhiều.

ndu96081631
12-01-13, 10:33 AM
Mình cũng đang bị lỗi với Upper kiểu: có một số chữ ko chuyển sang in hoa đc. Bác nào chỉ giùm em với. Tks nhiều.

Bạn có 2 lựa chọn:
- Hoặc là dùng code VBA (phải tự tìm hiểu về lĩnh vực lập trình)
- Hoặc là dùng Excel 2010 với font Unicode, hàm Upper, Lower sẽ hoạt động chính xác