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

次回からは表示しない

さらにシンプルなコードにする

「もうええっちゅうねん!!!!!!!!」という声が聞こえてきそうだが、もう一本だけ。

前回

akashi-keirin.hatenablog.com

かなりシンプルになったコードだが、

ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")

というクソ長ったらしい記述が頻発するのがうっとうしい。

で、書き換えてみた。

DocumentProperty型というものがある

オブジェクトブラウザーでテキトーに調べていたら、

f:id:akashi_keirin:20180223223903j:plain

「DocumentProperties」というのがあった。「Item」なんていうメンバがあるし、このコレクションの要素っぽい

f:id:akashi_keirin:20180223223911j:plain

「DocumentProperty」クラスというのがあって、メンバを見ても

akashi-keirin.hatenablog.com

このときのリスト1とほぼ一致しているし、間違いないだろう、と。

要するに、

ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")

を変数にぶち込んでしまえばいいということだ。

ただ、標準モジュールとフォームモジュールをまたがることになるので、とりあえずPublic変数を使うことにした。

書き換えたコード

まずは宣言セクション。

リスト1
Option Explicit

Public myDocProp As DocumentProperty

DocumentProperty型の変数myDocPropを宣言する。

お次は、変数ぶち込み用プロシージャ。

スト2 標準モジュール
Private Sub setDocumentProperty()
  Set myDocProp = ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")
End Sub

フォーム呼び出し用プロシージャとリセット用プロシージャから呼び出すためのプロシージャ。Public変数にユーザー設定のドキュメントプロパティisDisplayableをぶち込む。

Set myDocProp = ThisWorkbook.CustomDocumentProperties.Item("isDisplayable")

を2回も書くのはブサイクなので、1箇所にまとめただけ。

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

リスト3 標準モジュール
Public Sub testTestForm()
  Call setDocumentProperty
  If myDocProp.Value Then TestForm.Show
End Sub

さらにカンタンになった。

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

リスト4 フォームモジュール
Private Sub ButtonOK_Click()
  If CheckBoxIsRedisplayable Then
    myDocProp.Value = False
  End If
  Unload Me
End Sub

これまたおっそろしくカンタン。

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

リスト5 標準モジュール
Public Sub resetTestForm()
  Call setDocumentProperty
  With myDocProp
    If Not .Value Then .Value = True
  End With
End Sub

これまたry

これもちゃんと動く。

おわりに

最初に比べてめちゃくちゃシンプルになって、ちょっとビックリしている。

まあ、Public変数を使っているあたりがイマイチなんだろうけれど。

@akashi_keirin on Twitter

追記

実は、第5弾がありますw

akashi-keirin.hatenablog.com