Loại khoảng trắng & bỏ dấu tiếng việt

Liên hệ QC

Thien

Thành viên thường trực
Tham gia
23/6/06
Bài viết
352
Được thích
112
Nhờ các bác viết code ứng dụng trong việc Loại khoảng trắng & bỏ dấu tiếng việt. Hiện tại ứng dụng hàm LoaiDauUni & AllTrim thấy phải mở thêm cột khó khăn quá.

ví dụ: khi chọn chữ Tàu Hủ và chạy macro sẽ thành TauHu.

Ứng dụng hàm trên chỉnh sửa tá lả để thành marco chẳng được như ý. Tiện cho mình hướng dẫn sự khác nhau giữa hàm & macro & cách chuyển đổi chúng.

TC.
 
vâng đây ạ , bác đổi đôi xls thành xla

Code thì không sai, nhưng chuỗi nguồn (tức chuỗi tại ô A1) có vấn đề! Tôi không biết người nhập vô ô đó bằng loại font gì, nhưng khi tôi gõ lại cụm chuỗi của bạn "thuốc bổ thảo dược cảm bo 3 , keo ho" thành cụm chuỗi "thuốc bổ thảo dược cảm kẹo ho" bằng font Unicode thì không có vấn đề gì. Bạn kiểm tra lại xem.
 
Upvote 0
vâng đây ạ , bác đổi đôi xls thành xla

Để sửa 1 ô trong bảng tính thì dễ rồi. Nhưng nếu trong bảng tính bạn có nhiều chỗ như thế thì làm thế nào?
Tôi sẽ chỉ ra nguyên nhân cho bạn để bạn có hướng giải quyết.
Nguyên nhân: trong ô A1 bạn có unicode tổ hợp mà hàm LoaiDauUni không hỗ trợ unicode tổ hợp (bạn cứ thử viết lại A1 nhưng dùng unicode tổ hợp thì bạn sẽ thấy).
------------
Tôi đã kiểm tra thế nào?
1. Tôi xóa hết chỉ để trong A1 chữ "ố". Kiểm tra Len(...) tôi thấy nó có độ dài = 2 (ghi trên đĩa sẽ mất 4 bai). Mà chữ "ố" dựng sẵn chỉ có độ dài = 1 (ghi trên đĩa sẽ mất 2 bai). Bạn có thể làm một test nhỏ:

Mã:
Sub Button1_Click()
Range("A10").Value = ChrW(&H1ED1)
Range("A11").Value = ChrW(&HF4) & ChrW(&H301)
End Sub
[/QUOTE]

Bạn sẽ thấy trong A10 và A11 đều có chữ "ố". Nhưng "ố" trong A10 là unicode dựng sẵn, ghi trên đĩa sẽ mất 2 bai là D1 và E1 (theo thứ tự), còn "ố" trong A11 là unicode tổ hợp, ghi trên đĩa sẽ mất 4 bai - 2 bai là chữ "ô" (bai F4 và 00 theo thứ tự) còn 2 bai là dấu "sắc" (bai 01 và 03 - theo thứ tự)

Bạn có thể tưởng tượng unicode tổ hợp và dựng sẵn như sau: bạn tới cửa hàng A và nói: cho tôi đặt chữ "ố". Họ làm cho bạn 1 linh kiện là chữ "ố". Nó là 1 "cục" duy nhất. Bạn sang cửa hàng B và cũng đặt chữ "ố". Họ cung cấp cho bạn 2 linh kiện, 2 "cục" - là linh kiện chữ "ô" và linh kiện dấu sắc. Bạn "lồng" (tổ hợp) 2 linh kiện thì cũng có chữ "ố".

Tại sao B lại sản xuất 2 linh kiện? Tôi đoán mò nhé, tự bịa ra để hiểu vấn đề thôi. B nghĩ: làm 2 linh kiện ta có thể bán cho 3 loại khách - đặt chữ "ô", đặt dấu phẩy, và đặt chữ "ố". Còn A phải sản xuất tới 3 linh kiện để bán cho 3 loại khách.

Bạn cứ hiểu nôm na thế này là được: ký tự unicode "x" dựng sẵn là 1 ký tự unicode nào đó còn ký tự unicode "x" tổ hợp là sự kết hợp của 2 hoặc nhiều hơn các ký tự unicode "đơn" nào đó. Các ký tự tiếng Việt tổ hợp có thể là sự kết hợp của 2 hoặc 3 ký tự "đơn" khác (dùng 4 hoặc 6 bai), còn dựng sẵn luôn là 1 ký tự duy nhất (dùng 2 bai)

2. Khi đã nghi ngờ là bạn có trong A1 unicode tổ hợp thì tôi làm tiếp test để chắc chắn 100%.
Tôi dùng hàm SourceToDest (tôi đã đính kèm vào tập tin cho bạn). Công thức cho C1 là:
=SourceToDest(A1;1;1)
Hàm convert chữ trong A1 từ unicode sang unicode. Unicode nguồn là loại gì cũng được nhưng unicode đích luôn là unicode dựng sẵn.
Như vậy trong C1 tôi chắc chắn có unicode dựng sẵn.

3. Bây giờ nếu bạn sửa công thức trong B1 từ =LoaiDauUni(A1) sang =LoaiDauUni(C1)
thì trong B1 bạn sẽ có chữ không dấu.
--------------
Kết luận một lần nữa: LoaiDauUni chỉ hỗ trợ unicode dựng sẵn. Nói rộng ra thì toàn bộ code trong add-in chỉ hỗ trợ unicode dựng sẵn. Nếu bạn có dữ liệu unicode tổ hợp (của nhân viên đã nghỉ việc?, nhận được của đối tác?) thì bạn không dùng được add-in
-----------
Trong tập tin đính kèm tôi đã thêm module vietnamese_unicode_convert mà trong đó có hàm SourceToDest.
Trong bảng tính cũng có tất cả các code mà tôi nói tới ở trên để bạn thử nghiệm.
Bạn cũng có thể lập công thức cho B2 là
=SourceToDest(A1;1;5)
để bỏ dấu luôn từ A1 chứ không cần dùng C1 trung gian.
 

File đính kèm

  • loai dau.rar
    25.8 KB · Đọc: 238
Upvote 0
Chào bạn Thiện

Bạn add-ins file đính kèm | sau đó mở file cần loại bỏ dấu | chọn vùng cần loại bỏ dấu | nhấp phải chuột | chọn Loai bo dau. OK

Không phục hồi có dấu lại được, mình khuyên bạn nên dùng hàm!

Loaibodau.jpg


Thanh Phong

Hi bạn Phong,

Mình làm theo cách của bạn nhưng có ô thì đúng ý mình (vừa bỏ dấu, vừa mất khoảng trắng) nhưng vẫn còn 1 số ô chỉ mất khoảng trắng và mất 1 vài dấu thôi. ví dụ:
Võ Quốc Khánh => VõQuócKhánh

Mong bạn giúp đỡ thêm!

TFYI - Dũng.
 
Upvote 0
À, mình hiểu rồi! Thì ra là do file của mình định dạng là font MS Sans Serif nên nó mới bị như vậy!

Tks all,
 
Upvote 0
À, mình hiểu rồi! Thì ra là do file của mình định dạng là font MS Sans Serif nên nó mới bị như vậy!

Tks all,

Tôi e rằng hổng phải nguyên nhân này, vì thực chất font chẳng ảnh hưởng gì đến chương trình loại dấu tiếng Việt cả
Tôi nghi ngờ khi gõ tiếng Việt, bạn đãdùng bảng mã Unicode tổ hợp (thay vì phải dùng Unicode dựng sẵn) ---> Kiểm tra lại xem, còn không thì cho file của bạn lên đây để mọi người kiểm tra giúp bạn
 
Upvote 0
Nếu mình chỉ muốn loại bỏ dấu ko thôi, vẫn giữ nguyên khoảng cách thì mình cần làm gì?
 
Upvote 0
Cảm ơn bạn nhiều lắm nha, rất có ích, đúng là tiện ích
Bên Unikey có nhưng nếu quên làm thì sai mẫu, còn có tiện ích của bạn rồi chỉ việc copy => paste rồi in thôi
 
Upvote 0
Cảm ơn bạn nhiều lắm nha, rất có ích, đúng là tiện ích (HoTroTiengViet VBA.zip đã bao gồm các phát sinh thường gặp mà đặc biệt là uni & vni luôn => hay)
Bên Unikey có nhưng nếu quên làm thì sai mẫu, còn có tiện ích của bạn rồi chỉ việc copy => paste rồi in thôi
Nãy cảm ơn nhầm bạn +-+-+-+, chính thức cảm ơn bạn: pham_duy_long@yahoo.com
 
Upvote 0
Cảm ơn bạn nhiều lắm nha, rất có ích, đúng là tiện ích (HoTroTiengViet VBA.zip đã bao gồm các phát sinh thường gặp mà đặc biệt là uni & vni luôn => hay)Bên Unikey có nhưng nếu quên làm thì sai mẫu, còn có tiện ích của bạn rồi chỉ việc copy => paste rồi in thôiNãy cảm ơn nhầm bạn +-+-+-+, chính thức cảm ơn bạn: pham_duy_long@yahoo.com
các bác cho em hỏi pass của att này là gì :), Thanks
 
Upvote 0
mình thấy code này có vẻ ổn hơn nhưng chưa xử lý được các chữ: ò,à,ĩ,ủ,ú,ẻ,á,ù,ẹ,ẽ :(, cao nhân nào hoàn thiện giùm
Function ConvertToUnSign(ByVal sContent As String) As String
Dim i As Long
Dim intCode As Long
Dim sChar As String
Dim sConvert As String
ConvertToUnSign = AscW(sContent)
For i = 1 To Len(sContent)
sChar = Mid(sContent, i, 1)
If sChar "" Then
intCode = AscW(sChar)
End If
Select Case intCode
Case 273
sConvert = sConvert & "d"
Case 272
sConvert = sConvert & "D"
Case 224, 225, 226, 227, 259, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, 7863
sConvert = sConvert & "a"
Case 192, 193, 194, 195, 258, 7840, 7842, 7844, 7846, 7848, 7850, 7852, 7854, 7856, 7858, 7860, 7862
sConvert = sConvert & "A"
Case 232, 233, 234, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879
sConvert = sConvert & "e"
Case 200, 201, 202, 7864, 7866, 7868, 7870, 7872, 7874, 7876, 7878
sConvert = sConvert & "E"
Case 236, 237, 297, 7881, 7883
sConvert = sConvert & "i"
Case 204, 205, 296, 7880, 7882
sConvert = sConvert & "I"
Case 242, 243, 244, 245, 417, 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907
sConvert = sConvert & "o"
Case 210, 211, 212, 213, 416, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, 7902, 7904, 7906
sConvert = sConvert & "O"
Case 249, 250, 361, 432, 7909, 7911, 7913, 7915, 7917, 7919, 7921
sConvert = sConvert & "u"
Case 217, 218, 360, 431, 7908, 7910, 7912, 7914, 7916, 7918, 7920
sConvert = sConvert & "U"
Case 253, 7923, 7925, 7927, 7929
sConvert = sConvert & "y"
Case 221, 7922, 7924, 7926, 7928
sConvert = sConvert & "Y"
Case Else
sConvert = sConvert & sChar
End Select
Next
ConvertToUnSign = sConvert End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chỉ cần loại bỏ dấu mà không cần phải loại bỏ khoảng trắng thì phải làm sao? Mong các Bạn hỗ trợ giúp. Xin cảm ơn!
 
Upvote 0
Hix mình cũng cần giống tuliemhanoi, chưa biết làm sao.

Có cao nhân nào giúp đỡ không nhỉ, mình biết ơn nhiều lắm.
 
Upvote 0
Em xin mạo muội khai bút nhé. (Đây là vinh dự đầu tiên cho em kể từ khi đăng ký diễn đàn sai xót gì bỏ qua cho em)
Alt +F11 > Tìm đến Module1 > tìm thủ tục dưới đây :
Sub LoaiDau()
For Each mycell In Selection
mycell.Value = AllTrim(LoaiDauUni(mycell.Value))
Next
End Sub


Thay AllTrim = Trim
 
Upvote 0
File Hotrotiengviet VBA dùng trên office 365 rất hay bị treo và lỗi dẫn đến không mở được excel.
Không biết lỗi là do đâu vậy ạ.
 
Upvote 0
Web KT
Back
Top Bottom