次回からは表示しない(ユーザーフォーム)
次回から表示しない
ユーザーフォームに「次回から表示しない」チェックボックスを搭載する
こんなユーザーフォームを作って、実験してみた。
VBAでは、クラスにstatic変数を持たせることができない(んですよね?)ので、Public変数で代用することにした。
リスト1 標準モジュールの宣言セクション
Public isDisplayable As Boolean Public calledCount As Integer
フォーム表示可能かどうかを表すBoolean型のisDisplayableと、呼び出された回数をカウントするcalledCountをPublic変数として用意した。
続いて、フォーム呼び出し用プロシージャ。
リスト2 標準モジュール
Public Sub testTestForm() calledCount = calledCount + 1 If calledCount = 1 Then isDisplayable = True If isDisplayable Then TestForm.Show End Sub
初めてフォームを呼び出したときに、isDisplayableをTrueにする方法が、これしか思い浮かばなかった。
ボタンクリック時のイベント処理だけ書いた。
<h5 "list3">リスト3 フォームモジュール
Private Sub ButtonOK_Click() If CheckBoxIsRedisplayable Then isDisplayable = False Unload Me End Sub
たったこれだけ。
ボタンがクリックされたときに、チェックボックスを調べ、チェックされていたらisDisplayableをFalseにして、フォームをUnloadする。
これで、チェックしてから[OK]をクリックしてフォームを閉じたら、金輪際フォームは表示されないことになる。
ただ、このままだと、一度チェックボックスをオンにして閉じると、ブックを閉じて開き直さないと再びフォームを開くことができないので、リセット用のプロシージャも用意した。
リスト4 標準モジュール
Public Sub resetTestForm() calledCount = 0 End Sub
calledCountを「0」にしているだけ。isDisplayableをFalseにしてもいいと思うけれど、別にしてもしなくても一緒なので。
実行
シート上に呼び出し用のボタンを配置した。[フォーム表示]ボタンにはtestTestFormプロシージャ、[リセット]ボタンにはresetTestFormプロシージャを登録した。
[フォーム表示ボタンをクリック。]
フォームが表示された。[OK]ボタンクリックで、フォームが閉じる。
再度[フォーム表示]ボタンをクリック。
やはり、フォームが表示される。
今度は、「次回から表示しない」チェックボックスをオンして[OK]ボタンをクリック。
イミディエイトでcallCountとisDisplayableの状態を確認すると、この通り。
んで、[フォーム表示]ボタンをクリックしても、フォームは表示されない。
[リセット]ボタンをクリックして、再度イミディエイトで確認。
今度はこの通り。
そして、みたび[フォーム表示]をクリック。
再びフォームがよみがえった。
おわりに
ブックを閉じても、フォームが再表示されないようにするには、レジストリに登録とかする必要があるのかなあ。
追記
レジストリを使うヴァージョンはコチラ