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
実行結果はこうなります。

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