Gửi tặng các bạn hàm MsgBoxUni hiển thị font tiếng Việt/Unicode

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,652
Được thích
10,142
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Guideline: Bản chất có mỗi 1 dòng chứ ko đến 5 hay 6 dòng đâu Tuân à:
Tuân tra cái hàm này là xong: DefWindowProcW. Đã bảo là Subclass làm gì cho mệt. Hạn chế được mấy cái đau đầu đó bao nhiêu càng tốt. Mà nên nhớ là trong VB để có được Safe Subclass (Subclass thực sự an toàn cho mọi windows) ko phải là dễ đâu nhé (hiện trên khá nhiều diễn đàn VB trên thế giới thấy chủ yếu mọi người dùng Subclass của Paul Caton, đó là 1 Subclass thuộc dạng "Safe" tương đối nổi tiếng rồi (combining ASM and VB). Tác giả này hiện ko viết VB nữa và một chuyên gia khác đã xin phép tiếp tục duy trì tiếp cái Safe Subclass của Paul Caton và chuyển lên sử dụng hoàn toàn ngôn ngữ VB chứ ko phải dùng ASM nữa). Vì thế, nếu viết ko cẩn thận là toi mà ko hề biết đấy (chạy nhiều, chạy thật, chạy thương mại, chạy nhiều môi trường IDE,... mới thấy toi).

Kỹ thuật thì cao nhưng lối viết phải càng đơn giản càng đúng. Bác Hồ cũng nói, viết dài thì dễ chứ viết ngắn mới khó.

Còn vụ msgbox, giải pháp của mọi người loằng ngoằng quá. Ko hiểu sao code của tớ ngắn ngủn mà làm cách đây lâu lắm rồi, giờ chả mấy khi đụng đến nữa (chỉ vài chục dòng tính cả bắt lỗi, ko kể cái hàm TCVN32Unicode) mà chỉ cần: Msgbox cái là lên Unicode luôn (như thế mới ko cần phải thay hết các dòng gọi Msgbox thành UniMsgbox gì đó trong chương trình chứ).

@TuanVNUNI: Tớ định ko viết gì nữa mà. Đang nhiều việc thực sự. (Viết bài ngăn ngắn như thế này mất đúng 1 tiếng với 5 hay 6 lần chỉnh sửa câu văn).
Bây giờ hạn chế cái món APIs, Subclass, Hook... linh tinh đó rồi. Tập chung làm mịn sản phẩm, nâng cao tính năng, trau chuốt tài liệu, suy nghĩ về platform, framework, tính tổng quát hóa của các đối tượng, tối ưu CSDL, giảm chi phí dịch vụ, tăng độ hài lòng của khách hàng.... Mấy cái đó chưa thấy món nào dùng tới Subclass, Hook... mà KH sướng rên lên rồi.

Đơn cử như cái vụ 3-tiers layers có đầy ví dụ trên mạng, ví dụ chuẩn của M$ nhưng chả thấy ai nhắc tới cả. Món đó quan trọng hơn tương đối nhiều so với một vài hàm unicode, subclass cái msgbox, v.v... cho dù mấy món đó tương đối hay.

Tôi viết thế thực ra chỉ để cá nhân tôi cùng với mọi người thoát khỏi những gì tôi đã từng u mê (à quên, đam mê :)) để có thể nghĩ rộng và dài hơi hơn cho sự nghiệp (nếu coi đó là sự nghiệp) của mình. (mấy món này thực chất tôi đang nói với chính tôi đấy, đừng ai để ý nhé :))
 
Lần chỉnh sửa cuối:
Upvote 0
smbsolutions đã viết:
Guideline: Bản chất có mỗi 1 dòng chứ ko đến 5 hay 6 dòng đâu Tuân à:
Tuân tra cái hàm này là xong: DefWindowProcW. Đã bảo là Subclass làm gì cho mệt. Hạn chế được mấy cái đau đầu đó bao nhiêu càng tốt. Mà nên nhớ là trong VB để có được Safe Subclass (Subclass thực sự an toàn cho mọi windows) ko phải là dễ đâu nhé (hiện trên khá nhiều diễn đàn VB trên thế giới thấy chủ yếu mọi người dùng Subclass của Paul Caton, đó là 1 Subclass thuộc dạng "Safe" tương đối nổi tiếng rồi (combining ASM and VB). Tác giả này hiện ko viết VB nữa và một chuyên gia khác đã xin phép tiếp tục duy trì tiếp cái Safe Subclass của Paul Caton và chuyển lên sử dụng hoàn toàn ngôn ngữ VB chứ ko phải dùng ASM nữa). Vì thế, nếu viết ko cẩn thận là toi mà ko hề biết đấy (chạy nhiều, chạy thật, chạy thương mại, chạy nhiều môi trường IDE,... mới thấy toi).

Kỹ thuật thì cao nhưng lối viết phải càng đơn giản càng đúng. Bác Hồ cũng nói, viết dài thì dễ chứ viết ngắn mới khó.

Còn vụ msgbox, giải pháp của mọi người loằng ngoằng quá. Ko hiểu sao code của tớ ngắn ngủn mà làm cách đây lâu lắm rồi, giờ chả mấy khi đụng đến nữa (chỉ vài chục dòng tính cả bắt lỗi, ko kể cái hàm TCVN32Unicode) mà chỉ cần: Msgbox cái là lên Unicode luôn (như thế mới ko cần phải thay hết các dòng gọi Msgbox thành UniMsgbox gì đó trong chương trình chứ).

@TuanVNUNI: Tớ định ko viết gì nữa mà. Đang nhiều việc thực sự. (Viết bài ngăn ngắn như thế này mất đúng 1 tiếng với 5 hay 6 lần chỉnh sửa câu văn).
Bây giờ hạn chế cái món APIs, Subclass, Hook... linh tinh đó rồi. Tập chung làm mịn sản phẩm, nâng cao tính năng, trau chuốt tài liệu, suy nghĩ về platform, framework, tính tổng quát hóa của các đối tượng, tối ưu CSDL, giảm chi phí dịch vụ, tăng độ hài lòng của khách hàng.... Mấy cái đó chưa thấy món nào dùng tới Subclass, Hook... mà KH sướng rên lên rồi.

Đơn cử như cái vụ 3-tiers layers có đầy ví dụ trên mạng, ví dụ chuẩn của M$ nhưng chả thấy ai nhắc tới cả. Món đó quan trọng hơn tương đối nhiều so với một vài hàm unicode, subclass cái msgbox, v.v... cho dù mấy món đó tương đối hay.

Tôi viết thế thực ra chỉ để cá nhân tôi cùng với mọi người thoát khỏi những gì tôi đã từng u mê (à quên, đam mê :)) để có thể nghĩ rộng và dài hơi hơn cho sự nghiệp (nếu coi đó là sự nghiệp) của mình. (mấy món này thực chất tôi đang nói với chính tôi đấy, đừng ai để ý nhé :))

Chìa khóa đây rồi DefWindowProcW. Cảm ơn anh smbsolutions!

Mọi người đều phải trải qua các thời kỳ, nó như một quy luật sống mà anh. Việc thì vẫn nhiều,...đam mê thì không bỏ được :) .
Một lần nữa cảm ơn sự chia sẻ của anh về các vấn đề!
 
Lần chỉnh sửa cuối:
Upvote 0
Mr Okebab đã viết:
Phức tạp nhỉ :
Gõ Unicode " Xử lý tiếng Việt", ----UniVba--->Chuỗi---CopyVBE--->MsgboxUni--->" Xử lý tiếng Việt"
Có thể gộp 2 hàm này thành 1 không các bác ??
Thân!
VBA editor không cho nhập tiếng Việt Unicode, làm sao nhập tiếng Việt vào đó được?
Cách làm này không cần sử dụng hàm chuyển mã cho MsgboxUni và không cần lấy dữ liệu từ bảng tính.
 
Lần chỉnh sửa cuối:
Upvote 0
Cái MsgBoxUni của Tuân viết dùng với String thì rất tốt. Nhưng khi VB AntiCrack để nâng cao bảo mật trong VB6 thì nó chuyển toàn bộ từng chữ sang Chr() ghép với nhau ... và MsgBoxUni không nhận dạng được chữ tiếng Việt nữa. Không hiểu có cách nào xử lý trường hợp này không?
 
Upvote 0
Cái MsgBoxUni của Tuân viết dùng với String thì rất tốt. Nhưng khi VB AntiCrack để nâng cao bảo mật trong VB6 thì nó chuyển toàn bộ từng chữ sang Chr() ghép với nhau ... và MsgBoxUni không nhận dạng được chữ tiếng Việt nữa. Không hiểu có cách nào xử lý trường hợp này không?

Bản chất hàm Chr() là trả về ký tự 1 byte (AnsiChar), còn ChrW() thì trả về ký tự 2 bytes (WideChar) - Unicode. Để hiện được font tiếng Việt thì chuỗi đưa vào phải là dạng unicode. Chương trình AntiCrack nó chuyển chuỗi về dạng AnsiString (hàm Chr) nên hàm MsgBoxUni không đọc được tiếng Việt là đúng. Vấn đề ở đây là lỗi do AntiCrack không support chuỗi unicode. Lễ ra nó phải dùng ChrW thì lại trả về Chr.

Cách khắc phục, sau khi đã dùng AntiCrack anh hãy xem lại đoạn đổi chuỗi unicode, rồi thay bằng đoạn mã chuẩn viết bằng ChrW là được. Cái đoạn đổi này anh tìm hàm của bác Phạm Duy Long đổi nhanh.
 
Upvote 0
Bản chất hàm Chr() là trả về ký tự 1 byte (AnsiChar), còn ChrW() thì trả về ký tự 2 bytes (WideChar) - Unicode. Để hiện được font tiếng Việt thì chuỗi đưa vào phải là dạng unicode. Chương trình AntiCrack nó chuyển chuỗi về dạng AnsiString (hàm Chr) nên hàm MsgBoxUni không đọc được tiếng Việt là đúng. Vấn đề ở đây là lỗi do AntiCrack không support chuỗi unicode. Lễ ra nó phải dùng ChrW thì lại trả về Chr.

Cách khắc phục, sau khi đã dùng AntiCrack anh hãy xem lại đoạn đổi chuỗi unicode, rồi thay bằng đoạn mã chuẩn viết bằng ChrW là được. Cái đoạn đổi này anh tìm hàm của bác Phạm Duy Long đổi nhanh.

Hình như vẫn không được Tuân ơi.

Mô tả:
Chr(charcode)
Chuyển mã Ascii thành ký tự

Tham số:
charcode
Mã cần chuyển

Ví dụ:
Option Explicit
Private Sub Form_Load()
Dim MyChar
MyChar = Chr(65)' Returns A.
MyChar = Chr(97)' Returns a.
MyChar = Chr(62)' Returns >.
MyChar = Chr(37)' Returns %.
End Sub

Hàm ChrW cũng trả về tương tự.

Chr.jpg


Mình Test thử 2 trường hợp trên VBA đều hiện Unicode bình thường (dùng cả Chr và ChrW).

MsgBoxUni UNC(Chr(167) & Chr(169) & ChrW(121) & ChrW(32) & ChrW(108) & ChrW(181) & ChrW(32) & ChrW(99) & ChrW(104) & ChrW(173) & ChrW(172) & ChrW(110) & ChrW(103) & ChrW(32) & ChrW(116) & ChrW(114) & ChrW(215) & ChrW(110) & ChrW(104))
 
Lần chỉnh sửa cuối:
Upvote 0
Hình như vẫn không được Tuân ơi.



Hàm ChrW cũng trả về tương tự.

Chr.jpg


Mình Test thử 2 trường hợp trên VBA đều hiện Unicode bình thường (dùng cả Chr và ChrW).

Anh ơi, nếu các ký tự không dấu thì như nhau, nhưng những ký tự: Ấ, Ư, ử, ở,.. thì Chr()=? đó anh ạ.

Để cho nhanh anh dùng hàm mà bác Pham Duy Long viết, hình như là UniVBA
anh gõ hàm trên worksheet:
=UniVBA("chữ có dấu")
Kết quả là:
"ch" & ChrW(7919) & " có d" & ChrW(7845) & "u"

Nếu anh muốn đổi mấy ký tự không dấu về chr thì đổi lại mã nguồn là được.

Mã nguồn của hàm UniVBA:
Mã:
Function UniVba(TxtUni As String) As String
   [COLOR="DarkGreen"] 'Pham Duy Long[/COLOR]
    If TxtUni = "" Then
        UniVba = """"""
    Else
        TxtUni = TxtUni & " "
        If AscW(Left(TxtUni, 1)) < 256 Then UniVba = """"
        For n = 1 To Len(TxtUni) - 1
            uni1 = Mid(TxtUni, n, 1)
            uni2 = AscW(Mid(TxtUni, n + 1, 1))
            If AscW(uni1) > 255 And uni2 > 255 Then
                UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & "
            ElseIf AscW(uni1) > 255 And uni2 < 256 Then
                UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & """
            ElseIf AscW(uni1) < 256 And uni2 > 255 Then
                UniVba = UniVba & uni1 & """ & "
            Else
                UniVba = UniVba & uni1
            End If
        Next
        If Right(UniVba, 4) = " & """ Then
            UniVba = Mid(UniVba, 1, Len(UniVba) - 4)
        Else
            UniVba = UniVba & """"
        End If
    End If
End Function
 
Upvote 0
em vẫn không hiểu lắm về hàm StrConv(Chuoi, vbUnicode), bình thường mình đã xài unicode dựng sẵn với data, sao lại cần dùng thêm StrConv(Chuoi,vbUnicode) để hiển thị trong MsgboxUni... mong anh hồi đáp//
 
Upvote 0
em vẫn không hiểu lắm về hàm StrConv(Chuoi, vbUnicode), bình thường mình đã xài unicode dựng sẵn với data, sao lại cần dùng thêm StrConv(Chuoi,vbUnicode) để hiển thị trong MsgboxUni... mong anh hồi đáp//

Chuỗi unicode là mỗi ký tự 2 bytes, trong khi các ký tự unicode của Excel là 1 byte. Nên để tương thích với hàm API unicode của Widows phải chuyển đổi các ký tự 1 byte về 2 byte theo đúng tiêu chuẩn unicode. Ta dùng hàm StrConv(Chuoi, vbUnicode)
 
Upvote 0
Em muốn hỏi thêm về cách đổi tên của các nút ấn trong msgbox, em tìm trên mạng thì thấy nhiều anh dùng kĩ thuật Hook, sử dụng hàm SetDlgItemText nhưng lại bị lỗi font khi lên msgbox, em đã thử dùng StrConv(Chuoi, vbUnicode) nhưng vẫn bị lỗi...mong anh hồi đáp.
 
Upvote 0
Chuỗi unicode là mỗi ký tự 2 bytes, trong khi các ký tự unicode của Excel là 1 byte. Nên để tương thích với hàm API unicode của Widows phải chuyển đổi các ký tự 1 byte về 2 byte theo đúng tiêu chuẩn unicode. Ta dùng hàm StrConv(Chuoi, vbUnicode)
Hình như anh nói lộn, chuỗi trong vba nó là unicode sẵn rồi. 1 ký tự ăn 2 byte.
 
Upvote 0
Em muốn hỏi thêm về cách đổi tên của các nút ấn trong msgbox, em tìm trên mạng thì thấy nhiều anh dùng kĩ thuật Hook, sử dụng hàm SetDlgItemText nhưng lại bị lỗi font khi lên msgbox, em đã thử dùng StrConv(Chuoi, vbUnicode) nhưng vẫn bị lỗi...mong anh hồi đáp.
Bạn gửi file lên mới dễ. dùng strconv tùy tiện có khi phản tác dụng đấy.
tìm bài của anh Nghĩa mà xem
 
Upvote 0
Msgbox Tiếng Việt có dấu thì xài CreateObject("Wscript.shell").PopUp ............ Windows Giống đực hay cái điều xài được hết

đơn giản gọn nhẹ đi cho nó lành khỏi rắc rối API .... & cái giống gì gì đó ........... dẹp nó đi vào Recycle Bin cho nó gọn ...................

Với Mạnh vậy là đơn giản và nhanh nhất khỏi nhức đầu..........:p:D
 
Lần chỉnh sửa cuối:
Upvote 0
Msgbox Tiếng Việt có dấu thì xài CreateObject("Wscript.shell").PopUp ............ Windows Giống đực hay cái điều xài được hết

đơn giản gọn nhẹ đi cho nó lành khỏi rắc rối API .... & cái giống gì gì đó ........... dẹp nó đi vào Recycle Bin cho nó gọn ...................

Với Mạnh vậy là đơn giản và nhanh nhất khỏi nhức đầu..........:p:D

Bạn hiểu biết về vba ở mức độ hạn chế, API thì càng không có khái niệm gì thì cứ giữ nguyên cho bạn, đừng xui dại người khác khi họ đang muốn học để hiểu biết về API. Kiến thức này rộng còn dùng rất nhiều trong các kỹ thuật khác, nhiều mã nguồn hay ở nước ngoài cũng hay đụng vào API để xử lý giao diện, nên hiểu biết về nó sẽ giúp mọi người fix các lỗi sau này gặp phải. Đây là diễn đàn lớn, nhiều trình độ khác nhau, mỗi topic , bài viết đang hướng đến nhóm học và đối tượng khác nhau nên không dùng những ý kiến chủ quan làm ảnh hưởng tới mục tiêu học tập của topic và đặc biệt những người mới vào không biết nghe ai,... lắm thày thối ma.

Cao cấp về API và Unicode menu các bạn tham khảo tiếp về bày này nhé:
http://www.giaiphapexcel.com/dienda...ode-menu-trong-userform-umu-sourcecode.16802/
 
Upvote 0
Msgbox Tiếng Việt có dấu thì xài CreateObject("Wscript.shell").PopUp ............ Windows Giống đực hay cái điều xài được hết

đơn giản gọn nhẹ đi cho nó lành khỏi rắc rối API .... & cái giống gì gì đó ........... dẹp nó đi vào Recycle Bin cho nó gọn ...................

Với Mạnh vậy là đơn giản và nhanh nhất khỏi nhức đầu..........:p:D
Mình thích cái nào thì dùng cái đó. Cái nào mình cảm thấy thuận tiên hơn thì ưu tiên cái đó...
Nhưng khó có thể nói cái nào tốt hơn cái nào và cái nào nên cho vào thùng rác
Tôi cũng rất hạn chế dùng hàm API (bởi đơn giản là tôi hiểu biết quá ít về nó) nhưng cũng có vài trường hợp tôi bắt buộc phải dùng (những truy cập liên quan đến cách cửa sổ chẳng hạn) và tôi đành phải chấp nhân sự tồn tại của API như là một công cụ mạnh để giải quyết mọi thứ
 
Upvote 0
Bạn hiểu biết về vba ở mức độ hạn chế, API thì càng không có khái niệm gì thì cứ giữ nguyên cho bạn, đừng xui dại người khác khi họ đang muốn học để hiểu biết về API. Kiến thức này rộng còn dùng rất nhiều trong các kỹ thuật khác, nhiều mã nguồn hay ở nước ngoài cũng hay đụng vào API để xử lý giao diện, nên hiểu biết về nó sẽ giúp mọi người fix các lỗi sau này gặp phải. Đây là diễn đàn lớn, nhiều trình độ khác nhau, mỗi topic , bài viết đang hướng đến nhóm học và đối tượng khác nhau nên không dùng những ý kiến chủ quan làm ảnh hưởng tới mục tiêu học tập của topic và đặc biệt những người mới vào không biết nghe ai,... lắm thày thối ma.

Cao cấp về API và Unicode menu các bạn tham khảo tiếp về bày này nhé:
http://www.giaiphapexcel.com/diendan/threads/tặng-các-bạn-unicode-menu-trong-userform-umu-sourcecode.16802/
Tôi không có xúi ai ở đây cả mà tôi nêu ra vấn đề vậy.... đối với nhưng người mới bắt đầu thì nên bày cho người ta cái đơn giản nhất và dễ hiểu nhất để người ta có thể học và từng bước tiếp cận VBA sau đó mới nâng cấp lên được ....

Cái đơn giản nhất chưa học được thì nêu cái khó làm gì ... và đừng có nêu lắm thày thối ma ra đây .........

Bạn là cái giống gì hả ....Mục đích của bạn là sống nhờ code mà cứ hay này nọ bạn chia sẻ được cái gì giá trị nhất cho diễn đàn này .............
Tốt nhất nên tránh xa tôi ra .............Thích thì xóa nick của tôi đi........... đừng có chọc tức tui nhe
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi không có xúi ai ở đây cả mà tôi nêu ra vấn đề vậy.... đối với nhưng người mới bắt đầu thì nên bày cho người ta cái đơn giản nhất và dễ hiểu nhất để người ta có thể học và từng bước tiếp cận VBA sau đó mới nâng cấp lên được ....

Cái đơn giản nhất chưa học được thì nêu cái khó làm gì ... và đừng có nêu lắm thày thối ma ra đây .........

Bạn là cái giống gì hả ....Mục đích của bạn là sống nhờ code mà cứ hay này nọ bạn chia sẻ được cái gì giá trị nhất cho diễn đàn này .............
Tốt nhất nên tránh xa tôi ra .............Thích thì xóa nick của tôi đi........... đừng có chọc tức tui nhe

Tôi đoán ngay là sẽ nhận được câu trách móc của bạn. XIn lỗi làm bạn giận. Mỗi người một nghề, một việc, ai chả sống nhờ cơm, cơm có từ tiền, tiền có từ lao động, lao động năng suất từ học tập, mà học thì đa dạng và vô bờ bến...
Tôi góp ý bạn lần sau, đừng góp ý thay thế các phương pháp, đặc biệt phạm vi ứng dụng khác nhau. Ví dụ chủ đề này là có cách đây 10 năm, với cách làm API. Cứ tìm trên mạng sẽ thấy nó lan truyền trên nhiều diễn đàn. Nhiều code đâu đó trên GPE đang có cách làm như thế. Các cách gọi qua Shell, hay Application.DoAlert()... đều là những cách hay nếu có giới thiệu thì mang tính bổ sung chứ không phải "dẹp nó đi vào Recycle Bin cho nó gọn" - Câu này rất chủ quan khi mà chính bạn không rành. Trong văn phong của bạn dùng từ rất "nghèo" như là "cái giống gì gì đó" nghe có vẻ không được từ tốn.

Bạn hỏi tôi đã làm gì được cho diễn đàn thì tôi không thể nói với bạn, với câu hỏi như bạn thì chỉ nên google tìm "Nguyễn Duy Tuân + Giaiphapexcel.com" là có câu trả lời.
Cụ thể với hướng dẫn hàm MsgBoxUni này bạn tìm trên Google "MsgBoxUni" có cả trang nhước ngoài đưa vào thư viện tham khảo đó: http://www.pudn.com/Download/item/id/2648368.html

Nếu bạn muốn hỏi tôi thêm bất cứ điều gì thì cứ hỏi một cách từ tốn tôi sẽ trả lời hết.
 
Upvote 0
Em muốn hỏi thêm về cách đổi tên của các nút ấn trong msgbox, em tìm trên mạng thì thấy nhiều anh dùng kĩ thuật Hook, sử dụng hàm SetDlgItemText nhưng lại bị lỗi font khi lên msgbox, em đã thử dùng StrConv(Chuoi, vbUnicode) nhưng vẫn bị lỗi...mong anh hồi đáp.

Mua đưa chuỗi unicode lên thay vào nút em phải dùng hàm SetDlgItemTextW. Phần lớn các code mã nguồn ở nước ngoài người ta khai báo chuẩn là SetDlgItemTextA (Ansi) là kỹ tự 1 byte không phải unicode.
Khi khai báo SetDlgItemTextW thì bạn đưa chuỗi unicode vào nhưng phải dùng tới hàm StrConvert như tôi đã hướng dẫn.
 
Upvote 0
Msgbox Tiếng Việt có dấu thì xài CreateObject("Wscript.shell").PopUp ............ Windows Giống đực hay cái điều xài được hết

đơn giản gọn nhẹ đi cho nó lành khỏi rắc rối API .... & cái giống gì gì đó ........... dẹp nó đi vào Recycle Bin cho nó gọn ...................

Với Mạnh vậy là đơn giản và nhanh nhất khỏi nhức đầu..........:p:D
Bạn ơi. cho mình file License Excel.rar đi bạn, thanks bạn nhiều nhé
 
Upvote 0
Web KT
Back
Top Bottom