レジストリのサブキーを列挙する


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

実行結果はこうなります。

ちょっと難しいテクニックですが、サブキーを列挙できると何かと便利です。覚えておいて損はありません。