Các điều kiện nút đóng X trong VBA UserForm

FPT MEDIA
02/07/21
1003
0

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

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

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

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

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

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

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

Cho phép nhập liệu số trong TEXTBOX

Tìm kiếm dữ liệu trong listbox từ textbox