Bỏ nút X trong Excel

Liên hệ QC

hanhpptc

Thành viên tiêu biểu
Tham gia
16/5/08
Bài viết
459
Được thích
320
Em xin nhờ các anh chị trong diễn đàn hướng dẫn dùm câu lệnh loại bỏ và khôi phục nút Close (nút X) ở góc trên, bên phải màn hình EXcel. Em xin cảm ơn nhiều!
 
Có lẽ trường yêu cầu của bạn không được đâu bạn ơi! Mình nghĩ ko có chế độ lựa chọn đó đâu.
 
Upvote 0
Bạn chỉ có thể vô hiệu hoá nút đó bằng một lệnh:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then Cancel = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là code chạy trên Form thôi bạn! Yêu cầu của bạn ấy là nút Close của Windows Microsoft Excel kìa! Cái này chắc chỉ có Microsoft hoặc Bill Gate làm được thôi! Thân.
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các bạn, ý mình là muốn bỏ nút close trong Excel cơ. Mình có một chương trình quản lý tại cơ quan, theo hướng dẫn của diễn đàn, mình đã tắt bỏ được các thanh công cụ của Excel. Khi thoát khỏi chương trình thì các thanh công cụ khôi phục lại. Thế nhưng nếu người dùng thoát khỏi chương trình bằng nút X trên Excel thì không khôi phục được khi sử dụng bảng tính Excel khác. Ý mình là khi chay chương trình ứng dụng, không cho người dùng thoát bằng cách này, hoặc nếu có thoát bằng nút X thì khôi phục lại các thanh công cụ. Bạn nào biết hướng dẫn gúp mình với.
 
Upvote 0
Bạn dùng thử đoạn code này: ( vô hiệu hóa nút x)
Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Cancel = True
End Sub
 
Upvote 0
Em xin nhờ các anh chị trong diễn đàn hướng dẫn dùm câu lệnh loại bỏ và khôi phục nút Close (nút X) ở góc trên, bên phải màn hình EXcel. Em xin cảm ơn nhiều!

Có 2 nút X :
- Thoát khỏi excel
- Thoát khỏi File (Workbook) hiện hành

Bạn muốn nói đến cái nào ??

Cái thứ nhất thì hình như phải dùng đến mấy hàm API của Wins rồi, hiện phần mềm thì thấy WinTopMost làm được điều này (Có tác dụng cho mọi loại Button của Wins)

Ngoài ra còn có một số phần mềm khác :


Còn cái thứ 2 : Bạn chọn
Tools/Protection/ProtectWorkbook/Window

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử dùng cách này:
-Chép đoạn code này vào ThisWorkbook:
Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Cancel = AllowClose
End Sub

Private Sub Workbook_Open()
AllowClose = True
End Sub
-Chép vào module và làm nút thoát:
Mã:
Public AllowClose As Boolean
Sub ShutDownWorkBook()
  Application.Quit
  AllowClose = False
  ThisWorkbook.Close True
End Sub
 
Upvote 0
Có 2 nút X :
- Thoát khỏi excel
- Thoát khỏi File (Workbook) hiện hành
...
Còn cái thứ 2 : Bạn chọn
Data/Protection/ProtectWorkbook/Window
Chỉ thấy Tools/Protection/ProtectWorkbook/Window
tedaynui đã viết:
Trích:
Nguyên văn bởi voda
Bạn dùng thử đoạn code này: ( vô hiệu hóa nút x)
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean) Cancel = TrueEnd Sub


Cách này là Excel bị treo luôn Thầy à. Không đóng File cũng như không thoát Excel được Thầy ơi.

TDN
Đương nhiên là không thoát Excel được nhưng nó vẫn hoạt động bình thường mà.
Muốn thoát thì cho nó dòng lệnh
Mã:
Application.EnableEvents=False
 
Upvote 0
Đương nhiên là không thoát Excel được nhưng nó vẫn hoạt động bình thường mà.
Muốn thoát thì cho nó dòng lệnh
Mã:
Application.EnableEvents=False
Dòng lệnh này đặt chỗ nào vậy bác ???

Nếu là :

PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableEvents = False
    Cancel = AllowClose
End Sub

Thì nhấn lần thứ 2 nó vẫn thoát bình thường.

Đề bài là : Làm cho nút close(X) mất tác dụng, còn nếu đóng bằng File/Close hoặc File/Exit thì vẫn được.

Vì vậy các bác chỉ dựa vào sự kiện Workbook_BeforeClose là không được vì cả Close(X), File/CloseFile/Exit đều gọi nó cả.

Nếu có thể thì tốt nhất các bác cho 1 File VD để thấy rõ hơn.

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Mình nghĩ dòng lệnh này đặt trong sheet hoặc module, gắn với một button để thoát:
Mã:
Private Sub CommandButton1_Click()
    Application.Quit
    Application.EnableEvents = False
    ThisWorkbook.Close True
End Sub
 
Upvote 0
Mình nghĩ dòng lệnh này đặt trong sheet hoặc module, gắn với một button để thoát:
Mã:
Private Sub CommandButton1_Click()
    Application.Quit
    Application.EnableEvents = False
    ThisWorkbook.Close True
End Sub

Nếu gắn với 1 Button thì đơn giản rồi bác ạ.
Chỉ cần :

PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If AllowClose = False Then
        Cancel = True
    Else
        ThisWorkbook.Save
    End If
End Sub
Và :

PHP:
Public AllowClose As Boolean
Sub CommandButton1_Click()
    AllowClose = True
    Application.Quit
End Sub

Điều quan trọng là không có thêm các button khác, chỉ có Close(X), File/CloseFile/Exit thôi


Thân!
 
Upvote 0
-Theo mình hiểu hình như bạn hanhpptc muốn vô hiệu hóa tất cả các kiểu thoát của Excel.
-Còn nếu chỉ vô hiệu hóa nút X thôi, thì ý của Mr Okebap hoàn toàn đúng. Sự kiện Workbook_BeforeClose không thể. Có lẽ phải nhở đến hàm API thôi.
 
Upvote 0
Dùng biến trung gian

Tôi có cách này các bạn thử cho ý kiến xem sao nhé!
Mã:
[COLOR=green]Private Sub Workbook_BeforeClose(Cancel As Boolean)[/COLOR]
[COLOR=green]   If Sheet1.Cells(1, 1) <> 1 Then[/COLOR]
[COLOR=green]       Cancel = True[/COLOR]
[COLOR=green]   End If[/COLOR]
[COLOR=green]End Sub[/COLOR]
Tôi định upload file lên nhưng không thể nào upload được.
Tức là ban lấy ô Sheet1.Cells(1, 1) làm trung gian. Sau đó tại nút close trên form bạn chỉ cần thêm đoạn mã
Mã:
[COLOR=green]   Sheet1.Cells(1, 1) = 1[/COLOR]
[COLOR=green]   ActiveWindow.Close False[/COLOR]
Các bạn cho ý kiến nhé!
 
Upvote 0
Xóa bỏ menu Close của Excel!

Đây là cách mình dùng kỹ thuật Windows API, bạn xem có đúng ý chưa.

Copy đoạn code dưới đây vào một Module nào đó và chạy thủ tục RemoveCloseMenu

Mã:
[COLOR="Gray"]Public Const MF_BYCOMMAND = &H0&
Public Const MF_GRAYED = &H1&

Public Const SC_CLOSE = &HF060&

Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Public Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Public Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long
Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
[/COLOR]
Sub RemoveCloseMenu()
    Dim h&, hm&, ID_mSepr&
    
    
    If Application.Version >= 10 Then 'Excel XP/2003/2007 or higher
        h = Application.hwnd
    Else 'Excel 2000 or lower
        h = FindWindow("XLMAIN", vbNullString)
    End If
    
    hm = GetSystemMenu(h, False)
    ID_mSepr = GetMenuItemID(hm, 5)
    
    RemoveMenu hm, SC_CLOSE, MF_BYCOMMAND
    RemoveMenu hm, ID_mSepr, MF_BYCOMMAND
End Sub

Có thể dùng cách Disable menu (EnableMenuItem hm, SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED) nhưng riêng với Excel thì không thể vì Excel luôn refresh lại SysMenu. Nên chỉ còn cách là remove menu Close.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Phải nói là rất hay.Mấy cái dòng public có tác dụng gì vậy
 
Upvote 0
Cái này em thấy chỉ mới không thoát được excel thôi chứ file hiện hành thì vẫn thoát được anh Tuân ah. Còn làm sao nó có thể tác động không cho đóng tất cả các file khác ( Nhưng câu lệnh chỉ để ở một file)
 
Upvote 0
Web KT

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

Back
Top Bottom