Cần giúp chuyển Unicode tổ hợp sang Unicode dựng sẵn trong Excel (1 người xem)

Liên hệ QC

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

leonguyenz

Thành viên gạo cội
Thành viên BQT
Moderator
Tham gia
2/8/10
Bài viết
5,225
Được thích
9,026
Giới tính
Nam
Em tìm trên GPE và một số trang khác nhưng chưa thấy. Mong các thầy giúp vấn đề này:
Trên sheet có 2 loại bảng mã Unicode dựng sẵnUnicode tổ hợp (mỗi cell một bảng mã riêng, do file tổng hợp từ nhiều người nhập liệu). Vì đây là số liệu cũ nên em muốn chuyển sang Unicode dựng sẵn, để dễ tra tìm.
Chân thành cảm ơn !
 
Em tìm trên GPE và một số trang khác nhưng chưa thấy. Mong các thầy giúp vấn đề này:
Trên sheet có 2 loại bảng mã Unicode dựng sẵnUnicode tổ hợp (mỗi cell một bảng mã riêng, do file tổng hợp từ nhiều người nhập liệu). Vì đây là số liệu cũ nên em muốn chuyển sang Unicode dựng sẵn, để dễ tra tìm.
Chân thành cảm ơn !

Hỏi lại: Dữ liệu trong file là dữ liệu thô thôi hay có chứa công thức? Vì nếu chỉ là dữ liệu thô còn dễ, có công thức sẽ "tê" hơn nhiều!
Giải thuật tạm thời của tôi là thế này:
- Tạo bảng tra cứu 2 chiều với cột 1 chứa các ký tự Unicode tổ hợp, cột 2 chứa các ký tự Unicode dựng sẵn
- Dùng vòng lập duyệt từ đầu đến cuối bảng và dùng Find and Replace để tìm và thay thế tương ứng
===> Giải thuật này chắc bạn tự triển khai được chứ nhỉ?
 
Hỏi lại: Dữ liệu trong file là dữ liệu thô thôi hay có chứa công thức? Vì nếu chỉ là dữ liệu thô còn dễ, có công thức sẽ "tê" hơn nhiều!
Giải thuật tạm thời của tôi là thế này:
- Tạo bảng tra cứu 2 chiều với cột 1 chứa các ký tự Unicode tổ hợp, cột 2 chứa các ký tự Unicode dựng sẵn
- Dùng vòng lập duyệt từ đầu đến cuối bảng và dùng Find and Replace để tìm và thay thế tương ứng
===> Giải thuật này chắc bạn tự triển khai được chứ nhỉ?

Hihi, bữa trước gặp thầy có báo cáo trước cho thầy rồi, em có biết tí code nào đâu +-+-+-+
Bảng tra cứu là bảng thô, nhưng mà nhiều dòng nhiều cột. Trong đó các cell đều là Unicode, em biết chắc chắn nhiều cell được gõ theo bảng mã Unicode tổ hợp. Em muốn chuyển tất cả hỗn hợp đó về Unicode dựng sẵn thầy ạ !
 
Hihi, bữa trước gặp thầy có báo cáo trước cho thầy rồi, em có biết tí code nào đâu +-+-+-+
Bảng tra cứu là bảng thô, nhưng mà nhiều dòng nhiều cột. Trong đó các cell đều là Unicode, em biết chắc chắn nhiều cell được gõ theo bảng mã Unicode tổ hợp. Em muốn chuyển tất cả hỗn hợp đó về Unicode dựng sẵn thầy ạ !

Đổi "đuôi" thành BAS
Dùng
Mã:
= SourceToDest(text, src_uni, dst_uni)
 

File đính kèm

File đính kèm

Công thức trên chỉ dùng trong VBA thôi bạn.Phải dùng là:
PHP:
= SourceToDest(text, 1, 1)
Mới được bạn test lại xem!
 
Lần chỉnh sửa cuối:
Em đã test thử nhưng không đổi được đuôi .BAS, khi áp code vào và sử dụng công thức thì không chạy được.
Xin cảm ơn nhiều !

Bạn chuột phải trên tập tin TXT --> Rename --> thay đuôi txt bằng bas.
Do GPE không cho gửi bas nên tôi phải chuyển sang txt
Bạn không thể lập công thức cho vd. A1 khi mà bạn truyền vào hàm cũng chính là A1
Bạn thử lập công thức cho A1 là =SUM(A1;B1)???
Nếu dùng trên sheet thì công thức cho cell Ax là = SourceToDest(Ay, 1, 1)
Với x <> y
 
Lần chỉnh sửa cuối:
Bạn chuột phải trên tập tin TXT --> Rename --> thay đuôi txt bằng bas.
Do GPE không cho gửi bas nên tôi phải chuyển sang txt
Bạn không thể lập công thức cho vd. A1 khi mà bạn truyền vào hàm cũng chính là A1
Bạn thử lập công thức cho A1 là =SUM(A1;B1)???
Nếu dùng trên sheet thì công thức cho cell Ax là = SourceToDest(Ay, 1, 1)
Với x <> y

Thú thật là em chưa nghiên cứu code nên chưa biết cách áp dụng. Sau khi rename file .bas, em không biết bước tiếp theo phải làm gì luôn.
Mong mọi người giúp, test và up file lên từ file em gửi bài #5 dùm.
 
Thú thật là em chưa nghiên cứu code nên chưa biết cách áp dụng. Sau khi rename file .bas, em không biết bước tiếp theo phải làm gì luôn.
Mong mọi người giúp, test và up file lên từ file em gửi bài #5 dùm.
- Đổi đuôi file txt thành bas
- Khởi động Excel, bấm Alt + F11 để vào cửa sổ VBA
- Trong cửa sổ lập trình, vào menu File\Import File ---> Duyệt đến file .bas rồi bấm Open
- Xem lại sẽ thấy 1 module vừa được chèn vào
- Bấm Alt + Q để trở về bảng tính
- Giờ, trên bảng tính, bạn có thể gõ hàm để convert, chẳng hạn =SourceToDest(A1,1,1) nghĩa là convert chuổi tại cell A1 có nguồn là unicode (tổ hợp hay dựng sẵn) sang unicode dựng sẵn
 
Bạn cũng có thể không cần đổi đuôi cũng được, Alt+F11 sao đó chèn Module vào Alt+I+M, tiếp theo chèn text file vào Alt + I + L sao đó tìm đến txt file rồi ok
 
Bạn cũng có thể không cần đổi đuôi cũng được, Alt+F11 sao đó chèn Module vào Alt+I+M, tiếp theo chèn text file vào Alt + I + L sao đó tìm đến txt file rồi ok

Làm vậy cũng được nhưng có 2 vấn đề xảy ra:
- Thứ nhất: bạn phải xóa dòng đầu tiên (Attribute VB_Name = "vietnamese_unicode_convert") trong file txt thì code mới chạy được
- Thứ hai: Chèn code như vậy sẽ mất tên Module
 
Làm vậy cũng được nhưng có 2 vấn đề xảy ra:
- Thứ nhất: bạn phải xóa dòng đầu tiên (Attribute VB_Name = "vietnamese_unicode_convert") trong file txt thì code mới chạy được
- Thứ hai: Chèn code như vậy sẽ mất tên Module
Em test rồi không thấy hiện tuợng như anh nói code vẫn chạy bình thường chỉ thiếu khai báo biến kytu2 thôi
 
Em test rồi không thấy hiện tuợng như anh nói code vẫn chạy bình thường chỉ thiếu khai báo biến kytu2 thôi
Tôi đâu có nói là không chạy được code, có điều bạn phải xóa dòng Attribute VB_Name = "vietnamese_unicode_convert"
Ngoài ra sẽ không có tên Module ---> Dùng Inprot file sẽ vừa chèn code vừa đặt tên cho module luôn trong khi nếu copy/paste thì bạn phải làm bằng tay mọi thứ
Thế thôi
 
Lần chỉnh sửa cuối:
Thú thật là em chưa nghiên cứu code nên chưa biết cách áp dụng. Sau khi rename file .bas, em không biết bước tiếp theo phải làm gì luôn.Mong mọi người giúp, test và up file lên từ file em gửi bài #5 dùm.
A chuyển code của Siwton vào file cho e rồi.Có bổ sung thêm 1 chút cho UDF, chả biết có đúng ý tác giả.SourceToDest = Trim(s)
 

File đính kèm

Lần chỉnh sửa cuối:
A chuyển code của Siwton vào file cho e rồi.Có bổ sung thêm 1 chút cho UDF, chả biết có đúng ý tác giả.SourceToDest = Trim(s)

Không đúng ý tác giả.
Tác giả chủ ý làm thế. Ta hãy tưởng tượng là những chuỗi cần convert kia chỉ là những chuỗi trung gian, tạm thời, và chúng có dấu cách ở đầu (cuối). Các chuỗi được lấy từ đâu đó, lọc từ đâu đó và sau khi convert chúng sẽ được nối với các chuỗi khác để tạo thành kết quả. Nếu bạn xóa các dấu cách trước sau thì trong chuỗi kết quả một số từ sẽ bị dính vào nhau.
Dù trường hợp nào chăng nữa thì hàm convert chỉ làm nhiệm vụ convert, nó không can thiệp, không sửa dữ liệu của người dùng, vì quá mạo hiểm. Nếu người dùng cần xóa các dấu cách ở 2 đầu thì luôn luôn có thể dùng Trim(SourceToDest(...)). Tức việc xóa do người dùng quyết định.

Hay là bạn nhìn ở đầu tôi có text = text & " " nên bạn nghĩ tôi quên xóa dấu cách tự thêm vào? Nếu thế thì bạn nên nhìn "While n < k" - k = Len(text) thì bạn thấy dấu " " tôi thêm vào không bao giờ được đọc riêng với mục đích convert nó. Nó chỉ được đọc kèm với ký tự trước cuối khi cần kiểm tra ký tự trước cuối (tức ký tự cuối trong chuỗi của người dùng) có là ký tự 2 bai không mà thôi. Tất nhiên nếu chuỗi người dùng có ký tự " " ở cuối thì nó được "convert" vì nó là ký tự trước cuối trong chuỗi text truyền vào WHILE.

Tóm lại chuỗi của người dùng thế nào (có hoặc không có dấu " ") thì hàm trả về y nguyên như thế (có hoặc không có dấu " "). Không thêm và cũng không bớt dấu " " cho chuỗi người dùng. Bạn thử thì sẽ thấy.

Kinh nghiệm: muốn sửa code nào đó thì nên tìm hiểu kỹ nó hoạt động như thế nào
 
- Đổi đuôi file txt thành bas
- Khởi động Excel, bấm Alt + F11 để vào cửa sổ VBA
- Trong cửa sổ lập trình, vào menu File\Import File ---> Duyệt đến file .bas rồi bấm Open
- Xem lại sẽ thấy 1 module vừa được chèn vào
- Bấm Alt + Q để trở về bảng tính
- Giờ, trên bảng tính, bạn có thể gõ hàm để convert, chẳng hạn =SourceToDest(A1,1,1) nghĩa là convert chuổi tại cell A1 có nguồn là unicode (tổ hợp hay dựng sẵn) sang unicode dựng sẵn

Vậy nếu em muốn chuyển unidoce tổ hợp sang unicode dựng sẵn thì dùng như thế nào? Có thể áp dụng để chuyển đổi database trong VB ko?
 
Vậy nếu em muốn chuyển unidoce tổ hợp sang unicode dựng sẵn thì dùng như thế nào? Có thể áp dụng để chuyển đổi database trong VB ko?

Giờ, trên bảng tính, bạn có thể gõ hàm để convert, chẳng hạn =SourceToDest(A1,1,1) nghĩa là convert chuổi tại cell A1 có nguồn là unicode (tổ hợp hay dựng sẵn) sang unicode dựng sẵn

Cái dòng đỏ đỏ bạn trích này chả đã hướng dẫn rồi còn gì.

Bạn có strUni là text unicode - không quan trọng là tổ hợp hay dựng sẵn và bạn muốn convert sang unicode dựng sẵn strUniDungsan thì:
strUniDungsan = SourceToDest(strUni, 1, 1)
 
quá tuyệt vời, cám ơn rất rất nhiều!
 
Tôi đã thử và thấy: nếu trong sheets chỉ có 2 loại unicode tổ hợp và unicode và muốn chuyển hết về unicode thì chỉ cần sử dụng chức năng chuyển mã của bộ gõ Unicode.

Cụ thể:
1. Gõ Ctrl - Shift - F6 để hiện menu, chọn nguồn và đích đều là Unicode. Chọn chuyển mã Clipboard.
2. Chọn khối ô, gõ Ctrl - C, Ctrl - Shift - F9, Ctrl - V là được

Trước tôi cứ thấy lạ sao đổi Unicode sang Unicode. Khi so sánh chuỗi trong VBA thì gặp False với 2 ô giống nhau (viết công thức trên excel thì True, ví dụ =a1 = b1 cho True)

Nhờ dùng "chuyển mã" nêu trên mà chúng thực sự giống nhau.

Và có 1 nhận xét thế này: Bảng mã Unicode có 2 bảng mã con.
 
Và có 1 nhận xét thế này: Bảng mã Unicode có 2 bảng mã con.

Chả nhẽ tôi học thêm được điều mới?

Theo tôi bạn phát biểu không chính xác.

Khái niệm tổ hợp và dựng sẵn chỉ có khi ta nói tới cách biểu diễn một chuỗi ký tự. Chuỗi ở đây được hiểu là 1 ký tự hoặc nhiều ký tự.

Trong bảng mã unicode mỗi "phần tử" là 1 ký tự duy nhất (ký tự chứ không phải chuỗi) và có điểm mã là một con số 2 bai. Vậy bạn có thể chỉ ra cho tôi 1 ký tự trong bảng mã Unicode được công bố mà theo bạn thì đó là unicode tổ hợp được không?

Khi tôi cần biểu diễn 1 ký tự mà có hình hài - glyph - "như thế này" thì nhiều khi tôi có 2 cách biểu diễn. "Nhiều khi" vì có khi chỉ có 1 cách biểu diễn duy nhất - vd. ký tự "a" trong bảng mã unicode. Vd. ký tự mà ta nhìn thấy là "ồ". Tôi có thể biểu diễn "nó" bằng 1 ký tự unicode duy nhất mà trong bảng mã unicode có điểm mã là &H1ED3 (2 bai): ChrW(&H1ED3) = ChrW(7891). Nhưng ai đó có thể biểu diễn ký tự mà mắt nhìn thấy là "ồ" bằng 2 ký tự mà trong bảng mã unicode có điểm mã là ChrW(&HF4) và ChrW(300) (2 + 2 = 4 bai): ChrW(&HF4) & ChrW(300) = ChrW(244) & ChrW(768). Trong trường hợp này ta "lắp ráp" (tổ hợp) 2 ký tự là "ô" (điểm mã 244) và "dấu huyền" (điểm mã 768) để có ký tự mà mắt nhìn thấy là "ồ".

Tóm lại nếu có một ký tự nào đó trong bảng mã unicode (2 bai) mà ta có thể biểu diễn bằng cách dùng 2, 3 ký tự khác cũng của bảng mã unicode thì có thể nói là cách thứ 2 biểu diễn ký tự (có cùng glyph như cách thứ nhất) bằng cách dùng unicode tổ hợp (luôn dùng > 2 bai). Riêng về bảng mã unicode thì chỉ có 1, mỗi ký tự là unicode - chả dựng sẵn mà cũng chả tổ hợp - 2 bai. Cùng lắm theo tôi thì nói mỗi ký tự trong bảng mã unicode là unicode dựng sẵn. Theo tôi không có cái gọi là "Bảng mã Unicode có 2 bảng mã con"
 
Lần chỉnh sửa cuối:
Em bây giờ muốn covert từ Unicode dung sẵn sang Unicode Tổ hợp thì phài làm thế nào. Mong các anh/chị chỉ giúp. Em xin cám ơn.
 
Unicode, Unicode tổ hợp, Unicode C string.
Em có file excel 2007 bị lỗi in tiếng việt, liệu có liên quan gì đến bảng mã trên không anh/chị?
Em in máy Canon 2900, cùng file đó mà lúc in được bình thường, lúc in bị lỗi tiếng Việt.
 

File đính kèm

  • unicode.jpg
    unicode.jpg
    19.7 KB · Đọc: 66
Em có file excel 2007 bị lỗi in tiếng việt, liệu có liên quan gì đến bảng mã trên không anh/chị?
Em in máy Canon 2900, cùng file đó mà lúc in được bình thường, lúc in bị lỗi tiếng Việt.
1) Tôi nghĩ máy in không liên quan đến chuyện lỗi font. Mà lỗi font là do 1 phần mềm nào đó bạn đang dùng gây ra lỗi. Máy in chỉ là thiết bị hiển thị bên ngoài như màn hình. Trong lỗi thì hiển thị ra bên ngoài lỗi, trong ngon lành thì hiển thị ra bên ngoài ngon lành.
2) Trên nhiều máy tôi dùng bảng mã Unicode, font chữ Times New Roman thì vẫn ra chữ tiếng Việt ngon lành có dấu.
 
Chuyển unicode dựng sẵn sang unicode tổ hợp VBA

Làm ơn giúp tôi chuyển unicode dựng sẵn sang unicode tổ hợp
Chi tiết là tôi thêm các text box trong excel gõ unicode dựng sẵn nó hiển thì bình thường nhưng khi in thì nó lỗi font, còn sử dụng unicode tổ hợp thì không sao.
 
Lần chỉnh sửa cuối:
Tôi dùng code chuyển đổi từ Unicode tổ hợp sang dựng sẳn thì thành công hết chỉ bị mỗi cái lỗi ở ký tự "Đ".
Từ nào có dùng chữ "Đ" viết hoa thì khi chuyển sang dựng sẳn đều biến thành chữ "đ" viết thường.
Bạn nào biết về các bảng mã Unicode, sửa trong cái hàm này giùm nhé.
Cảm ơn trước. :)
 
Em bây giờ muốn covert từ Unicode dung sẵn sang Unicode Tổ hợp thì phài làm thế nào. Mong các anh/chị chỉ giúp. Em xin cám ơn.


SourceToDest(A1,1,?) dấu hỏi sẽ là gì ạ?
 
Cảm ơn tất cả các anh chị đã đưa ra nhiều ý kiến rất hữu ích, điều này đã giúp mình giải quyết được vấn đề chuyển mã từ Unicode dựng sẵn - Unicode tổ hợp.
Như các anh chị cũng biết 2 loại này khác nhau nhiều, dễ thấy nhất là độ dài chuỗi ký tự khi dùng hàm LEN.
Sau một lúc mày mò tìm hiểu thông tin thì mình cũng vượt qua được nên muốn được chia sẻ với những ai chưa biết.
Việc chuyển mã cũng vô cùng đơn giản với công cụ có sẵn mà ai cũng biết đó là Unikey của anh Phạm Kim Long.

Mở một tập tin excel hay gì đó có text, copy đoạn văn bản cần chuyển đổi, sau đó mở công cụ chuyển mã của Unikey hoặc có thể nhấn tổ hợp phím Ctrl+Shift-F6.
Chọn setting như trong hình và bấm chuyển mã. Nếu muốn chuyển ngược lại thì click vào Đảo bảng mã.

chuyenma.JPG

Việc còn lại là past thôi. Chúc các bạn và anh chị thành công.
 
Em bây giờ muốn covert từ Unicode dung sẵn sang Unicode Tổ hợp thì phài làm thế nào. Mong các anh/chị chỉ giúp. Em xin cám ơn.


SourceToDest(A1,1,?) dấu hỏi sẽ là gì ạ?
Với SourceToDest KHÔNG convert được từ unicode dựng sẵn sang unicode tổ hợp. Luôn chỉ convert sang unicode dựng sẵn.

Nếu là chuyển từ unicode sang unicode thì SourceToDest luôn chuyển từ unicode (dựng sẵn hoặc tổ hợp) sang unicode dựng sẵn. Tức nếu A1 chứa unicode tổ hợp thì SourceToDest(A1,1,1) trả về unicoder dựng sẵn. Nếu A1 chứa unicode dựng sẵn thì SourceToDest(A1,1,1) trả về unicode dựng sẵn y như A1.

Khi convert từ unicode (dựng sẵn hoặc tổ hợp) sang unicode dựng sẵn thì luôn là SourceToDest(A1,1,1). Số 1 có nghĩa là UNICODE
 

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

Back
Top Bottom