レジストリを使う

レジストリに値を保存する

今回は、前回の

akashi-keirin.hatenablog.com

のisDisplayableプロパティを、レジストリで管理するように変更する。

レジストリへの値の書き込み

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

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

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

引数「アプリケーション名」には、一般的にプログラム名や企業名などを指定します。
引数「セクション名」はデータを保存するフォルダ名に該当します。
引数「キー名」がファイル名に相当し、その中に記録される内容が引数「データ」となります。

ということなので、isDisplayableの値を変更する処理、つまりProperty Letの中身をSaveSettingに置き換えたら良いことになる。

f:id:akashi_keirin:20180224154332j:plain

ただ、画像でも分かるように、最後の引数「データ」はString型みたい。

そこを踏まえてProperty Letプロシージャを書き換える。

リスト1 標準モジュール
Public Property Let isDisplayable(ByVal isDisplayable_ As Boolean)
  If isDisplayable_ Then
    Call SaveSetting("FormSettings", "Displaying", "isDisplayable", "True")
  Else
    Call SaveSetting("FormSettings", "Displaying", "isDisplayable", "False")
  End If
End Property

Propertyプロシージャに渡された引数、すなわち、isDisplayableプロパティを使うコード内での

isDisplayable = 

の「=」の右側にTrueが来るかFalseが来るかによってSaveSettingステートメントの第4引数を切り替える。

第4引数はString型のようなので、ブール値ながら文字列で渡す。

レジストリからの値の取得

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

レジストリに登録されているデータを取得するには、GetSetting関数を使います。GetSetting関数の書式は次の通りです。

GetSetting(アプリケーション名, セクション名, キー名, 既定値)

引数「アプリケーション名」、引数「セクション名」引数「キー名」は、SaveSettingステートメントで指定するデータと同じです。実行すると、引数「キー名」で指定したキーに登録されているデータを返します。引数「既定値」は省略可能です。引数「キー名」で指定したキーが存在しないときに返す値を指定します。

ということなので、Property GetをGetSettingで書き換える。

スト2 標準モジュール
Public Property Get isDisplayable() As Boolean
  isDisplayable = CBool(GetSetting("FormSettings", "Displaying", "isDisplayable", "True"))
End Property

レジストリから取得する値はString型のようなので、一応Boolean型にキャストすることにしている。

書き換えるのはこれだけ。

isDisplayableプロパティを読み書きする立場からは見えない世界でのできごとなので、メインのコード3種(フォーム呼び出し用プロシージャ・フォームのボタンクリック時のイベントプロシージャ・リセット用プロシージャ)を書き換える必要はない。

カプセル化」の威力ってやつですかね?

実行

何ら問題なく実行できた。

ついでに、みたび『VBAエキスパート 公式テキスト ExcelVBAスタンダード』の202ページによると、

Excel VBAの命令で操作できるのは、レジストリ内で

HKEY_CURRENT_USER\Software\VB and VBA Program Settings

の配下に限定されます。

とのこと。

最初、レジストリエディタを開いたときに「Software」フォルダの中に「VB and VBA Program Settings」フォルダがなくて、かなり焦りましたが、SaveSettingステートメント実行後、再び見に行ったら、

f:id:akashi_keirin:20180224154343j:plain

このようにちゃんとありました。

おわりに

レジストリ」というと、初心者にはどうしても敷居の高いものに感じられるが、こういう使い方なら割と気軽に使えるような気がした。

@akashi_keirin on Twitter

追記

登録したレジストリの削除についてはコチラ。

akashi-keirin.hatenablog.com