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

f:id:akashi_keirin:20180217113941p:plain

結局……

WorkbookオブジェクトのCustomDocumentPropertiesコレクションを使うんだから、もはやPublic変数は必要なかった、という話。

akashi-keirin.hatenablog.com

今回使用するユーザーフォームについては、コチラの記事をどうぞ。

コードの修正

前回

akashi-keirin.hatenablog.com

のコードを修正する。

メンドクサイので、いきなり修正後のコードを列挙する。

まずは、フォーム呼び出し用プロシージャ。

リスト1 標準モジュール
Public Sub testTestForm()
  If ThisWorkbook.CustomDocumentProperties.Item("isDisplayable").Value Then _
    TestForm.Show
End Sub

なんと、たったのこれだけ。実質1行w

ユーザー設定のドキュメントプロパティisDisplayableがTrueのときだけフォームを呼び出す。

C#みたいにusingが使えたら、もっとカンタンに書けるのに。

んで、お次はフォームのボタンクリック時のイベントプロシージャ。

スト2 フォームモジュール
Private Sub ButtonOK_Click()
  If CheckBoxIsRedisplayable Then
    ThisWorkbook.CustomDocumentProperties.Item("isDisplayable").Value = False
  End If
  Unload Me
End Sub

これまたたったのこれだけ。ボタンクリック時にチェックボックスの値を調べ、チェックボックスの値がTrueだったら、ユーザー設定のドキュメントプロパティisDisplayableをFalseにする。

あとは、リセット用のプロシージャ。

リスト3 標準モジュール
Public Sub resetTestForm()
  With ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")
    If Not .Value Then .Value = True
  End With
End Sub

これまたたったのこれだけ。

ユーザー設定のドキュメントプロパティisDisplayableがFalseの場合にTrueに戻す。

これで、呼び出せなくなっていたフォームが再び呼び出し可能になる。

おわりに

Excelの場合、保持しておきたいデータはワークシートに書き込んでおけば良いのだから、基本的にこんなアクロバチックなことはせんでも良いと思うが、こんな方法もあるのだなあ、ということで。

次はレジストリもやってみようかなあ。割と簡単そうだし。

@akashi_keirin on Twitter