Excel VBAに効く Vitamin E
ExcelのUserFormの「X」ボタンを無効にしたり、消したりします。
User Form の「X」ボタンを無効にしたり、消したりします。User Formを勝手にUnloadさせたくない場合に使ってください。
このソースは み〜くんパパの仕事部屋 を参考にさせていただいています。
 


'(標準モジュール)
Option Explicit

'----------------------------------------------------------------------
'クラス名またはキャプションタイトルを与えてウィンドウハンドルを取得する関数
'戻り値 成功 = 指定したクラスとウィンドウ名を持つウィンドウのハンドル
' 失敗 = NULL
'----------------------------------------------------------------------
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'----------------------------------------------
'ウィンドウに関する情報を取得する関数
'戻り値 成功 = 要求したデータ(32ビット値)
' 失敗 = 0
'----------------------------------------------
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

'----------------------------------------------
'ウィンドウのメニューバーを再描画する関数
'戻り値 成功 = 0以外
' 失敗 = 0
'----------------------------------------------
Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long

'--------------------------------------------------------------------------
'ウィンドウメニュー(システムメニューまたはコントロールメニューとも呼ばれる)のハンドルを取得する関数
'戻り値 bRevert パラメータが FALSE = ウィンドウメニューのコピーのハンドル
' bRevert パラメータが TRUE = NULL
'--------------------------------------------------------------------------
Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long

'--------------------------------------------------------------------------
'メニューからメニュー項目を削除する関数
'戻り値 成功 = 0以外
' 失敗 = 0
'--------------------------------------------------------------------------
Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

'----------------------------------------------
'ウィンドウの属性を変更する関数
'戻り値 成功 = 変更前の値
' 失敗 = 0
'----------------------------------------------
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Const GWL_STYLE = -16& 'ウィンドウスタイルを取得する
Public Const WS_SYSMENU = &H80000 'タイトルバーにコントロールメニューボックスを持つウィンドウ
Public Const SC_CLOSE = &HF060&
Public Const MF_BYCOMMAND = &H0&

'コントロールメニューを有効/無効
Sub LsSetWindowLong(strCaption As String, flg As Boolean)
  Dim hwnd As Long
  Dim lngGetWindowLong As Long
  Dim lngRtn As Long

  'ウィンドウのハンドルを取得
  hwnd = FindWindow(vbNullString, strCaption)

  'ウィンドウに関する情報を取得
  lngGetWindowLong = GetWindowLong(hwnd, GWL_STYLE)

  If flg Then
    lngGetWindowLong = lngGetWindowLong Or WS_SYSMENU
  Else
    lngGetWindowLong = lngGetWindowLong And (Not WS_SYSMENU)
  End If
  'ウィンドウの属性を変更
  lngRtn = SetWindowLong(hwnd, GWL_STYLE, lngGetWindowLong)

  'ウィンドウのメニューバーを再描画
  lngRtn = DrawMenuBar(hwnd)
End Sub

'コントロールメニュー[×]ボタンを有効/無効
Sub LsDeleteMenu(strCaption As String, flg As Boolean)
  Dim hwnd As Long
  Dim hMenu As Long
  Dim lngRtn As Long

  hwnd = FindWindow(vbNullString, strCaption)

  If flg Then
    'ウィンドウメニューをリセットする
    hMenu = GetSystemMenu(hwnd, 1&)
  Else
    'ウィンドウに関する情報を取得
    hMenu = GetSystemMenu(hwnd, 0&)
    '[閉じる]ボタンを無効にする
    lngRtn = DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
  End If

  'ウィンドウのメニューバーを再描画
  lngRtn = DrawMenuBar(hwnd)
End Sub
XlsFormNonX.xlsのダウンロード(XlsFormNonX.LZH)

(UPD:03/06/26)