マクロで利用する設定値(例えば、前回開いたファイルのパスや、ユーザーが入力した名前など)を、Excelファイルを閉じて再度開いた後も記憶しておきたい、という場合があります。
設定の保存は、非表示のシートに書き込む方法が一般的ですが、VBAにはWindowsの**「レジストリ」**という場所に、簡単な命令で設定を保存・読み込みするための専用機能が用意されています。
この記事では、SaveSetting
やGetSetting
といった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
)。
② 設定の読み込み: GetSetting
と GetAllSettings
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・そのユーザー限定の設定であるというスコープを正しく理解した上で、適切に利用しましょう。