VBA

【VBA ユーザーフォームで×ボタンを制御】

VBA ユーザーフォーム

ユーザーフォーム

皆さんは、ユーザーフォームを使っていますか?
ユーザーフォームは、とても簡単に作成でき、入力作業も行いやすくなりますので、重宝されている方も多いのではないでしょうか。

皆さんも基本的なフォームの作成等は、出来ているかと思いますので、個人的な備忘録を兼ねて、ユーザーフォームを更に便利に使いこなす技を、記事にしていきたいと思います。

通常、ユーザーフォームを作成する場合、閉じるボタンを作成することが多いと思います。

閉じる際に、何か処理を入れたりしてある場合、×ボタンで閉じられると最終処理が走らなくなってしまいます。

そこで、今回は×ボタンの制御と、ユーザーフォームを閉じる際に発生するイベントなどについて書いていきます。

内容は、とても簡単なので是非みなさんもコードを書いて、動作を確かめてください!!

×ボタンを押された際に発生するイベント

ユーザーフォームを閉じようとすると、UserFormのQueryCloseイベント が発生します。

構文

Private Sub UserForm_QueryClose(Cancel AsIntegerCloseMode As Integer)

このイベントは、ユーザーフォームが閉じる前に発生し、閉じられ方のステータスを 、引数CloseMode へ格納します。

引数の説明

定数説明
vbFormControlMenu0UserForm のコントロールメニューで [閉じる] コマンドを選択した。
vbFormCode1Unload ステートメントが呼び出された。
vbAppWindows2Windows が終了しようとしている。
vbAppTaskManager3タスク マネージャー によって閉じられた 。

このイベントは、ユーザーフォームが閉じる前に、完了していないタスクがユーザー フォームに含まれていないかどうかを確認するために使用されます。
 たとえば、ユーザーが UserForm 内の新しいデータを保存していない場合、データの保存を求めるメッセージを表示し注意を促すことが可能です。

ユーザーフォームが閉じるときに、QueryClose イベント を使用し、 Cancel プロパティを True に設定することで、閉じる動作を取り消すことができます。

サンプルコード

このコードだと【引数0】を指定していますのでフォーム上の×に対してのIFとなります 。

Cancelに【True】を指定することでフォームを閉じる動作をキャンセルします。

【False】を指定した場合は、通常通りフォームを閉じます。

×ボタンを消してしまう

あまりお勧めは出来ませんが、×ボタンを消してしまうことも可能です。

Win32Apiを使用する方法で、コードが少しわかりにくくなってしまいます。
また、Win32Apiを使用すると、コードが複雑化してしまいがちなので注意して下さい。

サンプルコードをVBEに張り付けて、使用してみてください。

標準モジュール

小難しいコードが並んでいるように感じますが、使用する関数を宣言しているだけです。

C++などで、DLLを自作して呼び出す時も、【Declare】を使用するので覚えておくと良いかもしれません。

UserForm1

上のサンプルでは、×ボタンが消えるだけでショートカットキーの【ALT+F4】を押されると閉じることが出来てしまいます。

私は、 QueryCloseイベントで処理を分岐するのが一番正解だと思います。

おまけ:フォームに最大化・最小化ボタンを付ける

これは殆ど必要ないかと思いますが、こういう動作をさせたい人の為にサンプルを載せておきます。

ユーザーフォーム

サイズ変更イベントにコメントを入れてありますが、最大化を行ってもコントロールのサイズは変更されません。

自分でコードを記述する必要があります。

ユーザーフォームの閉じるボタンの対策まとめ

ユーザーフォームを、閉じるボタンで閉じられなくすると、どうやってユーザーフォームを閉じるの? といった疑問が湧いてしまします。

だったら、ユーザーフォームを他のフォームに移動させる! ユーザーフォームを閉じる!そういったボタンを作成すればいいです。
もしくは、ファイルを終了させるボタンを作成すれば、問題は解決します。
もちろん、VBAで作成できます。
エクセルVBAで、ユーザーフォームを閉じるボタンで閉じられなくすると、うっかり、誤ってボタンを押してしまって、閉じてしまったという失敗が防げます。ボタンで、操作をコントロールすると、不要な動作を制御できます。

皆さんも是非、使ってみてください。