Hôm nay, Tinvanphong.com sẽ hướng dẫn các bạn bài viết Các điều kiện nút đóng X trong VBA UserForm. Nó là một phần được công nhận của môi trường Windows. Khá nhiều ứng dụng, sử dụng dấu thập ở góc trên cùng bên phải để đóng cửa sổ. Do đó, dựa trên kinh nghiệm của họ về các ứng dụng khác, tất cả người dùng đã biết những gì cross nên làm.
Không quan trọng người dùng đang ở quốc gia nào, hoặc họ nói ngôn ngữ gì, nó là một biểu tượng được mọi người hiểu rõ để đóng cửa sổ. Vì vậy, bạn nên tự hỏi bản thân tại sao bạn lại muốn ẩn nút đóng. Với suy nghĩ này, tôi sẽ nói rằng nhìn chung không nên ẩn hoặc tắt nút đóng.
Các điều kiện nút đóng X trong VBA UserForm
I.Nguyên tắc chung
Tuy nhiên, có một số trường hợp mà chúng tôi có thể muốn phá vỡ quy tắc chung này. Một ví dụ như vậy là thanh tiến trình. Nếu người dùng đóng thanh tiến trình, họ có thể không biết khi nào macro đã chạy xong hoặc còn bao lâu nữa.
Do đó, có thể hữu ích khi ẩn nút đóng trong trường hợp này. Theo mặc định, nút đóng sẽ dỡ bỏ một UserForm, nhưng nó có thể được điều chỉnh để có một thủ tục đóng tùy chỉnh . Vì chúng tôi có thể kiểm soát chức năng này, nên kiểm soát nó tốt hơn là ẩn hoặc tắt nó.
II.DEMO 1 – Không cho đóng ứng dụng và hiển thị thông báo – Các điều kiện nút đóng X trong VBA UserForm
Private Sub cmdClose_Click() Unload Me End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True MsgBox "Xin dóng bang nut CLose", vbOKOnly End If End Sub
UserForm_QueryClose :Sự kiện này xảy ra trước khi UserForm đóng.
Cancel : Một số nguyên. Đặt đối số này thành bất kỳ giá trị nào khác 0 sẽ dừng sự kiện QueryClose trong tất cả các biểu mẫu người dùng đã tải và ngăn UserForm và ứng dụng đóng.
CloseMode : Một giá trị hoặc hằng số chỉ ra nguyên nhân của sự kiện QueryClose .
vbFormControlMenu : Người dùng đã chọn lệnh Đóng từ menu Điều khiển trên UserForm .
III.DEMO 2 – Bật tắt nút đóng trên USERFORM – API WINDOWN
Trước tiên bạn cần tạo 1 MODEL và coppy này vào
Option Explicit Private Const GWL_STYLE = -16 Private Const WS_CAPTION = &HC00000 Private Const WS_SYSMENU = &H80000 Private Const SC_CLOSE = &HF060 #If VBA7 Then Private Declare PtrSafe Function GetWindowLong _ Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _ ByVal nIndex As Long) As Long Private Declare PtrSafe Function SetWindowLong _ Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _ ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare PtrSafe Function DrawMenuBar _ Lib "user32" (ByVal hWnd As Long) As Long Private Declare PtrSafe Function FindWindowA _ Lib "user32" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare PtrSafe Function DeleteMenu _ Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare PtrSafe Function GetSystemMenu _ Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long #Else 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 DrawMenuBar _ Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function FindWindowA _ Lib "user32" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function DeleteMenu _ Lib "user32" (ByVal hMenu As Long, _ ByVal nPosition As Long, ByVal wFlags As Long) As Long Public Declare Function GetSystemMenu _ Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long #End If '----------------------------------------------------------------------------------------- Public Sub CloseButtonSettings(frm As Object, show As Boolean) Dim windowHandle As Long Dim menuHandle As Long windowHandle = FindWindowA(vbNullString, frm.Caption) If show = True Then menuHandle = GetSystemMenu(windowHandle, 1) Else menuHandle = GetSystemMenu(windowHandle, 0) DeleteMenu menuHandle, SC_CLOSE, 0& End If End Sub
Tiếp Theo bạn cần coppy code này vào USERFORM
Option Explicit Private Sub UserForm_Initialize() Call CloseButtonSettings(Me, False) End Sub Private Sub cmdDisable_Click() Call CloseButtonSettings(Me, False) End Sub Private Sub cmdEnable_Click() Call CloseButtonSettings(Me, True) End Sub
IV. DEMO 3 – Ân hiện nút X WINDOWN API
Option Explicit Private Const GWL_STYLE = -16 Private Const WS_CAPTION = &HC00000 Private Const WS_SYSMENU = &H80000 Private Const SC_CLOSE = &HF060 #If VBA7 Then Private Declare PtrSafe Function GetWindowLong _ Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _ ByVal nIndex As Long) As Long Private Declare PtrSafe Function SetWindowLong _ Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _ ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare PtrSafe Function DrawMenuBar _ Lib "user32" (ByVal hWnd As Long) As Long Private Declare PtrSafe Function FindWindowA _ Lib "user32" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare PtrSafe Function DeleteMenu _ Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare PtrSafe Function GetSystemMenu _ Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long #Else 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 DrawMenuBar _ Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function FindWindowA _ Lib "user32" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function DeleteMenu _ Lib "user32" (ByVal hMenu As Long, _ ByVal nPosition As Long, ByVal wFlags As Long) As Long Public Declare Function GetSystemMenu _ Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long #End If Public Sub SystemButtonSettings(frm As Object, show As Boolean) Dim windowStyle As Long Dim windowHandle As Long windowHandle = FindWindowA(vbNullString, frm.Caption) windowStyle = GetWindowLong(windowHandle, GWL_STYLE) If show = False Then SetWindowLong windowHandle, GWL_STYLE, (windowStyle And Not WS_SYSMENU) Else SetWindowLong windowHandle, GWL_STYLE, (windowStyle + WS_SYSMENU) End If DrawMenuBar (windowHandle) End Sub
Coppy doạn code này vào userform
Option Explicit Private Sub UserForm_Initialize() Call SystemButtonSettings(Me, False) End Sub Private Sub cmdHide_Click() Call SystemButtonSettings(Me, False) End Sub Private Sub cmdShow_Click() Call SystemButtonSettings(Me, True) End Sub
V. TẢI TỆP
Các điều kiện nút đóng [X] trong VBA UserForm Click vào đây để down DEMO
Tham khảo thêm các bài viết khác:
Phần mềm xuất nhập tồn bằng Excel miễn phí 2021