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

Liên hệ QC

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

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,845
Được thích
10,338
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Hỏi tí

TuanVNUNI đã viết:
Xin giới thiệu các bạn một hàm MsgBox thể hiện được font Unicode, hiển thị được hoàn toàn tiếng Việt.
Xem chi tiết và download tại đây
http://www.bluesofts.net/Baiviet/Laptrinh/VB_VBA/MsgBoxUnicode.htm

Một hàm MsgBox hoàn chỉnh và đầy đủ ở đây
http://www.giaiphapexcel.com/forum/showthread.php?t=1071&page=2

Chúc các bạn thành công

Mình đã copy đoạn mã trong trang http://www.bluesofts.net/Baiviet/Laptrinh/VB_VBA/MsgBoxUnicode.htm về và đưa vào module và thử viết một đoạn code
Mã:
Public Sub abc()
MsgBoxUni ("abc")
End Sub
Để hiện thử MsgboxUni nhưng khi đánh tiếng việt theo mã Unicode vào nó vẫn không hiện đúng tiếng Việt mà cứ loằng ngoằng.
Bạn có thể chỉ cụ thể và cho ví dụ được không.
 
Upvote 0
Tu Anh đã viết:
Mình đã copy đoạn mã trong trang http://www.bluesofts.net/Baiviet/Laptrinh/VB_VBA/MsgBoxUnicode.htm về và đưa vào module và thử viết một đoạn code
Mã:
Public Sub abc()
MsgBoxUni ("abc")
End Sub
Để hiện thử MsgboxUni nhưng khi đánh tiếng việt theo mã Unicode vào nó vẫn không hiện đúng tiếng Việt mà cứ loằng ngoằng.
Bạn có thể chỉ cụ thể và cho ví dụ được không.

Bạn hãy download file MsgboxUni.xls về sẽ thấy ví dụ của tôi trong đó. Rất dễ hiểu! Nếu vẫn chưa được tôi sẽ hướng dẫn cụ thể.
 
Upvote 0
Trong VBA thì ổn :-= , còn VB thì chưa được Tuân à. Em kiểm tra lại hay là post riêng file cho VB đi.
 
Upvote 0
PhanTuHuong đã viết:
Trong VBA thì ổn :-= , còn VB thì chưa được Tuân à. Em kiểm tra lại hay là post riêng file cho VB đi.

Em Test kỹ cả trong VB6 rồi, Ok.
Anh lấy một hàm chuyển từ Tcvn3ToUnicode (em tạm gọi tên hàm là UNC)
Chạy trong VB6 như sau

Mã:
MsgBoxUni UNC("VÉn ch¹y b×nh th­êng - Kieu go TCVN3")
 
Upvote 0
Xin gửi các bạn hàm MsgBox hiện font Unicode/hiện tiếng Việt
Phiên bản lần này tôi bổ sung thêm hai hàm chuyển mã
UNC - Hàm chuyển từ TCVN3->Unicode
VNI - Hàm chuyển từ VNI->Unicode

Thêm các thủ tục để test trên Excel và trên VB6, qua các ví dụ giúp các bạn dễ vận dụng hơn.

Mã:
'Không dùng thủ tục TestFontInRANGE trong VB6 (hoac Ver<7)
Sub TestFontInRANGE()
   'Test trong Excel
   MsgBoxUni Range("B3").Value, vbInformation, Range("B4").Value
   MsgBox Range("B3").Value, vbInformation, _
          Range("B4").Value & " - Dung ham MsgBox cua VB/VBA thi loi"
End Sub

Sub TestFontTCVN3()
    'UNC la ham chuyen tu ma TCVN3 sang Unicode
   MsgBoxUni UNC("Céng hoµ x· héi chñ nghÜa ViÖt Nam"), vbInformation, _
             UNC("Chuçi ®­a vµo lµ lµ kiÓu gâ TCVN3")
End Sub

Sub TestFontVNI()
   'VNI la ham chuyen tu ma VNI sang Unicode
   MsgBoxUni VNI("Coäng hoaø xaõ hoäi chuû nghóa Vieät Nam"), vbInformation, _
             VNI("Chuoãi ñöa vaøo laø laø kieåu goõ VNI")
   
End Sub

Xem chi tiết và download tại đây
http://www.bluesofts.net/Baiviet/Laptrinh/VB_VBA/MsgBoxUnicode.htm

Nếu thấy hay và vận dụng được xin đừng quên "Thanks"!;;;;;;;;;;;
 
Upvote 0
Vấn đề lại đặt ra, chúng ta đã làm được với Msgbox vậy còn đối với Caption của form thì sao? Tuân có ý kiến gì không?

Cám ơn Tuân về hàm này.

Lê Văn Duyệt
PS:Qua bài này anh mới biết khi chạy chương trình kiểm phiếu của em, font bị thay đổi, thảo nào cái nút Close của form bị nhỏ đi. Thì ra do đổi font!
 
Upvote 0
levanduyet đã viết:
Vấn đề lại đặt ra, chúng ta đã làm được với Msgbox vậy còn đối với Caption của form thì sao? Tuân có ý kiến gì không?

Cám ơn Tuân về hàm này.

Lê Văn Duyệt
PS:Qua bài này anh mới biết khi chạy chương trình kiểm phiếu của em, font bị thay đổi, thảo nào cái nút Close của form bị nhỏ đi. Thì ra do đổi font!

Caption của form thì bác cứ gán nó cho bằng một ô nào đó, trên đó thể hiện Unicode là được mà.
Em vẫn làm như vậy đấy.
Thân!
 
Upvote 0
Chào OKB,
Nó báo lỗi đây
Caption.jpg


LVD
 
Lần chỉnh sửa cuối:
Upvote 0
levanduyet đã viết:
Vấn đề lại đặt ra, chúng ta đã làm được với Msgbox vậy còn đối với Caption của form thì sao? Tuân có ý kiến gì không?

Cám ơn Tuân về hàm này.

Lê Văn Duyệt
PS:Qua bài này anh mới biết khi chạy chương trình kiểm phiếu của em, font bị thay đổi, thảo nào cái nút Close của form bị nhỏ đi. Thì ra do đổi font!

Unicode trên Form.Caption em sẽ nghiên cứu sau, có lẽ cũng rất khó vì Đại ca VB6 để tạo form anh ta dùng hàm CreateWindowExA, trong khi WINDOWS cung cấp hàm CreateWindowExW để thể hiện Unicode. Có một cách đơn giản nhất là dùng kỹ thuật Subclass form, bẫy sự kiện WM_NCPAINT và dúng hàm API DrawTextW để viết lại caption.
Để làm được form Unicode, chắc chắn phải đụng chạm tới kỹ thuật API-Subclass. Em sẽ nghiên cứu vụ này sau.
 
Upvote 0
Driven: Đừng "dính líu" gì tới Subclass trong vụ này. Không phải cái gì SubClass cũng đúng cả đâu. Vụ này khoảng 5 tới 6 dòng cực đơn giản cho Form thường thôi.

Về vấn đề ứng dụng CSDL, hiện nay mọi người đang tối đa là làm theo mô hình Client/Server 1 Layer nhỉ (từ Sheet, Form connect & exec SQL trực tiếp tới CSDL). Về lâu về dài như thế ko tốt đâu (this advise is not for excellers but for programmers). Anyways, chạy ngắn hạn thì OK.
 
Lần chỉnh sửa cuối:
Upvote 0
smbsolutions đã viết:
Driven: Đừng "dính líu" gì tới Subclass trong vụ này. Không phải cái gì SubClass cũng đúng cả đâu. Vụ này khoảng 5 tới 6 dòng cực đơn giản cho Form thường thôi.

Chỉ 5-6 dòng thôi ah, hóa ra lại dễ vậy. Anh có thể chia sẻ không?

Về vấn đề ứng dụng CSDL, hiện nay mọi người đang tối đa là làm theo mô hình Client/Server 1 Layer nhỉ (từ Sheet, Form connect & exec SQL trực tiếp tới CSDL). Về lâu về dài như thế ko tốt đâu (this advise is not for excellers but for programmers). Anyways, chạy ngắn hạn thì OK.

Vấn đề thiết kế CSDL theo các lớp layer có lẽ mọi người cần anh chỉ dẫn cụ thể thì mới thấy rõ đuợc vấn đề.
 
Upvote 0
Nếu bác smbsolutions biết thì hãy chia sẻ cho mọi người đi, cám ơn bác!
 
Lần chỉnh sửa cuối:
Upvote 0
Cái MsgBoxUni này lấy giá trị trên cell thì đúng nhưng gõ trực tiếp vào VB Editor hoặc copy dán từ bảng tính sang VB Editor thì không được. Có thể sửa được không?

Songmai vẫn dùng được kiểu gán caption bằng giá trị trên cell được mà, levanduyet ơi!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
songmai đã viết:
Cái MsgBoxUni này lấy giá trị trên cell thì đúng nhưng gõ trực tiếp vào VB Editor hoặc copy dán từ bảng tính sang VB Editor thì không được. Có thể sửa được không?
Nhân đây xin nói rõ về việc dùng hàm này trong VBE (Màn hình soạn thảo lệnh).

Giả sử tôi dùng VNI, đầu tiên tôi phải chỉnh bộ gõ như hình sau: (Bộ gõ tôi dùng UniKey)
msgbox1.jpg


Sau đó tôi phải bật bộ gõ gõ tiếng việt. Trong màn hình soạn thảo tôi gõ vào như sau. Chú ý các bạn sẽ không thấy tiếng việt.
msgbox2.jpg


Chú ý: các bạn không cần phải chỉnh font của màn hình soạn thảo VBE.
Ngoài ra bạn còn phải dùng hàm chuyển đổi từ VNI về Unicode giống như hình vẽ

LVD
 
Upvote 0
songmai đã viết:
Cái MsgBoxUni này lấy giá trị trên cell thì đúng nhưng gõ trực tiếp vào VB Editor hoặc copy dán từ bảng tính sang VB Editor thì không được. Có thể sửa được không?

VB Editor không hỗ trợ Unicode, vì thế bạn phải gõ chuỗi kiểu TCVN3 hoặc VNI sau đó dùng hàm UNC và hàm VNI để đổi về Unicode. Bạn download file tổi gửi về và xem các ví dụ test sẽ hiểu.
 
Upvote 0
TuanVNUNI đã viết:
VB Editor không hỗ trợ Unicode, vì thế bạn phải gõ chuỗi kiểu TCVN3 hoặc VNI sau đó dùng hàm UNC và hàm VNI để đổi về Unicode. Bạn download file tổi gửi về và xem các ví dụ test sẽ hiểu.
Tôi có viết hàm UniVba hỗ trợ cho việc nhập chuỗi Unicode vào VB Editor.
ví dụ bạn muốn Msgbox hiển thị câu tiếng Việt có nội dung “Xử lý tiếng Việt”. Bạn nhập vào 1 ô bất kỳ trên bảng tính (ví dụ A1) câu trên, tại 1 ô khác bạn nhập công thức =univba(A1), hàm sẽ cho kết quả:
"X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
bạn copy kết quả, vào VB Editor dán vào nơi cần nhập. Kết hợp với MsgBoxUni ta sẽ được hộp thoại có nội dung tiếng Việt Unicode.
Ví dụ: MsgboxUni "X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"

Mã:
[/FONT]
Function UniVba(TxtUni As String) As String
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
[FONT=Arial]
Bạn tham khảo thêm tại:
http://www.giaiphapexcel.com/forum/showpost.php?p=14579&postcount=1
 
Upvote 0
phamduylong đã viết:
Tôi có viết hàm UniVba hỗ trợ cho việc nhập chuỗi Unicode vào VB Editor.
ví dụ bạn muốn Msgbox hiển thị câu tiếng Việt có nội dung “Xử lý tiếng Việt”. Bạn nhập vào 1 ô bất kỳ trên bảng tính (ví dụ A1) câu trên, tại 1 ô khác bạn nhập công thức =univba(A1), hàm sẽ cho kết quả:
"X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
bạn copy kết quả, vào VB Editor dán vào nơi cần nhập. Kết hợp với MsgBoxUni ta sẽ được hộp thoại có nội dung tiếng Việt Unicode.
Ví dụ: MsgboxUni "X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"

Mã:
Function UniVba(TxtUni As String) As String
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
Bạn tham khảo thêm tại:
http://www.giaiphapexcel.com/forum/showpost.php?p=14579&postcount=1
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 ??

VD:
Trong VBE viết :
"Xử lý Tiếng Việt"---->MsgboxABCD-->" Xử lý tiếng Việt"

Thân!
 
Upvote 0
phamduylong đã viết:
Tôi có viết hàm UniVba hỗ trợ cho việc nhập chuỗi Unicode vào VB Editor.
ví dụ bạn muốn Msgbox hiển thị câu tiếng Việt có nội dung “Xử lý tiếng Việt”. Bạn nhập vào 1 ô bất kỳ trên bảng tính (ví dụ A1) câu trên, tại 1 ô khác bạn nhập công thức =univba(A1), hàm sẽ cho kết quả:
"X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
bạn copy kết quả, vào VB Editor dán vào nơi cần nhập. Kết hợp với MsgBoxUni ta sẽ được hộp thoại có nội dung tiếng Việt Unicode.
Ví dụ: MsgboxUni "X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"

Mã:
[/FONT]
Function UniVba(TxtUni As String) As String
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
[FONT=Arial]
Bạn tham khảo thêm tại:
http://www.giaiphapexcel.com/forum/showpost.php?p=14579&postcount=1

Vâng, như vậy là ta có thêm giải pháp nhập chuỗi vào hàm MsgBoxUni. Theo cách của bạn thì ta đã xử lý chuỗi về cách thể hiện Unicode nên lúc chạy sẽ nhanh hơn. Cảm ơn bạn.

Mr Okebab đã viết:
Phức tạp nhỉ :
...
Trong VBE viết :
"Xử lý Tiếng Việt"---->MsgboxABCD-->" Xử lý tiếng Việt"
Ta chỉ làm được điều trên nếu VBE hỗ trợ Unicode. Trong VB.NET thì làm thế được.

Trong VB.NET
Mã:
        MessageBox.Show("Xử lý Tiếng Việt")

Trong VB (kể cả các ngôn ngữ thông dụng khác như:Visual C++;Visual Foxpro; Delphi), làm việc với Unicode là cực kỳ phức tạp, thế nên các phần mềm của Việt Nam viết trước đây (của những công ty tin học có tên tuổi hẳn hoi) phần lớn không dùng Unicode mà toàn phải chỉnh lại font của hệ thống về dạng font VNI, TCVN(ABC).

Vấn đề Unicode trên VB khó khăn thế đấy, còn vấn đề Caption của Userform chưa hiện được, bác smbsolusion bảo chỉ mất có 5-6 dòng mà chưa thấy giải quyết gì? Khi dảnh tôi sẽ tìm cách viết, chỉ cần kỹ thuật Subclass chắc là Ok thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
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

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

Back
Top Bottom