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

Liên hệ QC

Tường_Vi

Thành viên tiêu biểu
Tham gia
19/4/10
Bài viết
482
Được thích
121
Nghề nghiệp
Luôn tìm kiếm một vị trí tốt hơn
Private Sub UserForm_Initialize()
.......................
.......................
.......................
End Sub


Em xin hỏi, sự kiện khí nào mình dùng sự kiện này Initialize

Cám ơn
 
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.
 
Upvote 0
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
 
Upvote 0
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

  • Show_Icon_Add-in.xlam
    47.8 KB · Đọc: 14
Upvote 0
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
 
Upvote 0
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
 
Upvote 0
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:
Upvote 0
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.
 
Upvote 0
Kính chào các bác . em có 1 form nhập liệu , tại ComboBox1 có giá trị là ngày tháng . ComboBox2 sẽ phụ thuộc vào ComboBox1, iem chạy câu lệnh thì nó báo lỗi Range .
Mong các bác chỉ giáo
 

File đính kèm

  • vidu_1.xlsm
    57.1 KB · Đọc: 3
Upvote 0
Kính chào các bác . em có 1 form nhập liệu , tại ComboBox1 có giá trị là ngày tháng . ComboBox2 sẽ phụ thuộc vào ComboBox1, iem chạy câu lệnh thì nó báo lỗi Range .
Mong các bác chỉ giáo
"a4" & Rows.Count = "a41048576"
Excel không có ô a41048576
Sửa
Mã:
"a4" & Rows.Count
Thành
Mã:
"a" & Rows.Count
Tôi chỉ debug đến đó.
 
Upvote 0
Anh chị em cho mình hỏi làm sao để ẩn form (chứ không phải thoát) và mình có thể làm việc trên bảng tính của excel
 
Upvote 0
Phải vầy không bạn?
Mã:
UserForm1.Hide
Cảm ơn anh. Em tim được bài theo yêu cầu của mình rồi.
 
Upvote 0
Mình theo dõi các trang về "VẤN ĐỀ FORM" nhưng chưa thấy bài viết nào nói về cách nhập dữ liệu là đoạn text vào TextBox trên Form, để chép vào 1 cell trên Sheet. Nên mình muốn nhờ các ACE giúp mình vấn đề này nhé.
Mình tạo một form (như hình - có file đính kèm)
form.png
.
Mình muốn nhập đoạn text từ word (xem hình)
văn thử.png
nếu ...
copy.png
.
Nên mình mong các ACE có thể giúp mình - code hay sửa thuộc tính của textBox "BẢNG NHẬP THÊM NỘI DUNG" - để có thể chép vào textBox trên Form này thì toàn bộ được chép vào 1 cell trong cột "C" thuộc sheetNH
Xin cám ơn nhiều
 

File đính kèm

  • thu điền vào form.xlsm
    21.6 KB · Đọc: 7
Upvote 0
Mình theo dõi các trang về "VẤN ĐỀ FORM" nhưng chưa thấy bài viết nào nói về cách nhập dữ liệu là đoạn text vào TextBox trên Form, để chép vào 1 cell trên Sheet. Nên mình muốn nhờ các
Văn bản từ Word có nhiều dòng trong khi textbox hiện tại không phục vụ nhiều dòng.

Vào VBE -> chọn TextBox -> trong cửa sổ Properties chuyển thuộc tính MultiLine thành True.textbox.JPG
 
Upvote 0
rất cám ơn anh Batman1!
Hỏi nhờ thêm anh:
Nếu muốn đưa hình vào textBox đó, thì phải viết lệnh code để chép hình vào ôCell trong cột "C" của Sheet
Hay chỉ cần chỉnh thuộc tính trong properti?
thanks you
 
Lần chỉnh sửa cuối:
Upvote 0
rất cám ơn anh Batman1!
Hỏi nhờ thêm anh:
Nếu muốn đưa hình vào textBox đó, thì phải viết lệnh code để chép hình vào ôCell trong cột "C" của Sheet
Hay chỉ cần chỉnh thuộc tính trong properti?
Cảm ơn you
Bạn muốn thêm hình vào đâu? Vào TextBox? Để làm gì? Vào cell? Vào cell nào, lấy hình từ đâu?
Hãy tập nói rõ, nói chi tiết, nói cả câu thay vì nửa câu.

Hỏi mà như đánh đố người khác thì bó tay.

Bạn chắc cám ơn batman1 chứ không phải cám ơn bạn you nào đó?
 
Upvote 0
Bạn muốn thêm hình vào đâu? Vào TextBox? Để làm gì? Vào cell? Vào cell nào, lấy hình từ đâu?
Hãy tập nói rõ, nói chi tiết, nói cả câu thay vì nửa câu.

Hỏi mà như đánh đố người khác thì bó tay.

Bạn chắc cám ơn batman1 chứ không phải cám ơn bạn you nào đó?
xin lỗi -gõ chữ "t-h-a-n-k-s you" mà tự động ra chữ CÁM ƠN - tiếng việt, còn chữ YOU vẫn giữ nguyên.
Ý mình muốn hỏi nhờ anh xem:
vì trong khi copy đoạn văn có hình/bảng table số liệu từ word để chèn vào ô cell, bằng cách dán vào textBox của Form, thì hình không thấy hiển thị và bảng table thì không còn đường viền bảng nữa, trong Ô cell của sheet
Nhờ anh xem hình:cop hinh.png
Vậy như hình và bảng biểu, muốn add vào textBox, thì cần viết CODE hay thủ thuật nào khác không?
Nếu được anh cho giúp code/thủ thuật này.
Xin cám ơn anh nhiều
 
Upvote 0
Web KT
Back
Top Bottom