【Excel VBA】Windowsレジストリに設定を保存・読み込みする方法

マクロで利用する設定値(例えば、前回開いたファイルのパスや、ユーザーが入力した名前など)を、Excelファイルを閉じて再度開いた後も記憶しておきたい、という場合があります。

設定の保存は、非表示のシートに書き込む方法が一般的ですが、VBAにはWindowsの**「レジストリ」**という場所に、簡単な命令で設定を保存・読み込みするための専用機能が用意されています。

この記事では、SaveSettingGetSettingといったVBAの組み込みステートメントを使い、レジストリにマクロの設定を記録する方法を解説します。


目次

レジストリとは?

レジストリは、Windows自体や、インストールされたアプリケーションが、動作に必要な設定情報を記録しておくためのデータベースです。VBAからアクセスできる場所は、安全な特定の領域(HKEY_CURRENT_USER\Software\VB and VBA Program Settings)に限られています。


完成したVBAコード(保存・読み込み・削除)

以下は、レジストリに対する設定の「保存」「個別読み込み」「一括読み込み」「削除」という一連の操作を行うサンプルコードです。

' 設定をレジストリに保存するマクロ
Sub SaveSettingsToRegistry()

    ' SaveSetting AppName, Section, Key, Setting
    SaveSetting "MyExcelTool", "UserSettings", "UserName", "Taro Yamada"
    SaveSetting "MyExcelTool", "UserSettings", "LastLogin", CStr(Now())
    
    MsgBox "レジストリに設定を保存しました。"

End Sub


' レジストリから特定の設定を1つだけ読み込むマクロ
Sub GetSingleSettingFromRegistry()

    Dim userName As String
    
    ' GetSetting(AppName, Section, Key, [Default])
    userName = GetSetting("MyExcelTool", "UserSettings", "UserName", "Default User")
    
    MsgBox "レジストリから読み込んだユーザー名: " & userName

End Sub


' レジストリからセクション単位ですべての設定を読み込むマクロ
Sub GetAllSettingsFromRegistry()
    
    Dim allSettings As Variant
    Dim i As Long
    Dim message As String
    
    ' GetAllSettings(AppName, Section) は2次元配列を返す
    allSettings = GetAllSettings("MyExcelTool", "UserSettings")
    
    If IsEmpty(allSettings) Then
        message = "設定が見つかりませんでした。"
    Else
        message = "【UserSettings】の全設定:" & vbCrLf
        For i = LBound(allSettings, 1) To UBound(allSettings, 1)
            ' (i, 0)にKey, (i, 1)にSettingが格納されている
            message = message & allSettings(i, 0) & " = " & allSettings(i, 1) & vbCrLf
        Next i
    End If
    
    MsgBox message
    
End Sub


' レジストリの設定を削除するマクロ
Sub DeleteSettingsFromRegistry()

    ' DeleteSetting AppName, Section, [Key]
    ' Keyを省略すると、Sectionごと削除される
    DeleteSetting "MyExcelTool", "UserSettings"
    
    MsgBox "レジストリから設定を削除しました。"

End Sub

コードのポイント解説

① 設定の保存: SaveSetting

SaveSetting AppName, Section, Key, Setting 4つの引数を指定して、値をレジストリに書き込みます。

  • AppName: アプリケーション名(例: MyExcelTool)。レジストリ内のフォルダ名になります。
  • Section: 設定のカテゴリ(例: UserSettings)。サブフォルダ名になります。
  • Key: 設定項目の名前(例: UserName)。
  • Setting: 保存したい値(例: Taro Yamada)。

② 設定の読み込み: GetSettingGetAllSettings

  • GetSetting(AppName, Section, Key, [Default]): Keyを指定して、特定の値を1つだけ読み込みます。値が存在しない場合に返されるデフォルト値をDefault引数で指定できます。
  • GetAllSettings(AppName, Section): Section内のすべての設定をまとめて2次元配列として取得します。複数の設定を一度に読み込みたい場合に便利です。

③ 設定の削除: DeleteSetting

DeleteSetting AppName, Section, [Key] Keyを指定すればその項目だけが、Keyを省略すればSection全体が削除されます。


レジストリ利用時の重要な注意点

  • セキュリティ: レジストリに保存される値は暗号化されません。パスワードなどの機密情報は絶対に保存しないでください。
  • スコープ: 設定は、PCの現在のWindowsユーザーに対して保存されます。
    • Excelファイルを他のPCに移動しても、設定は引き継がれません。
    • 同じPCでも、別のWindowsユーザーがログインした場合は、その設定を読み込むことはできません。

この特性から、レジストリは「そのPCで、そのユーザーが使うとき」の個人的な設定(ウィンドウの位置やサイズ、前回入力した値など)を記憶させておくのに適しています。


まとめ

VBAに組み込まれたレジストリ操作命令を使えば、ユーザーの設定などをExcelファイルをまたいで永続的に保存できます。

  • 保存: SaveSetting
  • 読み込み: GetSetting / GetAllSettings
  • 削除: DeleteSetting

非表示シートによる設定保存に比べて、ユーザーが誤ってデータを消してしまうリスクがないという利点があります。ただし、そのPC・そのユーザー限定の設定であるというスコープを正しく理解した上で、適切に利用しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次