【VBAリファレンス】VBA入門レジストリの操作(SaveSetting,GetSetting,GetAllSettings,DeleteSetting)

スポンサーリンク

### VBAによるレジストリ操作入門:SaveSetting, GetSetting, GetAllSettings, DeleteSettingの活用

#### 概要

Windowsオペレーティングシステムにおいて、レジストリはシステム設定やアプリケーションの設定情報を格納する重要なデータベースです。VBA(Visual Basic for Applications)は、このレジストリに対して直接的な操作を行うための便利な関数を提供しています。本記事では、VBAからレジストリを操作する基本的な関数である`SaveSetting`、`GetSetting`、`GetAllSettings`、`DeleteSetting`に焦点を当て、その機能、使い方、そして実務での応用例を詳細に解説します。これらの関数を理解し活用することで、VBAアプリケーションの設定情報を永続化したり、ユーザーごとの設定を管理したりすることが可能になります。

#### 詳細解説

VBAでレジストリを操作する主な関数は以下の4つです。これらは、Windowsレジストリの`HKEY_CURRENT_USER`配下の`Software`キーに、指定したアプリケーション名でサブキーを作成し、その中に設定情報を格納・取得・削除する機能を提供します。

##### 1. SaveSetting 関数

`SaveSetting`関数は、指定したキーとエントリに値を保存するために使用されます。

**構文:**

SaveSetting AppName, Section, Key, Setting

* `AppName`: 設定情報を保存するアプリケーションの名前です。通常、VBAプロジェクトの名前や、アプリケーション固有の名前を指定します。この名前を基に、レジストリの`HKEY_CURRENT_USER\Software`以下にサブキーが作成されます。
* `Section`: `AppName`で指定したキーの下に作成されるセクション(サブキー)の名前です。
* `Key`: `Section`で指定したキーの下に作成されるエントリ(値の名前)です。
* `Setting`: 保存したい値です。文字列、数値、ブール値など、様々なデータ型を保存できますが、レジストリに保存される際は文字列として扱われます。

**動作:**

* 指定された`AppName`、`Section`、`Key`が存在しない場合は、自動的に作成されます。
* 既に同じ`AppName`、`Section`、`Key`が存在する場合は、その値が上書きされます。
* 保存される値は、レジストリ上ではREG_SZ(文字列)型として格納されます。数値などを保存した場合も、文字列に変換されて格納されます。

**例:**

Sub SaveMySettings()
‘ アプリケーション名: “MyVBAApp”
‘ セクション名: “UserPreferences”
‘ キー名: “LastUser”
‘ 値: “Taro Yamada”
SaveSetting “MyVBAApp”, “UserPreferences”, “LastUser”, “Taro Yamada”

‘ 別の設定を保存
SaveSetting “MyVBAApp”, “UserPreferences”, “FontSize”, “12”
End Sub

このコードを実行すると、レジストリエディタで以下のパスに設定が保存されます。

`HKEY_CURRENT_USER\Software\MyVBAApp\UserPreferences`
* `LastUser` = `Taro Yamada`
* `FontSize` = `12`

##### 2. GetSetting 関数

`GetSetting`関数は、`SaveSetting`関数で保存した設定値を取得するために使用されます。

**構文:**

GetSetting(AppName, Section, Key, [Default])

* `AppName`: 設定値を取得したいアプリケーションの名前です。
* `Section`: 設定値を取得したいセクションの名前です。
* `Key`: 設定値を取得したいキーの名前です。
* `Default` (省略可能): 指定した`AppName`、`Section`、`Key`が存在しない場合に返されるデフォルト値です。この引数を省略し、キーが存在しない場合はエラーが発生します。

**動作:**

* 指定された`AppName`、`Section`、`Key`に対応する値を返します。
* 値は文字列として返されます。数値として扱いたい場合は、`CInt`や`CDbl`などで明示的に型変換する必要があります。
* `Default`引数を指定しておくと、キーが存在しない場合でもエラーにならず、指定したデフォルト値が返されるため、安全に値を取得できます。

**例:**

Sub GetMySettings()
Dim userName As String
Dim fontSize As Integer
Dim defaultUser As String
defaultUser = “Guest”

‘ 保存されたユーザー名を取得
‘ キーが存在しない場合は “Guest” を返す
userName = GetSetting(“MyVBAApp”, “UserPreferences”, “LastUser”, defaultUser)
MsgBox “ようこそ、” & userName & “さん!”

‘ 保存されたフォントサイズを取得し、数値に変換
‘ キーが存在しない場合は “10” を取得し、数値の10に変換
fontSize = CInt(GetSetting(“MyVBAApp”, “UserPreferences”, “FontSize”, “10”))
MsgBox “フォントサイズは ” & fontSize & ” です。”

‘ 存在しないキーを指定した場合の例
Dim companyName As String
companyName = GetSetting(“MyVBAApp”, “CompanyInfo”, “Name”, “Unknown Company”)
MsgBox “会社名: ” & companyName ‘ “Unknown Company” が表示される
End Sub

##### 3. GetAllSettings 関数

`GetAllSettings`関数は、指定したアプリケーションの特定のセクションに含まれる、すべてのキーとその値を取得するために使用されます。

**構文:**

GetAllSettings(AppName, Section)

* `AppName`: 設定値を取得したいアプリケーションの名前です。
* `Section`: 設定値を取得したいセクションの名前です。

**戻り値:**

2次元配列で返されます。配列の最初の次元はキーの名前、2番目の次元はキーの値に対応します。

* `array(0, n)`: n番目のキーの名前
* `array(1, n)`: n番目のキーの値

**動作:**

* 指定された`AppName`、`Section`に含まれるすべてのキーと値のペアを取得します。
* キーや値が存在しない場合、または`AppName`や`Section`が存在しない場合は、空の配列が返されます。

**例:**

Sub GetAllMySettings()
Dim settingsArray As Variant
Dim i As Integer

‘ “MyVBAApp” アプリケーションの “UserPreferences” セクションの全設定を取得
settingsArray = GetAllSettings(“MyVBAApp”, “UserPreferences”)

‘ 配列が空でないかチェック
If IsArray(settingsArray) Then
If UBound(settingsArray, 2) >= 0 Then ‘ 配列に要素があるか確認
MsgBox “UserPreferences の設定:”
For i = LBound(settingsArray, 2) To UBound(settingsArray, 2)
MsgBox “キー: ” & settingsArray(0, i) & “, 値: ” & settingsArray(1, i)
Next i
Else
MsgBox “UserPreferences に設定が見つかりませんでした。”
End If
Else
MsgBox “UserPreferences セクションが存在しないか、設定がありません。”
End If
End Sub

この例では、`UserPreferences`セクションに`LastUser`と`FontSize`というキーがあれば、それらが取得され、メッセージボックスに表示されます。

##### 4. DeleteSetting 関数

`DeleteSetting`関数は、レジストリに保存された設定値を削除するために使用されます。

**構文:**

DeleteSetting AppName, Section, [Key]

* `AppName`: 設定値を削除したいアプリケーションの名前です。
* `Section`: 設定値を削除したいセクションの名前です。
* `Key` (省略可能): 削除したいキーの名前です。この引数を省略すると、指定した`AppName`と`Section`の下にあるすべてのキーと値が削除されます。

**動作:**

* 指定された`AppName`、`Section`、`Key`に対応する設定値を削除します。
* `Key`引数を省略した場合、`AppName`と`Section`で指定されたセクション全体が削除されます。
* 指定したパスに該当するものが存在しない場合でも、エラーは発生しません。

**例:**

Sub DeleteMySettings()
‘ 特定のキーを削除
‘ “MyVBAApp” アプリケーションの “UserPreferences” セクションから “FontSize” キーを削除
DeleteSetting “MyVBAApp”, “UserPreferences”, “FontSize”
MsgBox “FontSize 設定を削除しました。”

‘ セクション全体を削除
‘ “MyVBAApp” アプリケーションの “UserPreferences” セクション全体を削除
‘ DeleteSetting “MyVBAApp”, “UserPreferences”
‘ MsgBox “UserPreferences セクション全体を削除しました。”

‘ アプリケーション全体を削除 (注意: 実際には Section は省略できないが、
‘ この構文で AppName 以下すべてを削除するわけではない。
‘ AppName を指定し、Section を省略するとエラーになる。
‘ AppName 以下すべてを削除するには、レジストリエディタで直接操作するか、
‘ VBAのFileSystemObjectなどと組み合わせて行う必要がある。
‘ ここでは、Section を省略して Key を削除しない形を想定する。)
‘ DeleteSetting “MyVBAApp”, “UserPreferences” ‘ これは UserPreferences セクションを削除する
End Sub

**注意点:** `DeleteSetting`関数で`AppName`のみを指定して、その直下にあるすべてのセクションを削除する直接的な方法はありません。`Section`を指定せずに`AppName`のみを指定した場合、エラーとなります。`AppName`直下のすべての設定を削除したい場合は、`GetAllSettings`でセクション一覧を取得し、各セクションに対して`DeleteSetting AppName, Section`を実行するか、レジストリエディタで手動削除する必要があります。

#### 実務アドバイス

##### 1. 設定情報の永続化

VBAアプリケーションでは、フォームのサイズや位置、 last used directory、ユーザー名、各種オプション設定など、アプリケーションの実行中に変更された設定を次回起動時にも引き継ぎたい場合があります。`SaveSetting`と`GetSetting`を組み合わせることで、これらの設定をレジストリに保存し、アプリケーションの起動時に読み込むことができます。

* **フォームの状態保存:** フォームの`Move`イベントなどで、フォームの`Left`、`Top`、`Width`、`Height`プロパティをレジストリに保存します。フォームの`Initialize`イベントなどで、保存した値を読み込み、フォームのプロパティに適用します。
* **ファイルパスの保存:** ユーザーが最後に開いたファイルや、よく使うフォルダのパスを保存しておくと、次回ファイルを開く際の利便性が向上します。

##### 2. ユーザーごとの設定管理

複数のユーザーが同じVBAアプリケーションを使用する場合、ユーザーごとに異なる設定を行いたいことがあります。`SaveSetting`関数で`AppName`にユーザー名を付加したり、`Section`をユーザーごとに分けたりすることで、ユーザーごとの設定を区別して管理できます。

例:
`SaveSetting “MyVBAApp_User_” & Environ(“USERNAME”), “Preferences”, “Theme”, “Dark”`
このように、Windowsの環境変数`USERNAME`を利用して、ユーザー固有の設定をレジストリに保存できます。

##### 3. 設定値のデフォルト値とエラーハンドリング

`GetSetting`関数で`Default`引数を必ず指定することを強く推奨します。これにより、設定値が存在しない場合でもエラーが発生せず、アプリケーションが正常に動作し続けることができます。また、数値として扱いたい設定値は、`CInt`や`CDbl`など適切な型変換関数を使用し、変換できない場合の処理(例えばデフォルト値に戻す)を考慮することが重要です。

##### 4. レジストリ操作の注意点

* **権限:** `HKEY_CURRENT_USER`配下のレジストリは、通常、現在のユーザーの権限で書き込み可能です。しかし、システム全体の設定に関わるキー(`HKEY_LOCAL_MACHINE`など)を操作するには、管理者権限が必要になります。VBAの`SaveSetting`系関数は、基本的には`HKEY_CURRENT_USER`配下を操作するため、管理者権限は不要な場合が多いですが、念のため注意が必要です。
* **レジストリの肥大化:** 設定情報を不必要に多く保存したり、頻繁に更新したりすると、レジストリが肥大化し、システム全体のパフォーマンスに影響を与える可能性があります。必要な情報のみを、適切なタイミングで保存するように心がけましょう。
* **バックアップ:** レジストリはシステムの根幹に関わる重要な情報源です。不用意な操作はシステムを不安定にする可能性があるため、レジストリの操作を行う前には、必ずバックアップを取得することを推奨します。
* **代替手段:** 設定情報が非常に多い場合や、複雑な構造を持つ場合は、レジストリではなく、INIファイルやXMLファイル、JSONファイルなどを利用した方が管理しやすいことがあります。VBAでもこれらのファイル操作は可能です。

##### 5. コードの可読性と保守性

レジストリ操作を行うコードは、`AppName`、`Section`、`Key`などの文字列を多用します。これらの文字列を直接コードに記述するのではなく、定数として定義したり、モジュールレベルの変数で管理したりすることで、コードの可読性と保守性を向上させることができます。

Private Const APP_NAME As String = “MyVBAApp”
Private Const SECTION_PREFERENCES As String = “UserPreferences”
Private Const KEY_LAST_USER As String = “LastUser”
Private Const KEY_FONT_SIZE As String = “FontSize”

Sub SaveLastUser()
SaveSetting APP_NAME, SECTION_PREFERENCES, KEY_LAST_USER, “CurrentUser”
End Sub

Sub LoadFontSize()
Dim fontSize As Integer
fontSize = CInt(GetSetting(APP_NAME, SECTION_PREFERENCES, KEY_FONT_SIZE, “10”))
‘ … フォントサイズを適用する処理 …
End Sub

##### 6. アプリケーションのアンインストール時の考慮

VBAアプリケーションをアンインストールする際に、レジストリに残った設定情報をクリーンアップすることも考慮すべきです。`DeleteSetting`関数を使用して、アプリケーションに関連するレジストリキーを削除する処理を、アンインストーラーに組み込むことが一般的です。

#### まとめ

`SaveSetting`、`GetSetting`、`GetAllSettings`、`DeleteSetting`関数は、VBAからWindowsレジストリを操作するための強力かつ簡便な手段を提供します。これらの関数を理解し、適切に活用することで、VBAアプリケーションの設定情報を永続化し、ユーザーエクスペリエンスを向上させることができます。

本記事では、各関数の基本的な構文と動作、そして実務における応用例や注意点について解説しました。設定情報の保存・読み込み、ユーザーごとの設定管理、アプリケーションのカスタマイズなど、様々な場面でこれらの関数が役立つはずです。

レジストリ操作は、システム設定に深く関わるため、その特性とリスクを十分に理解した上で、慎重に実装することが重要です。本記事が、VBAによるレジストリ操作の理解を深め、より高度なVBAアプリケーション開発の一助となれば幸いです。

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