' [338.xls] ' [Module1] のコード '★★☆ ユーザーフォームを移動不可にする ☆★★ Option Explicit 'システムメニューのウインドウハンドルを取得 Declare Function GetSystemMenu Lib "user32" _ (ByVal hwnd As Long, ByVal bRevert As Long) As Long 'メニュー項目を削除する Declare Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Public Const MF_BYCOMMAND = &H0& Public Const SC_MOVE = &HF010 'ユーザーフォームのハンドル取得する Declare Function GetActiveWindow Lib "user32" () As Long 'ユーザーフォームの終了方法を判断するフラグ Public agin As Boolean 'ユーザーフォームの位置を保存する為の配列 Public myposition(1, 1) As Single Sub start() '最初はフラグを閉じて開始 agin = False myloop: 'ユーザーフォームを起動 UserForm1.Show 'フラグが立っていたら(ユーザーフォームの終了が×ボタンからではない場合) '"myloop"へジャンプして再度ユーザーフォームを起動 If agin = True Then GoTo myloop End Sub ' [UserForm1] のコード Option Explicit Private Sub CommandButton1_Click() Dim syshwnd As Long Dim idoufuka As Long Dim hwnd As Long If CommandButton1.Caption = "フォームの移動可能" Then 'ユーザーフォームのハンドル取得 hwnd = GetActiveWindow 'ユーザーフォームのハンドルからシステムメニューのハンドルを取得 syshwnd = GetSystemMenu(hwnd, 0&) 'システムメニューの「移動(M)」を削除 'ここでユーザーフォームの移動を不可にしています idoufuka = RemoveMenu(syshwnd, SC_MOVE, MF_BYCOMMAND) CommandButton1.Caption = "フォームの移動不可能" Else 'ユーザーフォームの移動が出来ないときはフラグを立てる agin = True 'ユーザーフォームの現在値を配列に格納 myposition(1, 0) = Me.Top myposition(0, 1) = Me.Left '一旦終了する Unload Me End If End Sub Private Sub UserForm_Initialize() 'ユーザーフォーム起動時にフラグを検査 If agin = True Then 'ユーザーフォームが移動不可だったとき 'ユーザーフォームを自由な位置で起動出来るモードに設定 Me.StartUpPosition = 0 '配列にある数値の位置にユーザーフォームを移動 Me.Top = myposition(1, 0) Me.Left = myposition(0, 1) Else 'ユーザーフォームが最初の起動の場合画面の中央に移動するモードに設定 Me.StartUpPosition = 2 End If End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'ユーザーフォームの×ボタンが押されたか判断 'ユーザーフォームの×ボタンが押された時は"CloseMode"は 0 を返します If CloseMode = 0 Then '×ボタンが押されたときはフラグを閉じる agin = False End If End Sub