VBA標準機能では扱えるレジストリに制限がある
VBAにはレジストリ操作用の関数として、SaveSetting関数、GetSetting関数、GetAllSettings関数、DeleteSetting関数が用意されていますが、これらは「HKEY_CURRENT_USER\Software\VB and VBA Program Settings」配下のみでしか扱えない制限があります。
しかし、レジストリを操作したい多くの場合は、既に存在しているレジストリに対してであり、上記のレジストリ用関数では対応できません。
そのような場合にはWin32APIや外部アプリケーションの利用などの方法がありますが、一番簡単なのはWshShellクラスのレジストリ操作用の関数を利用する方法です。
以下ではWshShellクラスの各種レジストリ操作関数の説明とその利用方法を説明します。
SaveSetting関数等の詳細は「VBA専用のレジストリの操作を行う」をご参照ください。
事前準備
WshShellの参照設定は、VBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Windows Script Host Object Model」にチェックを付けます。
これでWshShellクラスを利用できるようになります。
WshShellのレジストリ操作メソッド
WshShellクラスにはレジストリ操作を行うメソッドが3つ用意されています。
関数 | 処理概要 |
RegWrite | レジストリの登録と更新 |
RegRead | レジストリの取得 |
RegDelete | レジストリの削除 |
RegWrite(レジストリの登録と更新)
RegWriteメソッドはレジストリへのキーと値の登録や更新を行います。
使うことはないと思いますが、データ型がQWORD値型(REG_QWORD)と複数行文字列型(REG_MULTI_SZ)の場合は登録や更新は出来ず、エラーになります。
どうしてもこれらのデータ型が必要な場合は、後述するregコマンドの実行を参考にするか、その他Win32APIを利用するなどのWshShell以外での方法を利用したり他のデータ型で複数のキーを使うなどの設計次第で回避できますので検討してください。
構文
Sub RegWrite(Name As String, Value, [Type])
変数 | 内容 | ||||||||||||||
Name | レジストリに登録や更新するキー名(レジストリのパス)を指定します。ルートキーは短縮指定が可能です。
HKEY_USERSとHKEY_CURRENT_CONFIGは短縮キーが利用できません。利用しようとしても実行時エラーのダイアログで「オートメーションエラーです。指定されたパスが見つかりません。」と表示されます。 |
||||||||||||||
Value | キーに紐付く値を設定します。 | ||||||||||||||
Type | 値のデータ型と指定します。省略可能です。
|
RegRead(レジストリの取得)
RegReadメソッドはレジストリのキーから値の取得を行います。
データ型がQWORD値型(REG_QWORD)の場合は取得できずエラーになります。
バイナリ型と複数行文字列型(REG_MULTI_SZ)の場合は戻り値の変数をVariantにしておけば、内部変数型がStringの配列が返却されます。
構文
Function RegRead(Name As String)
変数 | 内容 |
Name | レジストリから値を取得したいキーを指定します。既定値を取得したい場合はそのキー(既定値があるレジストリパス)を指定します。ルートキーはRegWriteメソッドと同様に短縮指定が可能です。 |
戻り値 | 値のデータ型に応じて値を返却します。文字列値型、DWORD(32ビット)値型、展開可能な文字列値型の場合は単一値が返却され、バイナリ型、複数行文字列値型の場合は配列で返却されます。 |
RegDelete(レジストリの削除)
RegDeleteメソッドはレジストリのキーを削除します。キーだけを指定した場合は配下も含めて削除します。
構文
Sub RegDelete(Name As String)
変数 | 内容 |
Name | レジストリから削除するキーを指定します。ルートキーはRegWriteメソッドと同様に短縮指定が可能です。 |
サンプルコード
上記の各メソッド(RegWrite、RegRead、RegDelete)のサンプルコードです。
各データ型の登録を行い、取得できるものは取得し、登録した内容を削除します。
一応各データ型のサンプルを書いていますが、データ型として利用するのはほとんどの場合は文字列値型かDWORD(32ビット)値型のどちらかになることが多いと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Sub RegTest2() Dim sh As New IWshRuntimeLibrary.WshShell Dim sValue '// 登録(各ルートキーへの登録) Call sh.RegWrite(Name:="HKCU\__test1\test1", Value:="str", Type:="REG_SZ") Call sh.RegWrite(Name:="HKEY_USERS\__test1", Value:="str") Call sh.RegWrite(Name:="HKLM\__test1", Value:="str") Call sh.RegWrite(Name:="HKCR\__test1", Value:="str") Call sh.RegWrite(Name:="HKEY_CURRENT_CONFIG\__test1", Value:="str") '// 各データ型の登録 '// 文字列型="abcdefgh" Call sh.RegWrite(Name:="HKCU\__test1\str", Value:="abcdefgh", Type:="REG_SZ") '// BINARY=&H123456 Call sh.RegWrite(Name:="HKCU\__test1\bin", Value:=&H25543, Type:="REG_BINARY") '// DWORD=数字 Call sh.RegWrite(Name:="HKCU\__test1\dwd", Value:=123, Type:="REG_DWORD") '// QWORD:登録不可 'Call sh.RegWrite(Name:="HKCU\__test1\qwd", Value:=CLng(12345679), Type:="REG_QWORD") '// 複数行文字列値:登録不可 'Call sh.RegWrite(Name:="HKCU\__test1\multi", Value:="123,222,333", Type:="REG_MULTI_SZ") '// 展開可能な文字列値型 Call sh.RegWrite(Name:="HKCU\__test1\ten", Value:="%windir%", Type:="REG_EXPAND_SZ") '// 複数行文字列値の登録。regコマンドでの登録 '// /v:値名、/t:データ型、/s:区切り文字、/d:登録値、/f:値上書き Call sh.Exec(Command:="reg add HKCU\__test1\ /v multi /t REG_MULTI_SZ /s , /d abc,def,ghi /f") '// QWORD型の登録 Call sh.Exec(Command:="reg add HKCU\__test1\ /v qwd /t REG_QWORD /d 12345 /f") '// 取得 sValue = sh.RegRead(Name:="HKCU\__test1\") '// 既定値 sValue = sh.RegRead(Name:="HKCU\__test1\str") '// REG_SZ sValue = sh.RegRead(Name:="HKCU\__test1\bin") '// REG_BINARY sValue = sh.RegRead(Name:="HKCU\__test1\dwd") '// REG_DWORD 'sValue = sh.RegRead(Name:="HKCU\__test1\qwd") '// REG_QWORD:取得はエラーになる sValue = sh.RegRead(Name:="HKCU\__test1\multi") '// REG_MULTI_SZ sValue = sh.RegRead(Name:="HKCU\__test1\ten") '// REG_EXPAND_SZ '// 削除 'Call sh.RegDelete(Name:="HKCU\__test1\") '// 最後に削除 Call sh.RegDelete(Name:="HKCU\__test1\str") Call sh.RegDelete(Name:="HKCU\__test1\bin") Call sh.RegDelete(Name:="HKCU\__test1\dwd") Call sh.RegDelete(Name:="HKCU\__test1\multi") Call sh.RegDelete(Name:="HKCU\__test1\ten") Call sh.RegDelete(Name:="HKCU\__test1\test1") Call sh.RegDelete(Name:="HKEY_USERS\__test1") Call sh.RegDelete(Name:="HKLM\__test1") Call sh.RegDelete(Name:="HKCR\__test1") Call sh.RegDelete(Name:="HKEY_CURRENT_CONFIG\__test1") Call sh.RegDelete(Name:="HKCU\__test1\") End Sub |
サンプルコード説明
RegWriteメソッドには書き方の癖がいくつかあります。
バイナリ型の登録は「&H」を頭につけて設定する値を書きますが、レジストリに登録されるのはコードに書いた値ではなく2字ずつ右から左に向かって登録されます。例えば&H25543であればレジストリには0x43 0x55 0x02 0x00の順になります。一番右には終端の0x00が登録されます。
QWORD型と複数行文字列型は、先にも書いていますが、RegWriteメソッドでは登録できません。サンプルではWshShellのExecメソッドを使ってregコマンドを使って登録しています。
取得ではQWORD型はエラーになります。QWORDを使うことなどまずないのもあって取得方法は面倒なので書いていません。
削除はキーを指定するだけなので特別なことはありませんが、存在しないキーの削除はエラーになります。キー自体を削除したい場合はそのキーを書けば削除になります。
登録と削除をほぼ同時に行うとエラーになる
あまりこういうことはしないと思いますが、上記サンプルコードのように登録してすぐに削除したりするようなコードはエラーになることがあります。
その理由はレジストリの登録処理を実行したあとに、実際のレジストリへの登録が行われる前にRegDeleteメソッドでの削除処理が行われると存在しないキーの削除としてエラーになります。