次回からは表示しない(ユーザーフォーム)

次回から表示しない

ユーザーフォームに「次回から表示しない」チェックボックスを搭載する

f:id:akashi_keirin:20180220223500j:plain

こんなユーザーフォームを作って、実験してみた。

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にする方法が、これしか思い浮かばなかった。

f:id:akashi_keirin:20180220223500j:plain

ボタンクリック時のイベント処理だけ書いた。

<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にしてもいいと思うけれど、別にしてもしなくても一緒なので。

実行

f:id:akashi_keirin:20180220223714j:plain

シート上に呼び出し用のボタンを配置した。[フォーム表示]ボタンにはtestTestFormプロシージャ、[リセット]ボタンにはresetTestFormプロシージャを登録した。

[フォーム表示ボタンをクリック。]

f:id:akashi_keirin:20180220223724j:plain

フォームが表示された。[OK]ボタンクリックで、フォームが閉じる。

再度[フォーム表示]ボタンをクリック。

やはり、フォームが表示される。

f:id:akashi_keirin:20180220223745j:plain

今度は、「次回から表示しない」チェックボックスをオンして[OK]ボタンをクリック。

f:id:akashi_keirin:20180220223800j:plain

イミディエイトでcallCountとisDisplayableの状態を確認すると、この通り。

んで、[フォーム表示]ボタンをクリックしても、フォームは表示されない。

[リセット]ボタンをクリックして、再度イミディエイトで確認。

f:id:akashi_keirin:20180220223818j:plain

今度はこの通り。

そして、みたび[フォーム表示]をクリック。

f:id:akashi_keirin:20180220223825j:plain

再びフォームがよみがえった。

おわりに

ブックを閉じても、フォームが再表示されないようにするには、レジストリに登録とかする必要があるのかなあ。

@akashi_keirin on Twitter

追記

レジストリを使うヴァージョンはコチラ

akashi-keirin.hatenablog.com