VBAにはレジストリを操作する SaveSettingメソッド と GetSetting関数 が用意されています。使い方は「レジストリを使う」をご覧ください。たとえば、レジストリに記録されているデータを読み込むには次のようにします。
Sub Sample1() Dim buf As String buf = GetSetting("Sample", "Data1", "UserName") MsgBox buf End Sub
このコードは「VB and VBA Program Setting」配下の[Sample]-[Data1]-[UserName]を読んでいます。仮に次のようにデータが保存されていた場合は「田中亨」が表示されます。
また[Data1]に書き込まれているすべてのデータを取得するには、GetAllSettings関数を使います。次のコードは、[Data1]内の全データを取得して表示します。
Sub Sample2() Dim tmp, i As Long, buf As String tmp = GetAllSettings("Sample", "Data1") For i = 0 To UBound(tmp) buf = buf & tmp(i, 0) & Chr(9) & tmp(i, 1) & vbCrLf Next i MsgBox buf End Sub
ここまでは難しくありませんね。では、[Sample]の下にどんなサブキーがあるかわからなかったらどうしましょう。この例では[Sample]の下に[Data1][Data2][Setting]と3つのサブキーが存在しています。[Sample]に対してGetAllSettings関数を実行しても、サブキーの一覧は取得できません。これは、VBAのコマンドだけでは取得できないんです。
こんなときは、WMI(Windows Management Instrumentation)を使います。少し難しいですが、たとえば次のようにします。
Sub Sample3() Dim Reg, Locator, Service, SubKey, i As Long, buf As String Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer(vbNullString, "root\default") Set Reg = Service.Get("StdRegProv") Const HKEY_CURRENT_USER = &H80000001 Const TARGETKEY = "Software\VB and VBA Program Settings\Sample" Reg.EnumKey HKEY_CURRENT_USER, TARGETKEY, SubKey For i = 0 To UBound(SubKey) buf = buf & SubKey(i) & vbCrLf Next i MsgBox buf Set Reg = Nothing Set Service = Nothing Set Locator = Nothing End Sub
これを応用して、各サブキー内に存在するすべてのデータを取得してみましょう。ここでは、GetAllSettings関数ではなく、データの取得もWMIでやってみます。なお、レジストリには次のようなデータが保存されているとします。
Sub Sample4() Dim Reg, Locator, Service, SubKey, RegName, RegType Dim i As Long, j As Long, buf As String, RegData As String Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer(vbNullString, "root\default") Set Reg = Service.Get("StdRegProv") Const HKEY_CURRENT_USER = &H80000001 Const TARGETKEY = "Software\VB and VBA Program Settings\Sample" Reg.EnumKey HKEY_CURRENT_USER, TARGETKEY, SubKey For i = 0 To UBound(SubKey) buf = buf & SubKey(i) & vbCrLf Reg.EnumValues HKEY_CURRENT_USER, TARGETKEY & "\" & SubKey(i), RegName, RegType For j = 0 To UBound(RegName) buf = buf & Chr(9) & RegName(j) Select Case True Case RegType(j) = 1 Reg.GetStringValue HKEY_CURRENT_USER, TARGETKEY & "\" & SubKey(i), _ RegName(j), RegData buf = buf & Chr(9) & Chr(9) & RegData & vbCrLf Case RegType(j) = 7 Reg.GetMultiStringValue HKEY_CURRENT_USER, TARGETKEY & "\" & SubKey(i), _ RegName(j), RegData buf = buf & Chr(9) & Chr(9) & RegData & vbCrLf End Select Next j Next i MsgBox buf Set Reg = Nothing Set Service = Nothing Set Locator = Nothing End Sub
実行結果はこうなります。
ちょっと難しいテクニックですが、サブキーを列挙できると何かと便利です。覚えておいて損はありません。