Unicode tiếng Việt trong VBA Excel

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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.

'===========
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.

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­"
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.

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!

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 ạ:

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:

Dim sAlert$

Cái dấu $ này mang ý nghĩa gì vậy?
Mong bạn giúp!
Chân thành cảm ơn!

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à.
https://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 :
https://www.giaiphapexcel.com/forum/showthread.php?t=17469
www.giaiphapexcel.com/diendan/threads/unicode-ti%E1%BA%BFng-vi%E1%BB%87t-trong-vba-excel.2370/

Khoá học Trưởng phòng nhân sự
Khóa học SprinGO phù hợp

Khoá học Trưởng phòng nhân sự

Nguồn nhân lực là một trong Tứ trụ kinh doanh của doanh nghiệp, có tác động tới sự tồn tại và phát triển bền...

Xem khóa học
★★★★★ 5 ★ 1 👤 2 ▥ 0
Quảng cáo

Bạn nên đọc

2 Responses

  1. hands says:

    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ử
    2002

    Thử đoạn code này của anh @Nguyễn Duy Tuân thử xem được không?

    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

    Đưa toàn bộ phần khai báo hàm (Declare….) vô Module chứ không phải Form module thử xem.
    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 đó
    À 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ử

    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.

    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
    Bạn debug giúp mình, xem kỹ là DefWindowProcW hay DefWindowProcA, code của bác Tuan đấy

    Là cái này DefWindowProcW.

    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
    Code của bác Tuân lúc đầu cả 2 đều là DefWindowProcA

    Ở máy tôi 32bit chạy tốt, @ThangCuAnh chạy 64bit thử xem có được không?

    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.

    Thử test lại file này xem sao.

    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.
    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.

    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.

    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.

    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ề,….

    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.

  2. hands says:

    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:

    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:

    Sub SetUniCaption(ByVal usfHwnd, ByVal UnicodeString As String)
        DefWindowProc usfHwnd, WM_SETTEXT, 0, StrPtr(UnicodeString)
    End Sub

    Các sự kiện trong UserForm:

    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

    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

    2005

    do không dịch HOÀNG.
    ————-
    Sửa

    ShowWindow FindWindowA(vbNullString, Me.Caption), Show_MAXIMIZE

    thành

    ShowWindow hwnd, Show_MAXIMIZE

    do không dịch HOÀNG.

    —————-
    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
    —————-

    Khai báo FindWindowW hoặc Alias "FindWindowW"
    hWnd = FindWindow("ThunderDFrame" , VBA.StrConv(Form.Caption, vbUnicode))

    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 ???!!! 😀 -0-0-0-
    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ả.

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm