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.
Nội dung chính
Các điều kiện nút đóng X trong VBA UserForm
![Các điều kiện nút đóng X trong VBA UserForm 1 Các điều kiện nút đóng [X] trong VBA UserForm](http://tinhoc.maugiaodien.com/wp-content/uploads/2021/07/ANHIEN-NUTX-TRONG-USERFORM-TINVANPHONG.jpg)
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

Bật mí 2 cách đánh số trang trong excel nhanh, gọn, lẹ không thể không biết
Hướng dẫn tạo và sử dụng bộ lọc Filter trong Excel 2019 – Thủ thuật Excel 05
Khám Phá Biểu Đồ Mini Sparklines Trong Excel 2019 – Thủ Thuật Excel 02
Tạo Đường Kẻ Chéo Trong Ô Excel 2019 – Thủ Thuật Excel 01
Đánh Số Thứ Tự Tự Động Trong Excel 2019 – Thủ Thuật Excel 03
Cách sửa Lỗi value trong Excel cực kỳ đơn giản, hiệu quả 100%
Sửa lỗi không mở được File Excel với 6 cách đơn giản nhất
Cách sử dụng Hàm Address để lấy giá trị ô đơn giản nhất