Vô hiệu hóa nút X trong UserForm

  • Thread starter Thread starter nvson
  • Ngày gửi Ngày gửi
Liên hệ QC

nvson

Geotechnics
Thành viên danh dự
Tham gia
20/9/06
Bài viết
793
Được thích
1,287
Nghề nghiệp
ĐCTV - ĐCCT
Nút X chính là nút đóng chương trình (góc phải trên cùng trong UserForm)
1. Vô hiệu hoá nút X, nút X vẫn hiện rõ
Mã:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then Cancel = True
End Sub
2. Vô hiệu hoá nút X, nút X mờ đi
Mã:
Option Explicit
'Copyright © 2005 by RobDog888 (VB/Office Guru™). All Rights reserved.
'
'Distribution: You can freely use this code in your own
'              applications provided that this copyright
'              is left unchanged, but you may not reproduce
'              or publish this code on any web site, online
'              service, or distribute as source on any
'              media without express permission.
'
'Add a Command Button so you can close the userform
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const MF_BYPOSITION = &H400&
'
Private Sub UserForm_Initialize()
    Dim lHwnd As Long
    lHwnd = FindWindow("ThunderDFrame", "UserForm1")
    Do While lHwnd = 0
        lHwnd = FindWindow("ThunderDFrame", "UserForm1")
        DoEvents
    Loop
    RemoveMenu GetSystemMenu(lHwnd, 0), 6, MF_BYPOSITION
End Sub
3. Ẩn nút X
Trong VB để ẩn các nút phóng to (maximize), thu nhỏ (minimize), đóng (Close) của đối tượng Form ta đặt thuộc tính ControlBox=False. Nhưng trong VBA thì khác:
Mã:
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 Const WS_SYSMENU As Long = &H80000
Private Const GWL_STYLE As Long = -16&
Private Sub UserForm_Initialize()
HideCloseBox Me
End Sub
Private Sub HideCloseBox(ByVal UserForm As UserForm)
Dim hWnd As Long
Dim WindowStyle As Long
If Application.Version < 9 Then
    hWnd = FindWindow("ThunderXFrame", UserForm.Caption)
Else
    hWnd = FindWindow("ThunderDFrame", UserForm.Caption)
End If
If hWnd <> 0 Then
    WindowStyle = GetWindowLong(hWnd, GWL_STYLE)
    SetWindowLong hWnd, GWL_STYLE, WindowStyle And Not WS_SYSMENU
End If
End Sub
(Sưu tầm trên Internet)
 
Cám ơn bạn NVSON

Tôi đang cần cái này đây.
 
Upvote 0
chào bạn sơn sau mình gáng vào câu lệnh vào form của mình thì nó báo lổi
3. Ẩn nút X
Trong VB để ẩn các nút phóng to (maximize), thu nhỏ (minimize), đóng (Close) của đối tượng Form ta đặt thuộc tính ControlBox=False. Nhưng trong VBA thì khác:

Code:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _(ByVal lpClassName As String, ByVal lpWindowName As String) As Long​
............................................................
...........................................................v.v.....
thì nó báo lỗi ngày:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

làm sau đây
 
Upvote 0
Mình đã test lại rồi, có thấy sao đâu.
Vào VBA, Insert/ UserForm
Nháy đúp vào UserForm1 vừa tạo rồi thêm đoạn Code trên (tốt nhất là Copy, Paste phòng trường hợp sai sót).
Nhấn F5 để thử chạy.
(Vì ko có dòng lệnh thoát nên nếu muốn dừng bạn nhấn Ctrl+Break hoặc nhấn End trên thanh công cụ...)
Mình thấy bạn viết:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Như vậy là bạn đã sửa dòng lệnh rồi (bạn đã xoá để đưa dòng thứ 2 lên cùng dòng 1 mà vẫn để dấu _ ), nếu để cùng 1 dòng thì bạn xoá cả dấu _đi nhé.
 
Upvote 0
mình đã xoá "-" rồi nhưng cũng không được nó cứ báo lỗi nhé!
 
Upvote 0
Bạn nói là báo lỗi mà lại không đưa thông báo lỗi đó lên thì làm sao mọi người giúp bạn được!
(Tốt nhất gửi file đính kèm)
 
Upvote 0
Rõ ràng những hàm API này được gọi trong thủ tục HideCloseBox, vậy mà bạn lại khai báo các hàm API này trong sự kiện Workbook_Open với kiểu là Private. Như vậy thì các hàm API này chỉ có tác dụng trong Workbook_Open mà thôi. Bạn đưa các hàm API này lên trên cùng trong ThisWorkbook (phần Declerations) là được thôi.
(Nếu muốn các hàm API này có tác dụng trong mọi hàm, thủ tục thì nên khai báo dạng Public và ở 1 module nào đó...)
 
Upvote 0
ongtrungducmx25 đã viết:
Thầy ơi, báo lỗi là phải rồi. Mấy dòng Private Declare Function ... thầy để lên đầu nhé. Thầy khai báo mà để dưới thì Excel cắn lưỡi luôn đó. hi hi
Chúc thầy thành công !

Thân!
 
Upvote 0
chép vào "form nhapdiem" thì lỗ rồi chỉ khi nào bỏ hết code trong "form nhapdiem" thì nút "x" mới mất đi như thế làm sau chế biến được!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom