レジストリを使う(2)

レジストリを削除する

今回は、前回の

akashi-keirin.hatenablog.com

のマクロに、レジストリ削除機能を付加する。

レジストリの削除

『VBAエキスパート 公式テキスト ExcelVBAスタンダード』の206ページによると、

レジストリのデータを削除するには、DeleteSettingステートメントを使います。DeleteSettingステートメントの書式は次の通りです。

DeleteSetting アプリケーション名, セクション名, キー名, データ

引数「セクション名」と「キー名」は省略可能です。
引数「キー名」を指定した場合は、指定したキーを削除します。引数「キー名」を省略した場合は、引数「セクション名」で指定したセクション全体を削除します。
引数「セクション名」と「キー名」の両方を省略すると、引数「アプリケーション名」で指定したフォルダを削除します。

ということなので、新たにこのマクロで作成するレジストリを根こそぎ削除するようにする。

全体的にコードを見渡してみると、オブジェクト名とか、命名に少し乱れがあったので、変えたところがある。

過去記事にさかのぼって改めるのはメンドウなので、ここで一括して修正しておく。

そのため、今回はフォームの姿形から、全て載っけておく。

オブジェクト・コード全体

フォーム

まずは、フォーム。

f:id:akashi_keirin:20180225090734j:plain

オブジェクト名は「TestForm」にしている。

コントロールは、

の3つ。カッコ内はオブジェクト名。チェックボックスの名前が、役割と合っていなかったので、ちょっと変えた。英語が正しいかどうかは知らんけどw この辺、少々ややこしくても、意味的(論理的?)に正しい名前にしておかないと、後々混乱の種になると思う。

リスト1 標準モジュール

Propertyプロシージャ1セット。

Option Explicit

Public Property Let isDisplayable(ByVal isDisplayable_ As Boolean)
  If isDisplayable_ Then
    Call SaveSetting("FormTest", "TestForm", "isDisplayable", "True")
  Else
    Call SaveSetting("FormTest", "TestForm", "isDisplayable", "False")
  End If
End Property

Public Property Get isDisplayable() As Boolean
  isDisplayable = CBool(GetSetting("FormTest", "TestForm", "isDisplayable", "True"))
End Property

レジストリ内のフォルダ名を変えた。

  • アプリケーション名:マクロ全体
  • セクション名:設定対象オブジェクト
  • キー名:設定値の種類

だいたいこんな感じが汎用性あるかな?

スト2 標準モジュール

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

Public Sub testTestForm()
  If isDisplayable Then TestForm.Show
End Sub

初めてフォームを呼び出すときや、レジストリを削除した直後は、「isDisplayable」というレジストリ・キーが存在しないわけだが、GetSetting関数の既定値(第4引数)を"True"にしているので、レジストリ・キーが未作成の場合には「isDisplayable」プロパティがTrueになる、という仕掛け。

GetSetting関数の第4引数の意味がここで分かった。

リスト3 フォームモジュール

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

Private Sub ButtonOK_Click()
  If CheckBoxIsUnRedisplayable Then isDisplayable = False
  Unload Me
End Sub

チェックボックスのオブジェクト名を変えたので、それに伴って少しだけ記述が変わっている。

直訳すれば、「再表示不能チェックボックス」の値がTrueならば「表示可能」プロパティをFalseにせよという非常にややこしいコードだが、少々ややこしくてもかまわないと思う。

リスト4 標準モジュール

チェックボックスリセット用プロシージャ。

Public Sub resetTestForm()
  isDisplayable = True
End Sub

まあ、とにかくisDisplayableがTrueになればいいんだから、条件分岐をやめた。

リスト5 標準モジュール

最後は、今回初お目見えのレジストリ削除用プロシージャ

Public Sub deleteRegistryTestForm()
  Call DeleteSetting("FormTest")
End Sub

このマクロに関するレジストリを根こそぎ削除するために、第1引数のみを指定。

結果的に、ほとんどのプロシージャが1行。超絶シンプルになった。

実行

f:id:akashi_keirin:20180225090742j:plain

「次回から表示しない」をチェックして[OK]をクリックすると、

f:id:akashi_keirin:20180225090750j:plain

レジストリはこんな状態。値が"False"になっている。

[リセット]ボタンをクリックすると、

f:id:akashi_keirin:20180225090805j:plain

レジストリはこの通り。"True"になっている。

で、

f:id:akashi_keirin:20180225090819j:plain

[レジストリ削除]ボタンをクリックすると、

f:id:akashi_keirin:20180225090827j:plain

きれいサッパリ!

おわりに

登録、取得、削除、この3つをわきまえていれば、割とカンタンに利用できるなあ。

ただ、今回やったような用途だったら、やはりブックごとに管理すべきステータスであって、レジストリに登録するのはあまりオススメできませんなあ。どうなんでしょ。

ちなみに、一度レジストリを削除して、再度登録したとき、レジストリエディタに現れてくれないことがあるみたいですが、レジストリエディタの「編集」→「検索」でアプリケーション名なり、セクション名なり、キー名で検索すれば、無事出現します。私は今回これでちょっとハマりました。

@akashi_keirin on Twitter