VBAのSaveSettingステートメントやGetSetting関数では、あらかじめ決められたキー、
「HKEY_CURRENT_USER\Software\VB and VBA Program Settings」
の下のエントリしか操作できません。しかし、WindowsAPIを使えば、どんなレジストリでも操作することができます。
以下の「SetRegValue」と「GetRegValue」の2つのプロシージャは、「#154 Accessのレジストリ情報を直接書き換える方法」の内容を、より汎用的なプロシージャとして拡張したものです。標準モジュールに書くことを前提としています。
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
ByVal dwType As Long, ByVal lpData As Any, ByVal cbData As Long) As Long
Private 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
Private Const ERROR_SUCCESS = 0
Private Const REG_SZ = 1
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Function SetRegValue(lngRootKey As Long, strSubKey As String, _
strName As String, strValue As String)
'概要 レジストリに値を設定する
'引数 lngRootKey : レジストリルートキー
' strSubKey : レジストリサブキー
' strName : 名前
' strValue : 設定する値
'返値 成功時 True、失敗時 False
Dim lngRet As Long
Dim hWnd As Long
'ハンドルを開く
hWnd = Application.hWndAccessApp
lngRet = RegOpenKeyEx(lngRootKey, strSubKey, 0, KEY_SET_VALUE, hWnd)
'値を設定
lngRet = RegSetValueEx(hWnd, strName, 0, REG_SZ, ByVal strValue, LenB(strValue))
'ハンドルを閉じる
RegCloseKey hWnd
'エラーを確認して返り値に設定
SetRegValue = (lngRet = ERROR_SUCCESS)
End Function
Public Function GetRegValue(lngRootKey As Long, strSubKey As String, _
strName As String) As String
'概要 レジストリの値を取得する
'引数 lngRootKey : レジストリルートキー
' strSubKey : レジストリサブキー
' strName : 名前
'返値 取得したレジストリの値
Dim lngRet As Long
Dim hWnd As Long
Dim strValue As String
'ハンドルを開く
hWnd = Application.hWndAccessApp
lngRet = RegOpenKeyEx(lngRootKey, strSubKey, 0, KEY_QUERY_VALUE, hWnd)
'受け取り値用のバッファを確保
strValue = String(255, " ")
'値を取得
lngRet = RegQueryValueEx(hWnd, strName, 0, 0, ByVal strValue, LenB(strValue))
'ハンドルを閉じる
RegCloseKey hWnd
'取得した値から後続のNullを取り除く
strValue = Left(strValue, InStr(strValue, vbNullChar) - 1)
'取得した値を返り値に設定
GetRegValue = strValue
End Function
各プロシージャの呼び出し例:
Sub RegTest()
Dim strRegValue As String
'デスクトップの壁紙のファイル名をレジストリより取得
strRegValue = GetRegValue(HKEY_CURRENT_USER, "Control Panel\desktop", "Wallpaper")
Debug.Print strRegValue
'新しい壁紙のファイル名をレジストリに設定
strRegValue = "C:\Windows\大草原の風.bmp"
SetRegValue HKEY_CURRENT_USER, "Control Panel\desktop", "Wallpaper", strRegValue
End Sub
|