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

変数の値を保存する

WorkbookオブジェクトのCustomDocumentPropertiesコレクションを使う

前回

akashi-keirin.hatenablog.com

の続き。

変数の値を保存するには、

  • シートに書き込む
  • テキストファイルに書き込む
  • レジストリに書き込む

ぐらいしか方法がないと思っていたが、チョー有名なOffice TANAKAさんのサイト

CustomDocumentPropertiesコレクション

というものの存在を知った。

これならできそうだ!

邪道かもしれんけどw

コーディング

まずは、イミディエイトで以下のコードを実行する。

リスト1 イミディエイトウインドウに入力
Thisworkbook.CustomDocumentProperties.Add Name:="isDisplayable", _
                                          LinkToContent:=False, _
                                          Type:=msoPropertyTypeBoolean, _
                                          Value:=True

コイツを入力して、[Enter]を押すと、このWorkbookに、「isDisplayable」という

ユーザー設定のドキュメントプロパティ

とやらが設定される模様。

Addメソッドの引数ValueにTrueを指定しているので、既に値はTrueになっている。

f:id:akashi_keirin:20180221220044j:plain

f:id:akashi_keirin:20180221220053j:plain

ほらね。

これで準備はおk

お次はフォーム呼び出し用のプロシージャ。

スト2 標準モジュール
Option Explicit

Public isDisplayable As Boolean
Public calledCount As Integer

Public Sub testTestForm()
  calledCount = calledCount + 1
  If calledCount = 1 Then isDisplayable = True
  With ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")    '……(1)'
    If Not .Value Then isDisplayable = False
  End With
  If isDisplayable Then TestForm.Show    '……(2)'
End Sub

さきほど設定したユーザー設定のドキュメントプロパティには、

ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")

でアクセス可。

(1)からの3行

With ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")
  If Not .Value Then isDisplayable = False
End With

では、ユーザー設定のドキュメントプロパティ「isDisplayable」がFalseだったら、Public変数の「isDisplayable」をFalseにする。

(2)の

If isDisplayable Then TestForm.Show

では、Public変数の「isDisplayable」の値を調べ、Trueだったらフォームを呼び出すようにしている。

同じ名前にしてしまったのでややこしいが、ユーザー設定のドキュメントプロパティ「isDisplayable」がFalseだったら、ユーザーフォームは呼び出されない、ということになる。

お次は、フォームのボタンクリック時の処理。

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

チェックボックスにチェックが入っていたら、Public変数の「isDiplayable」をFalseにするとともに、ユーザー設定のドキュメントプロパティ「isDisplayable」もFalseにして、フォームを閉じる。

従って、チェックボックスにチェックを入れて[OK]をクリックすると、ユーザー設定のドキュメントプロパティ「isDisplayable」がFalseになるので、リスト2のフォーム呼び出しプロシージャを実行してもフォームは表示されないことになる。

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

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

もはや解説不要だとは思うけれど、(3)からの3行

With ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")
    If Not .Value Then .Value = True
  End With

で、ユーザー設定のドキュメントプロパティ「isDisplayable」がFalseだったら、値をTrueにするようにしている。

これで、次にフォーム呼び出しプロシージャを実行したときには、再びフォームが表示されることになる。

実行

画像を貼るのがめんどくさいので省略。

一度チェックボックスをオンにして[OK]をクリックしたら、ブックを閉じて開き直しても、もはやフォームが表示されることはなくなった。

もちろん、[リセット]ボタンをクリックしたら復活しますが。

おわりに

でもたぶん、邪道・大仁田厚

なやり方なんだろうね。

@akashi_keirin on Twitter

追記

いろいろマヌケなことをしていることに気づいたので、慌てて修正しましたw

akashi-keirin.hatenablog.com

んで、最新版がコチラ。

akashi-keirin.hatenablog.com

レジストリ使用版もあります。

akashi-keirin.hatenablog.com