Unicode tiếng Việt trong VBA Excel (1 người xem)

Liên hệ QC

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

phamduylong

-
Thành viên đã mất
Tham gia
30/12/06
Bài viết
918
Được thích
2,370
Nghề nghiệp
Giáo viên
Unicode bây giờ phải xác định là font chính khi nhập dữ liệu. Khổ nổi có một số ứng dụng chưa hỗ trợ tốt font này, trong đó có VBA Excel. Muốn VBA gởi vào ô B1 chuỗi "Lập trình với Excel" không đơn giản chút nào vì khi nhập Cells(1,2)="Lập trình với Excel" nó lại trở thành Cells(1,2)="L?p trình v?i Excel". Những dấu ? đó là những ký tự mà mã của nó vượt ngưỡng 255.
Vấn đề này nhiều bạn đã đưa lên diễn đàn nhưng ở nhiều bài khác nhau, tôi mở chuyên mục này để chúng ta cùng tham gia để có thể sử dụng Unicode đễ dàng hơn.
Qua học hỏi từ diễn đàn và vận dụng vào lập trình VBA Excel, tôi viết Unicode tiếng Việt bằng 3 cách. Xin nêu lên và các bạn bổ sung thêm:
1. Nhập chuỗi vào 1 ô trên vào bảng tính, viết lệnh truy xuất nó. Ví dụ nhập vào ô A1 của sheet2 câu trên. Câu lệnh viết:
Cells(1, 2) = Sheets("Sheet2").Cells(1,1)
Cách này đơn giản, nhưng bảng tính phải có 1 sheet chứa các chuỗi này. Nếu có ai đó chỉnh, xóa dữ liệu thì hỏng.
2. Dùng phép nối chuỗi và hàm ChrW để viết:
Câu trên viết thành:
Cells(1,2)= L" & ChrW(7853) & "p trình v" & ChrW(7899) & "i Excel"
Cách này rắc rối vì phải biết mã ậ=7953, ớ=7899, nhưng nó được viết ngay trong module, người sử dụng khó thay đổi được (bạn tham khảo bảng mã trong tập tin CodeUnicode.xls).
3. Dùng 1 hàm tự viết để hỗ trợ cách 2 (hàm UniVba). Cách sử dụng như sau:
- Nhập chuỗi cần viết vào 1 ô trong bàng tính. Ví dụ nhập vào ô A1 chuỗi “Xử lý tiếng Việt”.
- Ô B1 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"
Hàm UniVba dò tìm từng ký tự trong chuỗi, nếu ký tự nào có mã > 255 sẽ chuyển thành ChrW(mã) và ghép chúng bằng phép &.
Bạn copy ô B1 và dán vào module, rất nhanh và chính xác.
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
‘========
Các bạn tải tập tin CodeUnicode và UniVba về tham khảo.
 

File đính kèm

Dear phamduylong,
------------------
Em chưa hiểu lắm mục đích ứng dụng của UniVba và ảnh hưởng của nó tới Excel VBA.
Unicode tiếng Việt trong VBA Excel?
Đọc tên chủ đề dễ nhầm tưởng rằng trong môi trường lập trình Excel VBA chúng ta có thể sử dụng UNICODE - giống như môi trường DOT.NET?

Điều nữa là kết quả của hàm vẫn không thể xử lý được vấn đề cốt lõi (core) của VBA (phiên bản tính đến thời điểm này) là nó không được hỗ trợ UNICODE. Hãy quan sát kết quả tại Immediate
Windows:
?Univba(Range("A1"))
?"X" & ChrW(7917) & " l? ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
X? l? ti?ng Vi?t
Cái mà người lập trình VBA mong đợi là
?"X" & ChrW(7917) & " l? ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
Kết quả phải là:
Xử lý tiếng Việt
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chưa dùng Office 2007 nên không biết. Bạn nào dùng rồi làm ơn cho biết Office 2007 trong VBA có hỗ trợ UniCode không vậy ?
ThankS !
 
Upvote 0
Dear tedaynui,
--------------
Visual Basic for Applications tích hợp trong MS Excel 2007 vẫn là version 6.5 anh ạ!
Nghĩa là các phiên bản cho tới thời điểm này vẫn dùng chung một thư viện:
C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6.DLL

Hi vọng trong tương lai người lập trình có:
C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE7.DLL
và hỗ trợ hoàn toàn UNICODE
Nhưng em nghe nói Microsoft tuyên bố không hỗ trợ Visual Basic 6 nữa, không biết mấy ổng có quan tâm đến đề nghị của anh không!

Lập trình với Excel 2007, chúng ta chỉ quan tâm 2 thư viện cơ bản:
Microsoft Office 12.0 Object Library
trong: C:\Program Files\Common Files\Microsoft Shared\office12\mso.dll

Microsoft Excel 12.0 Object Library
trong: C:\Program Files\Microsoft Office\Office12\EXCEL.EXE
 
Lần chỉnh sửa cuối:
Upvote 0
To:Đào Việt Cường

Còn VSTO Tools For Office 2007 thì sao?

Lê Thanh Nhân
 
Upvote 0
Oh, Dear lethanhnhan
---------------------
VSTO là một lĩnh vực nâng cao rồi - đó là suy nghĩ của em khi mọi người đề cập vấn đề này trên www.webketoan.com - nơi hội tụ những kiến thức chuyên ngành tài chính - kế toán hơn là nơi để trao đổi những kinh nghiệm phát triển ứng dụng.

Nhưng với www.Giaiphapexcel.com, em tin rằng một ngày nào đó VSTO sẽ trở thành đối tượng nghiên cứu chủ đạo của diễn đàn.

Những điều mà VSTO có thể đem lại (the sự hiểu biết có giới hạn của em):
- Hỗ trợ hoàn toàn UNICODE
- Khai thác tối đa sức mạnh của .NET (Microsoft .NET Framework)
- Tạo ra ứng dụng Office chuyên nghiệp.
Tuy nhiên muốn tiếp cập được với VSTO, người lập trình phải có kiến thức nhất định về Visual Studio .Net. Theo em, một khi đã có những kiến thức nền tảng căn bản về Visual Studio thì lập trình VSTO không khác gì lập trình VBA. Cái khó khăn của người lập trình không chuyên là làm sao lĩnh hội được cái "nền tảng căn bản" đó!
Có vẻ như sắp lạc đề, em xin nhường lời cho hai chuyên gia TuanVNUNI và anh LeVanDuyet trong một chủ đề khác về VSTO.
 
Upvote 0
Cám ơn bác Long đã đưa ra các biện pháp xử lý font Unicode.

Liệu có cách nào có thể hiện tiếng Việt trong Msgbox và Inputbox không (ngoài cách của anh Tuân) hả bác?
 
Upvote 0
Đào Việt Cường đã viết:
Unicode tiếng Việt trong VBA Excel?
Đọc tên chủ đề dễ nhầm tưởng rằng trong môi trường lập trình Excel VBA chúng ta có thể sử dụng UNICODE - giống như môi trường DOT.NET?
Các phiên bản từ Excel 2000 về sau hỗ trợ tương đối tốt UniTV (UNICODE tiếng Việt) chứ không như bạn Cường nhận xét.
Có nhiều ứng dụng hỗ trợ UNI tiếng Việt cho Excel được viết hoàn toàn bằng VBA Excel (chuyển qua lại giữa các bảng mã, đọc số tiếng Việt, sắp xếp tiếng Việt,..) mà khi nó hoạt động, giao diện của nó thể hiện bằng UniTV rất đẹp không khác các ứng dụng của Windows. VNI Windows, ABC thể hiện trên Form không thể sánh bằng UniTV. Các bạn có thể tải TVEXCEL01 về để thấy việc hỗ trợ UniTV của VBA Excel.
Tuy nhiên, không phải 100% là tốt. Các đối tượng trong Form như Lable, TextBox, ListBox, ComboBox, … đều thể hiện tốt UniTV nhưng còn một vài trở ngại như: Caption của Form, không nhập được UniTV. Các thuộc tính trong Properties như Caption (của Lable, CommandButton), Value (của TextBox, ListBox), … không cho nhập trực tiếp UniTV nhưng có thể gán UniTV khi chương trình chạy bằng cách viết lệnh trong Module. Các hộp thoại của InputBox, MsgBox không thể hiện được tiếng Việt (tôi chưa biết cách làm, không biết Excel 2007 có tiến bộ hơn không vì tôi chưa sử dụng).
Một trở ngại lớn nhất là không thể viết UniTV trực tiếp trên module được (nhưng các bảng mã như VNI Windows, ABC thì được). VBA có hàm ChrW dùng để chuyển mã UNICODE sang ký tự, tôi nêu vấn đề nhằm mục đích tìm cách nào nhập UniTV trong VBA Excel thuận lợi và chính xác hơn.
Việc viết UniTV ứng dụng rất nhiều trong Excel vì bây giờ UNICODE được xem như là font chuẩn của VN. Tôi đưa 2 ví dụ nhỏ:

1. Viết thủ tục để ghi vào các ô A1, A2, …, A7 các chuỗi UNICODE “Thứ hai”, “Thứ ba”, …, “Chủ nhật”
Sub ThuVN()
Cells(1, 1) = "Th" & ChrW(7913) & " hai"
Cells(2, 1) = "Th" & ChrW(7913) & " ba"
Cells(3, 1) = "Th" & ChrW(7913) & " t" & ChrW(432)
Cells(4, 1) = "Th" & ChrW(7913) & " n" & ChrW(259) & "m"
Cells(5, 1) = "Th" & ChrW(7913) & " sáu"
Cells(6, 1) = "Th" & ChrW(7913) & " b" & ChrW(7843) & "y"
Cells(7, 1) = "Ch" & ChrW(7911) & " nh" & ChrW(7853) & "t"
End Sub

Thay vì nhập “Chủ nhật”, phải nhập là "Ch" & ChrW(7911) & " nh" & ChrW(7853) & "t" thật rắc rối và chắc chắn phải có sai ! Hàm UniVba sẽ giúp chúng ta viết nhanh những chuỗi đó.

2. Viết hàm NGAYUNI(ngay) để chuyển 1 ngày trong ô thành thứ, ngày, tháng, năm. Ví dụ ô A10 có giá trị là ngày “2/6/2007”, ô D10 nhập công thức =NGAYUNI(A10) sẽ cho kết quả:
“Thứ bảy, ngày 02 tháng 06 năm 2007” bằng UNICODE TIẾNG Việt.

Function NGAYUNI(ngay)
dd = Day(ngay)
mm = Month(ngay)
yy = Year(ngay)
thu = Weekday(ngay)
Select Case thu
Case 1
thu = "Ch" & ChrW(7911) & " nh" & ChrW(7853) & "t"
Case 2
thu = "Th" & ChrW(7913) & " hai"
Case 3
thu = "Th" & ChrW(7913) & " ba"
Case 4
thu = "Th" & ChrW(7913) & " t" & ChrW(432)
Case 5
thu = "Th" & ChrW(7913) & " n" & ChrW(259) & "m"
Case 6
thu = "Th" & ChrW(7913) & " sáu"
Case 7
thu = "Th" & ChrW(7913) & " b" & ChrW(7843) & "y"
End Select
NGAYUNI = thu & ", ngày " & Format(dd, "00") & " tháng " & Format(mm, "00") & " n" & ChrW(259) & "m " & yy
End Function
‘================

Dưới đây là hàm NGAYVNI, NGAYABC cũng tương tự như NGAYUNI nhưng viết cho VNI Windows và ABC, cách viết đơn giản hơn nhiều.
‘==============
Function NGAYVNI(ngay)
dd = Day(ngay)
mm = Month(ngay)
yy = Year(ngay)
thu = Weekday(ngay)
Select Case thu
Case 1
thu = "Chuû nhaät"
Case 2
thu = "Thöù hai"
Case 3
thu = "Thöù ba"
Case 4
thu = "Thöù tö"
Case 5
thu = "Thöù naêm"
Case 6
thu = "Thöù saùu"
Case 7
thu = "Thöù baûy"
End Select
NgayVni = thu & ", ngaøy " & Format(dd, "00") & " thaùng " & Format(mm, "00") & " naêm " & yy
End Function

‘====================
Function NGAYABC(ngay)
dd = Day(ngay)
mm = Month(ngay)
yy = Year(ngay)
thu = Weekday(ngay)
Select Case thu
Case 1
thu = "Chñ nhËt"
Case 2
thu = "Thø hai"
Case 3
thu = "Thø ba"
Case 4
thu = "Thø t&shy;"
Case 5
thu = "Thø n¨m"
Case 6
thu = "Thø s¸u"
Case 7
thu = "Thø b¶y"
End Select
NGAYABC = thu & ", ngµy " & Format(dd, "00") & " th¸ng " & Format(mm, "00") & " n¨m " & yy
End Function
‘=============

Theo tôi biết, hiện nay dân Excel vẫn còn sử dụng Vni Windows, ABC nhiều. Các bài Excel tải lên Giai phapExcel cũng vậy. Qua tìm hiểu, nguyên nhân họ không muốn chuyển qua UNICODE là vì:
- Các dữ liệu cũ còn đó, phải nhập tiếp thôi. Qua UNICODE lại rối với 2 bảng mã.
- Công cụ hỗ trợ cho UNICODE trên Excel còn quá ít, chưa tạo được động cơ để họ chuyển qua UNICODE.
Qua diễn đàn này, chúng ta cùng nhau tạo những công cụ tốt hơn cho UNICODE tiếng Việt để cư dân Excel sử dụng thống nhất UNICODE cho các bảng tính Excel.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Có hàm nào dùng cho Msgbox mà gõ Unicode không bác ?? Khi hiển thị ra cũng là TV luôn.
Cảm ơn nhiều!

Thân!
 
Upvote 0
Có đoạn
Mã:
Dim lenh1 As CommandBarButton
Dim cb As CommandBar
Application.CommandBars.Add(Name:="vidu_toolbar").Visible = True
With Application.CommandBars("vidu_toolbar")
    .Position = msoBarTop
    .Protection = msoBarNoCustomize
End With
Set lenh1 = Application.CommandBars("vidu_toolbar").Controls.Add(Type:=msoControlButton)
With lenh1
    .style = msoButtonIconAndCaption
    .FaceId = 293 
    .Caption = "   Xoá dòng"
    .OnAction = "sheet1.xoa"
End With
Hiện tượng xảy ra như sau: 2 máy cùng sử dụng VietKey (cài đặt từ cùng 1 bộ setup) nhưng "Xoá dòng" ở 2 máy hiển thị khác nhau.
Xin các bạn giải thích và cho cách khắc phục.
(Cho biết: UniVba("Xoá dòng")="Xoá dòng")
 
Upvote 0
chibi đã viết:
Có đoạn
Mã:
Dim lenh1 As CommandBarButton
Dim cb As CommandBar
Application.CommandBars.Add(Name:="vidu_toolbar").Visible = True
With Application.CommandBars("vidu_toolbar")
    .Position = msoBarTop
    .Protection = msoBarNoCustomize
End With
Set lenh1 = Application.CommandBars("vidu_toolbar").Controls.Add(Type:=msoControlButton)
With lenh1
    .style = msoButtonIconAndCaption
    .FaceId = 293 
    .Caption = "   Xoá dòng"
    .OnAction = "sheet1.xoa"
End With
Hiện tượng xảy ra như sau: 2 máy cùng sử dụng VietKey (cài đặt từ cùng 1 bộ setup) nhưng "Xoá dòng" ở 2 máy hiển thị khác nhau.
Xin các bạn giải thích và cho cách khắc phục.
(Cho biết: UniVba("Xoá dòng")="Xoá dòng")

Bạn hãy vào Control Panel->Display->Appearance->Advanced chỉnh CAPTION thống nhất cả hai máy.
 
Upvote 0
Tôi thấy bạn Đào Việt Cường có làm 1 file về PicForm... trong file này nếu ta bấm vào dấu X thì 1 MsgBox tiếng Việt hiện ra...
Hình như là dùng các hàm Macro 4 thì phải
Tuy nhiên tôi xem hoài mà vẩn chưa am tường được điểm mấu chốt trong đó
Các bạn xem thử
Nếu có thể được nhờ bạn Đào Việt Cường hướng dẩn giúp 1 file ví dụ đơn giãn nhất về MsgBox tiếng Việt này
Cảm ơn!
 

File đính kèm

Upvote 0
Dear ndu96081631,
-------------------
Sẽ là lạc đề nếu như thảo luận vấn đề anh nêu trong chủ đề này. Tuy nhiên xét thấy vấn đề cũng có liên quan một chút đến "Unicode tiếng Việt trong VBA" nên em trả lời luôn ở đây vậy:

Mấu chốt là ở đây ạ:

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address <> "$G$1" Then Exit Sub
If ALERT(Evaluate(Application.Names("MsgExit").RefersToR1C1), 1) = False Then Exit Sub
txbPassword.Value = Null
ThisWorkbook.Close True
End Sub

Anh lưu ý ALERT là một hàm tự tạo trong Module1. Và đúng như theo dự đoán của anh, thủ tục có sử dụng lệnh ExecuteExcel4Macro để thi hành lệnh (hàm) macro4 có tên là "ALERT". Đây là hàm macro4 tương tự như hàm MsgBox trong VBA, khác là nó có hỗ trợ UNICODE. Tham số quan trọng của hàm này là sPrompt. Đây là chuỗi thông điệp UNICODE. Trong thủ tục sự kiện trên, tham số này được lấy từ name MsgExit (ấn Ctrl+F3 để xem name này).

Như vậy qua ví dụ minh họa này chúng ta cũng có thể biết thêm về cách thực thi một lệnh Macro4 thông qua VBA như thế nào, có phải không ạ!
 
Upvote 0
Dear ndu96081631,
-------------------
Sẽ là lạc đề nếu như thảo luận vấn đề anh nêu trong chủ đề này. Tuy nhiên xét thấy vấn đề cũng có liên quan một chút đến "Unicode tiếng Việt trong VBA" nên em trả lời luôn ở đây vậy:

Mấu chốt là ở đây ạ:

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address <> "$G$1" Then Exit Sub
If ALERT(Evaluate(Application.Names("MsgExit").RefersToR1C1), 1) = False Then Exit Sub
txbPassword.Value = Null
ThisWorkbook.Close True
End Sub
Anh lưu ý ALERT là một hàm tự tạo trong Module1. Và đúng như theo dự đoán của anh, thủ tục có sử dụng lệnh ExecuteExcel4Macro để thi hành lệnh (hàm) macro4 có tên là "ALERT". Đây là hàm macro4 tương tự như hàm MsgBox trong VBA, khác là nó có hỗ trợ UNICODE. Tham số quan trọng của hàm này là sPrompt. Đây là chuỗi thông điệp UNICODE. Trong thủ tục sự kiện trên, tham số này được lấy từ name MsgExit (ấn Ctrl+F3 để xem name này).

Như vậy qua ví dụ minh họa này chúng ta cũng có thể biết thêm về cách thực thi một lệnh Macro4 thông qua VBA như thế nào, có phải không ạ!
Hơi bị cao siêu đây!
Hy vọng khi tôi bứt cở vài chục ngàn cọng tóc thì sẽ hiểu được vấn đề... +-+-+-+
Còn nữa: Có lẽ cũng hơi lạc đề khi đề cập vào topic này, nhưng hy vọng nhân tiện bạn giãi đáp luôn (hoặc chỉ tôi tài liệu có liên quan cũng được)
Đó là tôi thấy trong phần khai báo biến:
Cái dấu $ này mang ý nghĩa gì vậy?
Mong bạn giúp!
Chân thành cảm ơn!
 
Upvote 0
The codes for String characters range from 0–255. The first 128 characters (0–127) of the character set correspond to the letters and symbols on a standard U.S. keyboard. These first 128 characters are the same as those defined by the ASCII character set. The second 128 characters (128–255) represent special characters, such as letters in international alphabets, accents, currency symbols, and fractions. The type-declaration character for String is the dollar sign ($).
 
Upvote 0
Unicode trong VBA giờ đây không còn là vấn đề gì to tát cả các bác ạ, có chăng là việc không gõ chuỗi Unicode trực tiếp trong VBE mà thôi, but chúng ta đã có worksheet, dùng nó để lưu chuỗi Unicode cơ mà!
Nếu các bác chịu đọc những cái em viết thì sẽ thấy Unicode hay những thứ được gọi là khó cũng bình thường thôi mà.
http://www.giaiphapexcel.com/forum/showthread.php?t=16802
From ThachNQ:
Thanks các bác
Thêm một kinh nghiệm về Uni
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Unicode trong VBA giờ đây không còn là vấn đề gì to tát cả các bác ạ, có chăng là việc không gõ chuỗi Unicode trực tiếp trong VBE mà thôi, but chúng ta đã có worksheet, dùng nó để lưu chuỗi Unicode cơ mà!
Nếu các bác chịu đọc những cái em viết thì sẽ thấy Unicode hay những thứ được gọi là khó cũng bình thường thôi mà.
http://www.giaiphapexcel.com/forum/showthread.php?t=16802

Với hàm UniVBA và UniVBAT thì việc gõ chuỗi trực tiếp trên VBA cũng không còn là vấn đề khó khăn nữa. Các bạn xem UniVBA và MsgUni tại đây :
http://www.giaiphapexcel.com/forum/showthread.php?t=17469
 
Upvote 0
Cần giúp đỡ chuyển đổi sang Unicode

Mình có 1 file .xla đã được ai đó viết sẵn. Hiện mình có nhu cầu chuyển sang Unicode nhưng đọc hết bài trên mà vẫn không làm được. Vì vậy mình xin đính kèm file lên mong được mọi người chuyển sang Unicode giúp. Chương trình này là chương trình đọc số. Ví dụ nhập công thức: =vnd(2011) thì sẽ đọc thành Hai ngàn không trăm mười một.

Cám ơn mọi người trước. Do đính kèm file .xla không được nên mình ZIP lại.
 

File đính kèm

Upvote 0
Unicode bây giờ phải xác định là font chính khi nhập dữ liệu. Khổ nổi có một số ứng dụng chưa hỗ trợ tốt font này, trong đó có VBA Excel. Muốn VBA gởi vào ô B1 chuỗi "Lập trình với Excel" không đơn giản chút nào vì khi nhập Cells(1,2)="Lập trình với Excel" nó lại trở thành Cells(1,2)="L?p trình v?i Excel". Những dấu ? đó là những ký tự mà mã của nó vượt ngưỡng 255.
Vấn đề này nhiều bạn đã đưa lên diễn đàn nhưng ở nhiều bài khác nhau, tôi mở chuyên mục này để chúng ta cùng tham gia để có thể sử dụng Unicode đễ dàng hơn.
Qua học hỏi từ diễn đàn và vận dụng vào lập trình VBA Excel, tôi viết Unicode tiếng Việt bằng 3 cách. Xin nêu lên và các bạn bổ sung thêm:
1. Nhập chuỗi vào 1 ô trên vào bảng tính, viết lệnh truy xuất nó. Ví dụ nhập vào ô A1 của sheet2 câu trên. Câu lệnh viết:
Cells(1, 2) = Sheets("Sheet2").Cells(1,1)
Cách này đơn giản, nhưng bảng tính phải có 1 sheet chứa các chuỗi này. Nếu có ai đó chỉnh, xóa dữ liệu thì hỏng.
2. Dùng phép nối chuỗi và hàm ChrW để viết:
Câu trên viết thành:
Cells(1,2)= L" & ChrW(7853) & "p trình v" & ChrW(7899) & "i Excel"
Cách này rắc rối vì phải biết mã ậ=7953, ớ=7899, nhưng nó được viết ngay trong module, người sử dụng khó thay đổi được (bạn tham khảo bảng mã trong tập tin CodeUnicode.xls).
3. Dùng 1 hàm tự viết để hỗ trợ cách 2 (hàm UniVba). Cách sử dụng như sau:
- Nhập chuỗi cần viết vào 1 ô trong bàng tính. Ví dụ nhập vào ô A1 chuỗi “Xử lý tiếng Việt”.
- Ô B1 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"
Hàm UniVba dò tìm từng ký tự trong chuỗi, nếu ký tự nào có mã > 255 sẽ chuyển thành ChrW(mã) và ghép chúng bằng phép &.
Bạn copy ô B1 và dán vào module, rất nhanh và chính xác.
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
‘========
Các bạn tải tập tin CodeUnicode và UniVba về tham khảo.

Cho mình hỏi, có cách nào đọc ngược lai không, xin giúp đỡ
VD: ngày tháng n" & ChrW(259) & "m ===> ngày tháng năm
[TABLE="width: 133"]
[TR]
[TD="class: xl65, width: 133"][/TD]
[/TR]
[/TABLE]
 
Upvote 0
Upvote 0
Dear

Hiện tại các lable hay text thì e dùng hàm trên OK, xuất được tiếng việt, nhưng khi đặt cho form thì cũng bị lỗi, nhờ ad xem lại thử
View attachment 220073
Thử đoạn code này của anh @Nguyễn Duy Tuân thử xem được không?
Mã:
Option Explicit
Private Const WM_SETTEXT = &HC
#If Win64 Then
    Declare PtrSafe Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Private Sub UserForm_Initialize()
    Dim hwnd&, sUnicode$
    hwnd = FindWindow("ThunderDFrame", Caption)  ' Tim HWnd cua UserForm
    sUnicode = "L" & ChrW(7863) & "p l" & ChrW(7841) & "i tiêu " & ChrW(273) & ChrW(7873) & " cho dòng d" & ChrW(7919) & " li" & ChrW(7879) & "u"
    DefWindowProc hwnd, WM_SETTEXT, 0, StrPtr(sUnicode)
End Sub
 
Upvote 0
Thử đoạn code này của anh @Nguyễn Duy Tuân thử xem được không?
Mã:
Option Explicit
Private Const WM_SETTEXT = &HC
#If Win64 Then
    Declare PtrSafe Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Private Sub UserForm_Initialize()
    Dim hwnd&, sUnicode$
    hwnd = FindWindow("ThunderDFrame", Caption)  ' Tim HWnd cua UserForm
    sUnicode = "L" & ChrW(7863) & "p l" & ChrW(7841) & "i tiêu " & ChrW(273) & ChrW(7873) & " cho dòng d" & ChrW(7919) & " li" & ChrW(7879) & "u"
    DefWindowProc hwnd, WM_SETTEXT, 0, StrPtr(sUnicode)
End Sub
Dear Ad
Sau khi thử đoạn đó vào thì khi chạy báo lỗi này
220079
 
Upvote 0
Office bác này là 64bit, nên khai báo trên thiếu từ khóa Private.
Bác add thêm Private và trước Declare 2 dòng đó
 
Upvote 0
À máy tôi Win7 32, Office 32bit 2007, chạy đoạn code của bác Tuân cũng không ra. Test với hàm API IsWindowUnicode thì ra FALSE (0), tức Ansi Window
Bạn giaiphap dùng Office gì vậy, chạy giúp tôi đoạn code này thử
Mã:
Private Const WM_SETTEXT = &HC
#If VBA7 Then
    Private Declare PtrSafe Function DefWindowProc Lib "user32" Alias "DefWindowProcW" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function IsWindowUnicode Lib "USER32" (ByVal hWnd As LongPtr) As Long
#Else
    Private Declare Function DefWindowProc Lib "USER32" Alias "DefWindowProcW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function IsWindowUnicode Lib "USER32" (ByVal hWnd As Long) As Long
#End If

Private Sub TestSetUniCaption()
#If VBA7 Then
    Dim hWnd As LongPtr
#Else
    Dim hWnd As Long
#End If
    Dim sUnicode As String
   
    hWnd = FindWindow("ThunderDFrame", Caption)  ' Tim HWnd cua UserForm
    MsgBox IsWindowUnicode(hWnd)
   
    sUnicode = "L" & ChrW(7863) & "p l" & ChrW(7841) & "i tiêu " & ChrW(273) & ChrW(7873) & " cho dòng d" & ChrW(7919) & " li" & ChrW(7879) & "u"
    DefWindowProc hWnd, WM_SETTEXT, 0, StrPtr(sUnicode)
End Sub
 
Upvote 0
À máy tôi Win7 32, Office 32bit 2007, chạy đoạn code của bác Tuân cũng không ra. Test với hàm API IsWindowUnicode thì ra FALSE (0), tức Ansi Window
Bạn giaiphap dùng Office gì vậy, chạy giúp tôi đoạn code này thử
Mã:
Private Const WM_SETTEXT = &HC
#If VBA7 Then
    Private Declare PtrSafe Function DefWindowProc Lib "user32" Alias "DefWindowProcW" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function IsWindowUnicode Lib "USER32" (ByVal hWnd As LongPtr) As Long
#Else
    Private Declare Function DefWindowProc Lib "USER32" Alias "DefWindowProcW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function IsWindowUnicode Lib "USER32" (ByVal hWnd As Long) As Long
#End If

Private Sub TestSetUniCaption()
#If VBA7 Then
    Dim hWnd As LongPtr
#Else
    Dim hWnd As Long
#End If
    Dim sUnicode As String
  
    hWnd = FindWindow("ThunderDFrame", Caption)  ' Tim HWnd cua UserForm
    MsgBox IsWindowUnicode(hWnd)
  
    sUnicode = "L" & ChrW(7863) & "p l" & ChrW(7841) & "i tiêu " & ChrW(273) & ChrW(7873) & " cho dòng d" & ChrW(7919) & " li" & ChrW(7879) & "u"
    DefWindowProc hWnd, WM_SETTEXT, 0, StrPtr(sUnicode)
End Sub
Win và Office đều 32bit, kết quả hiển thị tiêu đề Unicode được nhưng hàm IsWindowUnicode kết quả bằng 0.
 
Upvote 0
Lạ ta, Office bạn ver mấy ? VBA bạn là VBA7 hay 6, file fm20.dll trong %Windows%\System32 có version là bao nhiêu ? Xem giúp mình ?
Mình Office2007, VBA6, FM20.dll có ver là 12.0.4518.1014
 
Upvote 0
Bạn debug giúp mình, xem kỹ là DefWindowProcW hay DefWindowProcA, code của bác Tuan đấy
 
Upvote 0
Hi Ad
220086
Hinh 1 là hình em đã đã những khai báo vào Module, kết quả ko báo lỗi nữa
220087
Hình anh là e copy đoạn của ad (dòng đặt tên cho tiêu đề của form) thì bị báo lỗi như vậy
 
Upvote 0
Upvote 0
Phải chỉnh lại vì Office của bạn ấy là 64bit, khai báo hwnd as Long sẽ bị báo lỗi Type mismatch. Phải là LongPtr
Sữa lại thành giống code tui vừa post
Bài đã được tự động gộp:

Code của bác Tuân lúc đầu cả 2 đều là DefWindowProcA
 
Upvote 0
Thử đoạn code này của anh @Nguyễn Duy Tuân thử xem được không?
Mã:
Option Explicit
Private Const WM_SETTEXT = &HC
#If Win64 Then
    Declare PtrSafe Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Private Sub UserForm_Initialize()
    Dim hwnd&, sUnicode$
    hwnd = FindWindow("ThunderDFrame", Caption)  ' Tim HWnd cua UserForm
    sUnicode = "L" & ChrW(7863) & "p l" & ChrW(7841) & "i tiêu " & ChrW(273) & ChrW(7873) & " cho dòng d" & ChrW(7919) & " li" & ChrW(7879) & "u"
    DefWindowProc hwnd, WM_SETTEXT, 0, StrPtr(sUnicode)
End Sub

Hình như có lỗi thật. Các bạn tìm hiểu tiếp xem? Mình đang ngoài đường nên chưa tìm lại lý do được.
 
Upvote 0
Không được bạn, mình đã thử rồi mới đăng lên đây. Máy hiện tại tại VP mình đang ngồi là Offcie 2007, 32bit, Win7
Bạn up giúp mình file FM20.dll trong thư mục Windows System32 của bạn nhé. Để tối về mình RE và compare xem sao.
 

File đính kèm

  • 1.png
    1.png
    7.4 KB · Đọc: 25
Upvote 0
Không được bạn, mình đã thử rồi mới đăng lên đây. Máy hiện tại tại VP mình đang ngồi là Offcie 2007, 32bit, Win7
Bạn up giúp mình file FM20.dll trong thư mục Windows System32 của bạn nhé. Để tối về mình RE và compare xem sao.
File đây bạn.
 

File đính kèm

Upvote 0
Lạ nhỉ, mình đã thay FM20.dll trên máy mình bằng FM20.dll của bạn, vẫn chạy không ra.
FM20.dll của bạn ver là: 14.0.4747.1000
UserForm hoạt động độc lập với VBA và Office mà ta, không lý còn tầng nào đó mà FM20.dll phải đi qua à ?
 
Upvote 0
Lạ nhỉ, mình đã thay FM20.dll trên máy mình bằng FM20.dll của bạn, vẫn chạy không ra.
FM20.dll của bạn ver là: 14.0.4747.1000
UserForm hoạt động độc lập với VBA và Office mà ta, không lý còn tầng nào đó mà FM20.dll phải đi qua à ?
Thử test lại file này xem sao.
 

File đính kèm

Upvote 0
Hì hì, tìm ra lý do rồi, do Theme API của Windows. Để desktop về theme Windows Classis thì sẽ không được, do Windows dùng Ansi API để xử lý các non Unicode Window. Còn có theme thì Windows dùng Theme API Unicode cho tất cả các Window.
PS: Ủa, admin xem lại giúp cu anh tui cái, tui có 4 cái sao mà sao giờ đâu biến mất tiêu hết rầu :)
 

File đính kèm

  • 1.png
    1.png
    77.8 KB · Đọc: 63
  • 2.png
    2.png
    63.3 KB · Đọc: 62
Lần chỉnh sửa cuối:
Upvote 0
Hì hì, thank befaint, em thấy sao lại rồi :)
File Caption Unicode up lần sau của bác giaiphap, các bác test giùm cu anh em đoạn code sau cái.
Mã:
Option Explicit

Private Sub UserForm_Initialize()
    Dim strUniCaption As String
    
    strUniCaption = "L" & ChrW(7863) & "p l" & ChrW(7841) & "i tiêu " & ChrW(273) & ChrW(7873) & " cho dòng d" & ChrW(7919) & " li" & ChrW(7879) & "u"
    SetUniText Me, strUniCaption
    
    MsgBox Me.Caption
    MsgBox StrComp(Me.Caption, strUniCaption, vbTextCompare)
    MsgBox StrComp(Me.Caption, strUniCaption, vbBinaryCompare)
End Sub
Nghi là do ông ClearType font của Quýnh đâu can thiệp nữa.
Cái vụ Caption UserForm này còn dài dài, nhiều chuyện để moi đây.
 
Lần chỉnh sửa cuối:
Upvote 0
Up cái mới sữa :)
 
Upvote 0
Cảm ơn befaint, giống máy tôi, -1 hết. Ông nội nào đã change cái text Caption đây ?
 
Upvote 0
Mã:
Option Explicit

Private Sub UserForm_Initialize()
    Dim strUniCaption As String
  
    strUniCaption = "L" & ChrW(7863) & "p l" & ChrW(7841) & "i tiêu " & ChrW(273) & ChrW(7873) & " cho dòng d" & ChrW(7919) & " li" & ChrW(7879) & "u"
    SetUniText Me, strUniCaption
  
    MsgBox Me.Caption
    MsgBox StrComp(Me.Caption, strUniCaption, vbTextCompare)
    MsgBox StrComp(Me.Caption, strUniCaption, vbBinaryCompare)
End Sub
Nghi là do ông ClearType font của Quýnh đâu can thiệp nữa.
Cái vụ Caption UserForm này còn dài dài, nhiều chuyện để moi đây.

[/CODE]
Nghi là do ông ClearType font của Quýnh đâu can thiệp nữa.
Cái vụ Caption UserForm này còn dài dài, nhiều chuyện để moi đây.

Me.Caption luôn trả vể AnsiString. Kể cả dùng các hàm API GetWindowTextW (unicode) để lấy text cũng chỉ ra AnsiString. Mặc dù vậy, trong handle của userform này luôn lưu chuỗi unicode cho Caption từ lúc chạy DefWindowProcW. Bạn luôn coi Caption của userform chính là chuối strUniCaption mà đã nhồi vào bởi DefWindowProcW trước đó.

Vụ này mình làm nhiều năm trước và chỉ dừng lại ở việc tạo unicode trên title của userform. Việc Theme Windows là classic sẽ không thể hiển thị unicode thì chưa tìm được cách nào khác đơn giản. Lập trình kỳ công hơn thì vẫn có thể viết được unicode trên Title của userform nhưng chắc là không đáng để lao công khổ tứ, vì dù hiển thị được thì còn phải làm quá nhiều thứ nữa khi người dùng đổi Theme hoặc vào "Advance Appearance" chỉnh sửa tùm lum để đảm bảo việc hiển thị nó luôn cân đối.
 
Upvote 0
Làm cách nào bác Tuân biết UserForm Caption get property trả về Ansi string vậy bác ? Bác đã từng debug vào đó chưa ?
 
Upvote 0
Làm cách nào bác Tuân biết UserForm Caption get property trả về Ansi string vậy bác ? Bác đã từng debug vào đó chưa ?

Userform tạo ra từ hàm CreateWindowA nên handle của nó không phải unicode (dùng hàm IsUnicodeWindow là thấy). Khi handle không phải unicode thì các hàm API đi theo nó trong thủ tục chính WndProc làm theo Ansi - Người lập trình có thể dùng phương pháp Subclass để hack vào trong này để thay đổi... Theo chuẩn gọi API thì Userform.Caption thì bên trong mấy anh lập trình sẽ dùng hàm GetWindowTextA (vì handle không phải unicode) để trả về cho property_get gọi nó. Các cách lấy text của handle hệ thống làm bên trong là SendMessage(,.. ,WM_GETTEXT,...), khi đó thằng WndProc nhận thông điệp WM_GETTEXT để trả về,....
 
Upvote 0
Lý thuyết lập trình là vậy, nhưng internal của UserForm (FM20.dll) làm sao thì phải "rờ em" nó mới biết chứ, đâu nói không vậy được.
 
Upvote 0
Upvote 0
em mới tìm hiểu VBA đọc từ trên xuống mà vẫn không biết làm sao để đưa tiếng việt vào msgbox trong uhm, mong các anh chị chỉ bảo dễ hiểu để em làm theo với ạ. xin cảm ơn anh chị đã chia sẻ?
 
Upvote 0
em mới tìm hiểu VBA đọc từ trên xuống mà vẫn không biết làm sao để đưa tiếng việt vào msgbox trong uhm, mong các anh chị chỉ bảo dễ hiểu để em làm theo với ạ. xin cảm ơn anh chị đã chia sẻ?
Bạn tìm hiểu bài của anh @Hoàng Trọng Nghĩa ở đây.
 
Upvote 0
...................................................
PS: Ủa, admin xem lại giúp cu anh tui cái, tui có 4 cái sao mà sao giờ đâu biến mất tiêu hết rầu.
Vào Thông tin tài khoản > Tiêu đề riêng xóa dòng Mới học Ét xeo thì nó hiện 4 cái sao trở lại.
 
Upvote 0
Hì hì, tìm ra lý do rồi, do Theme API của Windows. Để desktop về theme Windows Classis thì sẽ không được, do Windows dùng Ansi API để xử lý các non Unicode Window. Còn có theme thì Windows dùng Theme API Unicode cho tất cả các Window.
PS: Ủa, admin xem lại giúp cu anh tui cái, tui có 4 cái sao mà sao giờ đâu biến mất tiêu hết rầu :)
Bác cho em hỏi cái này thì vào chỗ nào để sửa ?
 
Upvote 0
Tôi đang tạo một UserForm chạy trên VBA7 và Win64 với chức năng hiển thị form Min, Max, Resize, và tôi cho nó thêm caption tiếng Việt.
Tất cả đều OK, tuy nhiên một vấn đề khác mà tôi không khắc phục được đó là nếu thủ tục tạo Caption tiếng Việt được kích hoạt thì nó không show form Max khi load lên, ngược lại, bỏ câu lệnh đó thì nó show được form Max! Nhờ các anh chị hướng dẫn khắc phục giúp.

Thủ tục tạo UserForm có 3 nút Close, Max, Min & Normal:
Mã:
Sub CreateMaxMinResizeForm(ByVal lngFrmWndHdl)
    Dim lngStyle
    lngStyle = GetWindowLongPtr(lngFrmWndHdl, GWL_STYLE)
    lngStyle = lngStyle Or WS_SYSMENU       'Add SystemMenu
    lngStyle = lngStyle Or WS_MINIMIZEBOX   'Add MinimizeBox
    lngStyle = lngStyle Or WS_MAXIMIZEBOX   'Add MaximizeBox
    lngStyle = lngStyle + (WS_THICKFRAME)
    SetWindowLongPtr lngFrmWndHdl, GWL_STYLE, lngStyle
    DrawMenuBar lngFrmWndHdl
End Sub

Thủ tục Unicode trên Caption của UserForm:
Mã:
Sub SetUniCaption(ByVal usfHwnd, ByVal UnicodeString As String)
    DefWindowProc usfHwnd, WM_SETTEXT, 0, StrPtr(UnicodeString)
End Sub

Các sự kiện trong UserForm:
Mã:
Private hwnd

''Thủ tục show form Max:
Private Sub UserForm_Activate()
    ShowWindow FindWindowA(vbNullString, Me.Caption), Show_MAXIMIZE
End Sub

Private Sub UserForm_Initialize()
    hwnd = FindWindow("ThunderDFrame", Me.Caption)
    ''The same:
    'hwnd = FindWindowA(vbNullString, Me.Caption)
   
    Dim strFormCaption As String
    strFormCaption = "  HOÀNG TR" & ChrW(7884) & "NG NGH" & ChrW(296) & "A, Phone: 0938.520.520, Mail: NghiaCSG@gmail.com"
    CreateMaxMinResizeForm hwnd

    ''Tai sao co dong duoi day thi khi load form khong the show max form duoc?

    SetUniCaption hwnd, strFormCaption
End Sub
 

File đính kèm

Upvote 0
Tôi đang tạo một UserForm chạy trên VBA7 và Win64 với chức năng hiển thị form Min, Max, Resize, và tôi cho nó thêm caption tiếng Việt.
Tất cả đều OK, tuy nhiên một vấn đề khác mà tôi không khắc phục được đó là nếu thủ tục tạo Caption tiếng Việt được kích hoạt thì nó không show form Max khi load lên, ngược lại, bỏ câu lệnh đó thì nó show được form Max! Nhờ các anh chị hướng dẫn khắc phục giúp
Tôi đã nói không biết bao nhiêu lần rồi. Đã dịch thì dịch đến cùng, không dịch nửa vời. Vì trên máy khác có thể không hiển thị chuẩn.
Trên máy tôi

userform.JPG

do không dịch HOÀNG.
-------------
Sửa
Mã:
ShowWindow FindWindowA(vbNullString, Me.Caption), Show_MAXIMIZE

thành
Mã:
ShowWindow hwnd, Show_MAXIMIZE
 
Upvote 0
Tôi đang tạo một UserForm chạy trên VBA7 và Win64 với chức năng hiển thị form Min, Max, Resize, và tôi cho nó thêm caption tiếng Việt.
Tất cả đều OK, tuy nhiên một vấn đề khác mà tôi không khắc phục được đó là nếu thủ tục tạo Caption tiếng Việt được kích hoạt thì nó không show form Max khi load lên, ngược lại, bỏ câu lệnh đó thì nó show được form Max! Nhờ các anh chị hướng dẫn khắc phục giúp.

Thủ tục tạo UserForm có 3 nút Close, Max, Min & Normal:
Mã:
Sub CreateMaxMinResizeForm(ByVal lngFrmWndHdl)
    Dim lngStyle
    lngStyle = GetWindowLongPtr(lngFrmWndHdl, GWL_STYLE)
    lngStyle = lngStyle Or WS_SYSMENU       'Add SystemMenu
    lngStyle = lngStyle Or WS_MINIMIZEBOX   'Add MinimizeBox
    lngStyle = lngStyle Or WS_MAXIMIZEBOX   'Add MaximizeBox
    lngStyle = lngStyle + (WS_THICKFRAME)
    SetWindowLongPtr lngFrmWndHdl, GWL_STYLE, lngStyle
    DrawMenuBar lngFrmWndHdl
End Sub

Thủ tục Unicode trên Caption của UserForm:
Mã:
Sub SetUniCaption(ByVal usfHwnd, ByVal UnicodeString As String)
    DefWindowProc usfHwnd, WM_SETTEXT, 0, StrPtr(UnicodeString)
End Sub

Các sự kiện trong UserForm:
Mã:
Private hwnd

''Thủ tục show form Max:
Private Sub UserForm_Activate()
    ShowWindow FindWindowA(vbNullString, Me.Caption), Show_MAXIMIZE
End Sub

Private Sub UserForm_Initialize()
    hwnd = FindWindow("ThunderDFrame", Me.Caption)
    ''The same:
    'hwnd = FindWindowA(vbNullString, Me.Caption)
  
    Dim strFormCaption As String
    strFormCaption = "  HOÀNG TR" & ChrW(7884) & "NG NGH" & ChrW(296) & "A, Phone: 0938.520.520, Mail: NghiaCSG@gmail.com"
    CreateMaxMinResizeForm hwnd

    ''Tai sao co dong duoi day thi khi load form khong the show max form duoc?

    SetUniCaption hwnd, strFormCaption
End Sub
----------------
Rất dễ hiểu là vì Form đã nhận Handle khi chưa chuyển tiếng Việt
sau khi chuyển tiếng Việt Hàm FindWindow không đủ khả năng tìm ký tự ngoài UTF-8.

Cách giải quyết, có thể là Lưu lại Handle của Form trước khi chuyển tiếng Việt.
Hoặc dùng hàm FindWindowW
----------------
PHP:
Khai báo FindWindowW hoặc Alias "FindWindowW"
hWnd = FindWindow("ThunderDFrame" , VBA.StrConv(Form.Caption, vbUnicode))
 
Upvote 0
Trên OfficeX32 thì chạy tốt mà cái #If VBA7 And Win64 Then Nhìn vào trong code rất đẹp
Còn trên Officex64 thì nó báo API màu đỏ .... tất nhiên là nó cũng chạy rất tốt .... Nhưng nhìn vào VBA thấy đỏ code nó ko đẹp tí nào
Sao Bill vẻ ra rắc rối thế nhỉ

Tiện có thớt này hỏi ké chút
Có cách nào xử lý đỏ code như mô tả đó khi xài #If VBA7 And Win64 Then trên Officex64 hay không ???!!! ... hay ta xoá nó đi là xong khỏi nhiều chuyện he ???!!! :D -0-0-0-
Capture.PNG
 
Upvote 0
Trên OfficeX32 thì chạy tốt mà cái #If VBA7 And Win64 Then Nhìn vào trong code rất đẹp
Còn trên Officex64 thì nó báo API màu đỏ .... tất nhiên là nó cũng chạy rất tốt .... Nhưng nhìn vào VBA thấy đỏ code nó ko đẹp tí nào
Sao Bill vẻ ra rắc rối thế nhỉ

Tiện có thớt này hỏi ké chút
Có cách nào xử lý đỏ code như mô tả đó khi xài #If VBA7 And Win64 Then trên Officex64 hay không ???!!! ... hay ta xoá nó đi là xong khỏi nhiều chuyện he ???!!! :D -0-0-0-
View attachment 231360
Thì nếu chỉ dành riêng cho Win 64bit và Office 64 bit thì xóa cha nó cho rồi, khỏi IF éc gì cả.
 
Upvote 0
Mình chưa dùng Office 2007 nên không biết. Bạn nào dùng rồi làm ơn cho biết Office 2007 trong VBA có hỗ trợ UniCode không vậy ?
ThankS !
Private Sub UserForm_Initialize()

Dim s1 As String

Dim s2 As String

s1 = UniConvert("Tooi vaaxn cofn yeeu ", "Telex")

s2 = UniConvert("Tooi giaf khoong ddieefu", "Telex")

UForm1.CoBox6.List = Array(s1, s2)

End Sub
Bài đã được tự động gộp:

Chuyển tiếng việt từ VBA listBox ra tiếng việt có dấu
Private Sub UserForm_Initialize()

Dim s1 As String

Dim s2 As String

s1 = UniConvert("Tooi vaaxn cofn yeeu ", "Telex")

s2 = UniConvert("Tooi giaf khoong ddieefu", "Telex")

UForm1.CoBox6.List = Array(s1, s2)

End Sub
 
Upvote 0
Chữ này sẽ ra chữ gì? Tôi chịu thua.

"ddieefu"
 
Upvote 0
Em có dùng file UniVba để chuyển 1 cụm từ sau đó đưa vào code, nhưng tới dòng lệnh là lấy 1 giá trị trong 1 ô của excel thì nó lại bị lỗi font.

Mã:
                ch2 = "//span[text()='" & "S" & ChrW(7889) & " " & ChrW(273) & "i" & ChrW(7879) & "n tho" & ChrW(7841) & "i: " & "']"
                Driver1.FindElementByXPath(ch2).Click

                Driver1.Wait 1500
           
                Driver1.FindElementById("input_line_0").SendKeys Keys.Control, "v"

                Driver1.FindElementById("input_line_0").SendKeys ATHANG01.Cells(i, "c").Value
 
Upvote 0

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

Back
Top Bottom