こんばんは。
本来は、「×ボタン」機能だけを取ればよいはずなのですが……。
'<ThisWorkbook モジュール>
Dim OptionValue As Boolean
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If OptionValue = False Then
Cancel = True
End If
End Sub
Sub KeyMacro_for_Quit()
'こちらのマクロを実行しないと終われない。
OptionValue = False
End Sub
もちろん、ボタン自体を消す方法は、ある程度VBAをやってきている人なら分ることですが、以下は、あまり好まれません。なお、「EnableFalse」「EnableTrue」が、実行ファイルです。
'<以下を全て標準モジュールに登録してください>
Private Declare Function GetSystemMenu Lib "user32.dll" ( _
ByVal hWnd As Long, _
ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32.dll" ( _
ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare Function DrawMenuBar Lib "user32.dll" ( _
ByVal hWnd 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 SC_CLOSE As Long = &HF060&
Private Const MF_BYCOMMAND As Long = &H0&
Private Sub CloseButtonEnabled(Swich As Boolean)
Dim hWnd As Long
Dim hMenu As Long
Dim rc As Long
'"XLMAIN" Excelのクラス名
'XL 2000 用
hWnd = FindWindow("XLMAIN", Application.Caption)
'XL 2002 用は、以下でも可能
'Application.Hwnd
If Swich Then
hMenu = GetSystemMenu(hWnd, 1&)
Else
hMenu = GetSystemMenu(hWnd, 0&)
rc = DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End If
rc = DrawMenuBar(hWnd)
End Sub
'----------------------------------
'実行ファイル
Sub EnableFalse()
'×をEnable Falseに
Call CloseButtonEnabled(False)
End Sub
Sub EnableTrue()
'×をEnable Trueに
Call CloseButtonEnabled(True)
End Sub
'----------------------------------
必要あって質問されているとは思いますが、当然のことですが、Application自体を終了させるためのプロシージャが作れないと、結果的にはトラブルの元になりますので、ご注意ください。簡単なロジックの問題なのですが、慣れないと分らなくなることがあります。
なお、私は、仮に終了ボタンをどこかに置いても、右上の終了×ボタンを殺したりしません。そういうブックの作成にめぐり合わないだけかもしれませんが。
補足
早速の回答ありがとうございます。実はその方法は試してみたんですが、sheetの表示、非表示がVBAでうまくいかなくなってしまうんです。 Worksheets("データ").Visible = True のところでエラーになってしまうんでなやんでいるんです。