#154 Accessのレジストリ情報を直接書き換える方法 VBA、API

AccessのVBAによるレジストリ操作というと、レジストリに値を保存するSaveSettingステートメントと、保存されている値を読み出すGetSetting関数がありますが、これらはともに

  HKEY_USERS\.Default\Software\VB and VBA Program Settings

というキーの下が対象になります(「#060 フォームを前回閉じたときのプロパティ値を復元するには?」を参照)。


しかし、これ以外のキーを書き換えたいという場合にはどうしたらよいのでしょうか?。それには、Windows APIを使います。

Accessのオプション画面次の例では、Accessのオプションの[全般]タブにある「既定のデータベース フォルダ」の現在値をイミディエイトウィンドウに表示したあと、"C:\My Documents"に書き換えてみます。
このオプション値は、レジストリの、

 HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Access\Settings\

というキーの「Default Database Directory」という値に保存されています。
レジストリエディタで見た内容


まず、Windows APIを使うための宣言として、標準モジュールに次のコードを記述します。"Declare"の前に"Private"を付けることによってフォームのモジュールにも記述できます。
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
      (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
      (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
      lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
      (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
      ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" _
      (ByVal hKey As Long) As Long
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_CURRENT_USER = &H80000001
Const ERROR_SUCCESS = 0&
Const REG_SZ = 1

次のコードが実際にレジストリの書き換えを行うサンプルプロシージャです。
Sub RegTest()
'レジストリ書き換えのサンプル

  Dim lngKey As Long
  Dim strRegData As String
  Dim strNewData As String
  Const cBufferSize As Long = 256
  'キー
  Const cstrRegKey As String = "Software\Microsoft\Office\9.0\Access\Settings\"
  'サブキー(値)
  Const cstrSubKey As String = "Default Database Directory"
  
  'レジストリキーをオープン
  If RegOpenKey(HKEY_CURRENT_USER, cstrRegKey, lngKey) = ERROR_SUCCESS Then
    '現在のデータを取得
    RegQueryValueEx lngKey, cstrSubKey, 0&, 0&, ByVal 0&, cBufferSize
    strRegData = String$(cBufferSize, vbNullChar)
    If RegQueryValueEx(lngKey, cstrSubKey, 0&, 0&, _
                        ByVal strRegData, cBufferSize) = ERROR_SUCCESS Then
      strRegData = Left$(strRegData, InStr(strRegData, vbNullChar) - 1)
      Debug.Print strRegData
    End If
    '新しいデータに書き換え
    strNewData = "C:\My Documents"
    RegSetValueEx lngKey, cstrSubKey, 0&, REG_SZ, ByVal strNewData, cBufferSize
    'レジストリキーをクローズ
    RegCloseKey lngKey
  End If

End Sub

※このコードを実行した直後、Accessのオプション画面を見ても、その値は変更されていません。Accessが起動したときにすでにレジストリの値が読み込まれ、保持されているためです。Accessをいったん終了して、再起動してから変更されていることを確認してみて下さい。・・・・・レジストリエディタなら直ちに変更を確認することができます。

※cstrRegKeyなどの定数や、変数 strNewData の部分をこのプロシージャの引数にすることによって、より汎用的な"レジストリ更新"プロシージャにすることができます。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved