【ExcelVBA・マクロ】GetSetting/SaveSettingの使い方|マクロの設定をレジストリに保存する方法【コピペOK】

ExcelVBA

ExcelマクロやVBAツールを配布していると、「前回開いたフォルダを覚えていてほしい」「チェックボックスの選択状態を次回起動時も保持したい」という場面によく出会います。こうしたユーザー設定の保存には、テキストファイルやセルを使う方法もありますが、実はVBAには設定の保存専用の命令としてSaveSettingステートメントGetSetting関数が標準で用意されています。

この記事では、SaveSetting・GetSettingの基本的な使い方から、実務でよくある「前回のフォルダパスを記憶する」「オプション設定を保持する」といった具体例、関連するGetAllSettings関数・DeleteSettingステートメントの使い方まで、コピペで使えるサンプルコード付きで解説します。

スポンサーリンク
スポンサーリンク

SaveSetting・GetSettingとは

SaveSetting・GetSettingは、VBAの設定情報をレジストリの以下の場所に保存・取得する命令です。

HKEY_CURRENT_USER\Software\VB and VBA Program Settings\

ファイルを別途用意する必要がなく、マクロ内の数行だけでユーザーごとの設定を保存できるのが最大のメリットです。基本構文は以下の通りです。

' 設定を保存する
SaveSetting AppName:="MyMacroTool", Section:="Options", Key:="LastFolder", Setting:="C:\Data"

' 設定を取得する(第4引数は設定が存在しない場合の既定値)
Dim savedPath As String
savedPath = GetSetting(AppName:="MyMacroTool", Section:="Options", Key:="LastFolder", Default:="")
  • AppName:アプリ(マクロツール)を識別する名前。他のツールと重複しないよう、ある程度具体的な名前にするのがポイントです
  • Section:設定をグループ分けするための名前(「Options」「Window」など任意)
  • Key:個々の設定項目名
  • Setting:保存する値(文字列型に変換されて保存されます)

具体例1:前回使用したフォルダパスを記憶する

ファイル選択ダイアログを開くたびに、毎回同じフォルダまでクリックし直すのは地味に手間がかかります。以下のコードは、直前に選択したフォルダを記憶し、次回はそのフォルダから選択を開始する例です。

Sub SelectFileWithMemory()

    Const APP_NAME As String = "MyExcelTool"
    Dim lastFolder As String
    Dim fd As FileDialog
    Dim selectedPath As Variant

    ' 前回保存したフォルダパスを取得(未保存ならCドライブ直下)
    lastFolder = GetSetting(APP_NAME, "Paths", "LastFolder", "C:\")

    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    fd.InitialFileName = lastFolder

    If fd.Show = -1 Then
        selectedPath = fd.SelectedItems(1)
        MsgBox "選択されたファイル: " & selectedPath

        ' 選択したファイルのフォルダ部分を次回用に保存
        SaveSetting APP_NAME, "Paths", "LastFolder", Left(selectedPath, InStrRev(selectedPath, "\"))
    End If

End Sub

InStrRev関数で最後の「\」の位置を探し、フォルダ部分だけを切り出して保存している点がポイントです。

具体例2:オプション設定(チェックボックスの状態)を保存する

ユーザーフォームのチェックボックスやオプションボタンの状態を、フォームを閉じても保持したい場合にも便利です。

Private Const APP_NAME As String = "MyExcelTool"

' フォームを閉じるときに設定を保存
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    SaveSetting APP_NAME, "Options", "AutoBackup", CBool(chkAutoBackup.Value)
    SaveSetting APP_NAME, "Options", "ShowWarning", CBool(chkShowWarning.Value)
End Sub

' フォームを開くときに前回の設定を復元
Private Sub UserForm_Initialize()
    chkAutoBackup.Value = CBool(GetSetting(APP_NAME, "Options", "AutoBackup", "True"))
    chkShowWarning.Value = CBool(GetSetting(APP_NAME, "Options", "ShowWarning", "True"))
End Sub

GetSettingで取得した値は文字列型になるため、チェックボックスのValueプロパティに渡す前にCBool関数でBoolean型に変換している点に注意してください。

保存済みの設定を一括取得・削除する

保存した設定を管理するために、GetAllSettings関数とDeleteSettingステートメントも用意されています。

Sub ShowAllSettings()

    Dim settings As Variant
    Dim i As Long

    ' 指定したSection内の全設定を2次元配列として取得
    settings = GetAllSettings("MyExcelTool", "Options")

    If IsEmpty(settings) Then
        MsgBox "保存された設定はありません"
        Exit Sub
    End If

    Dim msg As String
    For i = LBound(settings, 1) To UBound(settings, 1)
        msg = msg & settings(i, 0) & " = " & settings(i, 1) & vbCrLf
    Next i

    MsgBox msg

End Sub

Sub ResetAllSettings()
    ' AppName全体の設定をまとめて削除
    On Error Resume Next
    DeleteSetting "MyExcelTool"
    On Error GoTo 0
    MsgBox "設定をリセットしました"
End Sub

GetAllSettingsが返す配列は、(0)列にキー名、(1)列に値が入る2次元配列です。設定が1つも保存されていない場合はEmptyが返るため、IsEmptyでチェックしてからループ処理する必要があります。

使用する際の注意点

  • AppNameは他のマクロと重複しない名前にする:AppNameが被ると、別のツールの設定を上書き・参照してしまう可能性があります。会社名やツール名を含めるなど、ある程度ユニークな名前にしましょう
  • 保存先はレジストリなので大量データ向きではない:あくまで小さな設定値の保存用です。大量データやテーブル形式のデータを保存したい場合は、INIファイルやシートへの保存を検討してください
  • 配布先PCごとに設定が独立する:レジストリはPC(正確にはユーザーアカウント)ごとに保存されるため、他のPCへブックをコピーしても設定は引き継がれません

まとめ

SaveSetting・GetSettingを使うと、外部ファイルを用意することなく、数行のコードだけでユーザーごとの設定を保存・復元できます。前回のフォルダパスの記憶や、フォームのオプション状態の保持など、ちょっとした「気の利いたマクロ」を作りたいときにぜひ活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました