Các câu hỏi về Form trong Excel VBA

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
452
Được thích
345
Điểm
210
Nơi ở
Phờ lây cu
Bác chịu khó viết các declare lại đi. Lỗi do declare sai thôi, nên call API sai. Gộp vào 1 module.
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,812
Được thích
2,796
Điểm
360
gạch đá càng nhiều càng tốt !
miễn là có thể khắc phục lỗi là được rồi,
cám ơn các bác chỉ dẫn nhiệt tình
Thì tôi đã chỉ tận nơi rồi còn gì?

Nếu chỉ là vấn đề icon thì trong code của UserForm1:

1. Sửa thành
Mã:
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
  
' các khai báo còn lại như cũ
#Else
' các khai báo  như cũ
#End If
Đấy là tối thiểu để có icon. Ngoài ra trong phần #IF còn phải sửa khai báo của GetWindowLong và SetWindowLong.

Trong UserForm_Initialize cho lnghWnd vào #If ... #End If, tức sửa thành
Mã:
#If VBA7 Then
    Dim lngIcon As LongPtr
    Dim lnghWnd As LongPtr
#Else
    Dim lngIcon As Long
    Dim lnghWnd As Long
#End If
2. Tôi đã nói rất rõ là không có icon không phải là lỗi của ExtractIcon. Lỗi do truyền tham số không "khớp" với khai báo của hàm SendMessage.
a - Nếu để nguyên khai báo SendMessage như bây giờ thì trong UserForm_Initialize phải có
SendMessage lnghWnd, WM_SETICON, False, ByVal lngIcon
b - Nếu giữ nguyên như bây giờ lệnh gọi SendMessage
Mã:
SendMessage lnghWnd, WM_SETICON, False, lngIcon
thì phải sửa khai báo thành
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
' khai báo còn lại như cũ
#Else
' 2 khai báo như cũ
#End If
Tức có 2 khả năng. Hãy chọn 1 để sửa
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
1. Khai báo lộn xộn.

2. Khai báo không chính xác. Vd.
Không thể là


Mà phải là As LongPtr.

3. Không nhất quán. Đã bầy trò #If ... #Else ... #End If thì phải nhất quán, chơi trò đó đến cùng.
Không thể khai báo như ở trên (vd. FindWindow) rồi sau đó
Mã:
Dim lnghWnd As Long
Đã chơi #If ... #Else ... #End If thì chơi đến cùng.

4. Về code thì sai không phải do ExtractIcon. Parameter cuối cùng không phải là ID (identifier) mà là index - chỉ số thôi. 0 có nghĩa là icon đầu tiên có trong EXE, DLL. Excel.exe rõ ràng có ít nhất 1 icon.

Sai do cách dùng hàm SendMessage. Nếu ở trên là

thì khi chạy trên Office 2016 sẽ có lỗi ở
Mã:
SendMessage lnghWnd, WM_SETICON, False, lngIcon
Lúc đó phải là


Lúc đó sẽ nhìn thấy ICON.

Ngoài ra nên khai báo nhất quán. Hoặc cùng ANY hoặc cùng không ANY. Tức hoặc (lParam truyền bởi reference)

hoặc (lParam truyền bởi giá trị)


Với phiên bản 1 bắt buộc phải có ByVal lngIcon. Với phiên bản 2 thì ByVal lngIcon hay lngIcon đều được.

Nói tóm lại là code hổ lốn.
làm theo hướng dẫn của bác với Office 2007+2016 (32 bit) đều Ok rồi
nhưng vẫn còn Office 2010 -64 bit báo lỗi
vậy lại lên đây để "Kiện" bác @batman1 thôi. :D
220554
 

File đính kèm

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
452
Được thích
345
Điểm
210
Nơi ở
Phờ lây cu
Vậy thì hWnd khai báo sai hay FindWindow declare sai.
Tôi kg có down file của bác, nhưng nhìn là thấy ngay
 

giaiphap

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,670
Được thích
3,855
Điểm
860
làm theo hướng dẫn của bác với Office 2007+2016 (32 bit) đều Ok rồi
nhưng vẫn còn Office 2010 -64 bit báo lỗi
vậy lại lên đây để "Kiện" bác @batman1 thôi. :D
View attachment 220554
Thử lại thế này lần nửa xem sao.
Mã:
Private Sub UserForm_Initialize()
    Dim strIconPath As String
#If VBA7 Then
    Dim lngIcon As LongPtr
    Dim lnghWnd As LongPtr
#Else
    Dim lngIcon As Long
    Dim lnghWnd As Long
#End If
    
 
'----------------------------------------------
    AllowResize = True
    OldWidth = Width
    OldHeight = Height
    If Val(Application.Version) < 9 Then
        lnghWnd = FindWindow("ThunderXFrame", Caption)  'XL97
    Else
        lnghWnd = FindWindow("ThunderDFrame", Caption)  'XL2000
    End If

    PrevStyle = GetWindowLong(lnghWnd, GWL_STYLE)
    SetWindowLong hWnd, GWL_STYLE, PrevStyle _
                                Or WS_SIZEBOX _
                                Or WS_MINIMIZEBOX _
                                Or WS_MAXIMIZEBOX
'----------------------------------------------
#If VBA7 Then
    lngIcon = ExtractIcon(Application.HinstancePtr, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#Else
    lngIcon = ExtractIcon(Application.Hinstance, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#End If


    SendMessage lnghWnd, WM_SETICON, True, lngIcon
    SendMessage lnghWnd, WM_SETICON, False, ByVal lngIcon

  
    SetUniText Me, "Caption hi" & ChrW(7875) & "n th" & ChrW(7883) & " Ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
    
End Sub
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,812
Được thích
2,796
Điểm
360
làm theo hướng dẫn của bác với Office 2007+2016 (32 bit) đều Ok rồi
nhưng vẫn còn Office 2010 -64 bit báo lỗi
vậy lại lên đây để "Kiện" bác @batman1 thôi. :D
View attachment 220554
Thì tôi đã viết rất rõ
Nếu chỉ là vấn đề icon thì trong code của UserForm1:
Tức phần
Mã:
#If VBA7 Then
    lngIcon = ExtractIcon(Application.HinstancePtr, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#Else
    lngIcon = ExtractIcon(Application.Hinstance, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#End If
    lnghWnd = FindWindow("ThunderDFrame", Me.Caption)

Debug.Print lngIcon
Debug.Print lnghWnd
'    SendMessage lnghWnd, WM_SETICON, True, lngIcon
    SendMessage lnghWnd, WM_SETICON, False, ByVal lngIcon
Còn bạn đang nói tới phần đọc ra handle của Form vào hWnd (sao không đọc 1 lần như ở dưới, tức như tôi trích ở trên, vào lnghWnd???). Tức phần không liên quan tới ICON
Mã:
If Val(Application.Version) < 9 Then
        hWnd = FindWindow("ThunderXFrame", Caption)  'XL97
    Else
        hWnd = FindWindow("ThunderDFrame", Caption)  'XL2000
    End If
Debug.Print hWnd
    PrevStyle = GetWindowLong(hWnd, GWL_STYLE)
    SetWindowLong hWnd, GWL_STYLE, PrevStyle _
                                Or WS_SIZEBOX _
                                Or WS_MINIMIZEBOX _
                                Or WS_MAXIMIZEBOX
hWnd ở trên không được khai báo trong module UserForm1 mà ở module RUN
Mã:
Public hWnd&
Không thể thế được. Đã chơi các phiên bản thì phải #If ... #Else ... #End If.

Mà cũng lạ. hWnd được khai báo tại RUN nhưng lại chỉ dùng trong UserForm_Initialize.

Chữa cháy:
1. Xóa
Mã:
Public hWnd&
ở đầu module RUN

2. Trong UserForm_Initialize khai báo
Mã:
#If VBA7 Then
    Dim hWnd As LongPtr
#Else
    Dim hWnd As Long
#End If
Nhưng tại sao phải làm thế khi đã có biến lnghWnd rồi??? Vậy thì không khai báo thêm hWnd nữa là dùng lnghWnd thôi. Tức
Mã:
If Val(Application.Version) < 9 Then
    lnghWnd = FindWindow("ThunderXFrame", Caption)  'XL97
Else
    lnghWnd = FindWindow("ThunderDFrame", Caption)  'XL2000
End If
Và xóa dòng
Mã:
lnghWnd = FindWindow("ThunderDFrame", Me.Caption)
Nhưng tôi cũng đã viết ở bài trước là phải khai báo lại GetWindowLong và SetWindowLong. Nếu không sẽ lỗi tiếp tại dòng dùng GetWindowLong và SetWindowLong

Tất nhiên có ICON và hết lỗi kia nhưng text trên thanh tiêu đề không hiển thị tiếng Việt do code trong FormCaptionUnicode sai toe tua. Tôi không đủ dũng cảm để nhìn code trong module đó nữa nên bỏ dùng SetUniText.

Tóm lại tôi đã sửa hộ bạn. Hãy xóa toàn bộ code hiện có trong UserForm và thay bằng code sau
Mã:
'-----------------------------------------
'****************************************************
'Author: Nguyen Duy Tuan - duytuan@bluesofts.net
'Tel: 0904.210.337
'website: www.bluesofts.net
'         www.atoolspro.com
'****************************************************
Option Explicit

Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000
Private Const WS_SIZEBOX = WS_THICKFRAME
Private Const WM_SETICON = &H80
Private Const WM_SETTEXT As Long = &HC
'Private Const WS_MAXIMIZE = &H1000000
'Private Const WS_MINIMIZE = &H20000000
'
'Private Const SW_ERASE = &H4
'Private Const SW_HIDE = 0
'Private Const SW_INVALIDATE = &H2
'Private Const SW_MAX = 10
'Private Const SW_MAXIMIZE = 3
'Private Const SW_MINIMIZE = 6
'Private Const SW_NORMAL = 1
'Private Const SW_OTHERUNZOOM = 4
'Private Const SW_OTHERZOOM = 2
'Private Const SW_PARENTCLOSING = 1
'Private Const SW_PARENTOPENING = 3
'Private Const SW_RESTORE = 9
'Private Const SW_SCROLLCHILDREN = &H1
'Private Const SW_SHOW = 5
'Private Const SW_SHOWDEFAULT = 10
'Private Const SW_SHOWMAXIMIZED = 3
'Private Const SW_SHOWMINIMIZED = 2
'Private Const SW_SHOWMINNOACTIVE = 7
'Private Const SW_SHOWNA = 8
'Private Const SW_SHOWNOACTIVATE = 4
'Private Const SW_SHOWNORMAL = 1
    
#If VBA7 Then
    Private Declare PtrSafe Function DefWindowProcW Lib "user32" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal nCmdShow 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare PtrSafe Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As LongPtr, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As LongPtr
    Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
#Else
    Private Declare Function DefWindowProcW Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
#End If

Dim PrevStyle&
Dim OldWidth As Double, OldHeight As Double
Dim AllowResize As Boolean

Private Sub UserForm_Initialize()
#If VBA7 Then
    Dim lngIcon As LongPtr
    Dim lnghWnd As LongPtr
#Else
    Dim lngIcon As Long
    Dim lnghWnd As Long
#End If
Dim sUniText As String
'----------------------------------------------
    AllowResize = True
    OldWidth = Width
    OldHeight = Height
    If Val(Application.Version) < 9 Then
        lnghWnd = FindWindow("ThunderXFrame", Caption)  'XL97
    Else
        lnghWnd = FindWindow("ThunderDFrame", Caption)  'XL2000
    End If

    PrevStyle = GetWindowLong(lnghWnd, GWL_STYLE)
    SetWindowLong lnghWnd, GWL_STYLE, PrevStyle Or WS_SIZEBOX Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
'----------------------------------------------
#If VBA7 Then
    lngIcon = ExtractIcon(Application.HinstancePtr, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#Else
    lngIcon = ExtractIcon(Application.Hinstance, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#End If
    
'    SendMessage lnghWnd, WM_SETICON, True, lngIcon
    SendMessage lnghWnd, WM_SETICON, False, lngIcon

    sUniText = "Caption hi" & ChrW(7875) & "n th" & ChrW(7883) & " Ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
    DefWindowProcW lnghWnd, WM_SETTEXT, 0, StrPtr(sUniText)
   
'    SetUniText Me, "Caption hi" & ChrW(7875) & "n th" & ChrW(7883) & " Ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
End Sub
Bài đã được tự động gộp:

Thử lại thế này lần nửa xem sao.
Thì sẽ được thông báo tiếp là sai tại GetWindowLong. Rồi sai ở SetWindowLong. Vì hiện thời trong khai báo của Set(Get)WindowLong thì hwnd As Long cả ở #If. Phải sửa thành As LongPtr.

Đã nói rồi. Code sai rất nhiều chỗ chứ không chỉ chỗ hWnd đâu. Sửa xong Set(Get)WindowLong thì sẽ thấy tiêu đề tiếng Việt không có do code trong FormCaptionUnicode cũng sai.
 
Lần chỉnh sửa cuối:

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
Thì tôi đã viết rất rõ


Tức phần
Mã:
#If VBA7 Then
    lngIcon = ExtractIcon(Application.HinstancePtr, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#Else
    lngIcon = ExtractIcon(Application.Hinstance, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#End If
    lnghWnd = FindWindow("ThunderDFrame", Me.Caption)

Debug.Print lngIcon
Debug.Print lnghWnd
'    SendMessage lnghWnd, WM_SETICON, True, lngIcon
    SendMessage lnghWnd, WM_SETICON, False, ByVal lngIcon
Còn bạn đang nói tới phần đọc ra handle của Form vào hWnd (sao không đọc 1 lần như ở dưới, tức như tôi trích ở trên, vào lnghWnd???). Tức phần không liên quan tới ICON
Mã:
If Val(Application.Version) < 9 Then
        hWnd = FindWindow("ThunderXFrame", Caption)  'XL97
    Else
        hWnd = FindWindow("ThunderDFrame", Caption)  'XL2000
    End If
Debug.Print hWnd
    PrevStyle = GetWindowLong(hWnd, GWL_STYLE)
    SetWindowLong hWnd, GWL_STYLE, PrevStyle _
                                Or WS_SIZEBOX _
                                Or WS_MINIMIZEBOX _
                                Or WS_MAXIMIZEBOX
hWnd ở trên không được khai báo trong module UserForm1 mà ở module RUN
Mã:
Public hWnd&
Không thể thế được. Đã chơi các phiên bản thì phải #If ... #Else ... #End If.

Mà cũng lạ. hWnd được khai báo tại RUN nhưng lại chỉ dùng trong UserForm_Initialize.

Chữa cháy:
1. Xóa
Mã:
Public hWnd&
ở đầu module RUN

2. Trong UserForm_Initialize khai báo
Mã:
#If VBA7 Then
    Dim hWnd As LongPtr
#Else
    Dim hWnd As Long
#End If
Nhưng tại sao phải làm thế khi đã có biến lnghWnd rồi??? Vậy thì không khai báo thêm hWnd nữa là dùng lnghWnd thôi. Tức
Mã:
If Val(Application.Version) < 9 Then
    lnghWnd = FindWindow("ThunderXFrame", Caption)  'XL97
Else
    lnghWnd = FindWindow("ThunderDFrame", Caption)  'XL2000
End If
Và xóa dòng
Mã:
lnghWnd = FindWindow("ThunderDFrame", Me.Caption)
Nhưng tôi cũng đã viết ở bài trước là phải khai báo lại GetWindowLong và SetWindowLong. Nếu không sẽ lỗi tiếp tại dòng dùng GetWindowLong và SetWindowLong

Tất nhiên có ICON và hết lỗi kia nhưng text trên thanh tiêu đề không hiển thị tiếng Việt do code trong FormCaptionUnicode sai toe tua. Tôi không đủ dũng cảm để nhìn code trong module đó nữa nên bỏ dùng SetUniText.

Tóm lại tôi đã sửa hộ bạn. Hãy xóa toàn bộ code hiện có trong UserForm và thay bằng code sau
Mã:
'-----------------------------------------
'****************************************************
'Author: Nguyen Duy Tuan - duytuan@bluesofts.net
'Tel: 0904.210.337
'website: www.bluesofts.net
'         www.atoolspro.com
'****************************************************
Option Explicit

Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000
Private Const WS_SIZEBOX = WS_THICKFRAME
Private Const WM_SETICON = &H80
Private Const WM_SETTEXT As Long = &HC
'Private Const WS_MAXIMIZE = &H1000000
'Private Const WS_MINIMIZE = &H20000000
'
'Private Const SW_ERASE = &H4
'Private Const SW_HIDE = 0
'Private Const SW_INVALIDATE = &H2
'Private Const SW_MAX = 10
'Private Const SW_MAXIMIZE = 3
'Private Const SW_MINIMIZE = 6
'Private Const SW_NORMAL = 1
'Private Const SW_OTHERUNZOOM = 4
'Private Const SW_OTHERZOOM = 2
'Private Const SW_PARENTCLOSING = 1
'Private Const SW_PARENTOPENING = 3
'Private Const SW_RESTORE = 9
'Private Const SW_SCROLLCHILDREN = &H1
'Private Const SW_SHOW = 5
'Private Const SW_SHOWDEFAULT = 10
'Private Const SW_SHOWMAXIMIZED = 3
'Private Const SW_SHOWMINIMIZED = 2
'Private Const SW_SHOWMINNOACTIVE = 7
'Private Const SW_SHOWNA = 8
'Private Const SW_SHOWNOACTIVATE = 4
'Private Const SW_SHOWNORMAL = 1
  
#If VBA7 Then
    Private Declare PtrSafe Function DefWindowProcW Lib "user32" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal nCmdShow 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare PtrSafe Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As LongPtr, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As LongPtr
    Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
#Else
    Private Declare Function DefWindowProcW Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
#End If

Dim PrevStyle&
Dim OldWidth As Double, OldHeight As Double
Dim AllowResize As Boolean

Private Sub UserForm_Initialize()
#If VBA7 Then
    Dim lngIcon As LongPtr
    Dim lnghWnd As LongPtr
#Else
    Dim lngIcon As Long
    Dim lnghWnd As Long
#End If
Dim sUniText As String
'----------------------------------------------
    AllowResize = True
    OldWidth = Width
    OldHeight = Height
    If Val(Application.Version) < 9 Then
        lnghWnd = FindWindow("ThunderXFrame", Caption)  'XL97
    Else
        lnghWnd = FindWindow("ThunderDFrame", Caption)  'XL2000
    End If

    PrevStyle = GetWindowLong(lnghWnd, GWL_STYLE)
    SetWindowLong lnghWnd, GWL_STYLE, PrevStyle Or WS_SIZEBOX Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
'----------------------------------------------
#If VBA7 Then
    lngIcon = ExtractIcon(Application.HinstancePtr, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#Else
    lngIcon = ExtractIcon(Application.Hinstance, Application.Path & "\Excel.exe", 0) ' HinstancePtr
#End If
  
'    SendMessage lnghWnd, WM_SETICON, True, lngIcon
    SendMessage lnghWnd, WM_SETICON, False, lngIcon

    sUniText = "Caption hi" & ChrW(7875) & "n th" & ChrW(7883) & " Ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
    DefWindowProcW lnghWnd, WM_SETTEXT, 0, StrPtr(sUniText)
 
'    SetUniText Me, "Caption hi" & ChrW(7875) & "n th" & ChrW(7883) & " Ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
End Sub
Bài đã được tự động gộp:


Thì sẽ được thông báo tiếp là sai tại GetWindowLong. Rồi sai ở SetWindowLong. Vì hiện thời trong khai báo của Set(Get)WindowLong thì hwnd As Long cả ở #If. Phải sửa thành As LongPtr.

Đã nói rồi. Code sai rất nhiều chỗ chứ không chỉ chỗ hWnd đâu. Sửa xong Set(Get)WindowLong thì sẽ thấy tiêu đề tiếng Việt không có do code trong FormCaptionUnicode cũng sai.
Quá tuyệt diệu !!
học lập trình đúng là càng đi sâu càng hay :D.
Cám ơn bác nhiều.
 
Top