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_CLASSES_ROOT HKCR
HKEY_CURRENT_USER HKCU
HKEY_LOCAL_MACHINE HKLM
HKYE_USERS HKU(利用不可)
HKEY_CURRENT_CONFIG HKCC(利用不可)

HKEY_USERSとHKEY_CURRENT_CONFIGは短縮キーが利用できません。利用しようとしても実行時エラーのダイアログで「オートメーションエラーです。指定されたパスが見つかりません。」と表示されます。

Value キーに紐付く値を設定します。
Type 値のデータ型と指定します。省略可能です。

データ型 定数
文字列値 REG_SZ
バイナリ値 REG_BINARY
DWORD(32ビット)値 REG_DWORD
QWORD(64ビット)値 REG_QWORD
複数行文字列値 REG_MULTI_SZ
展開可能な文字列値 REG_EXPAND_SZ

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ビット)値型のどちらかになることが多いと思います。

サンプルコード説明

RegWriteメソッドには書き方の癖がいくつかあります。

バイナリ型の登録は「&H」を頭につけて設定する値を書きますが、レジストリに登録されるのはコードに書いた値ではなく2字ずつ右から左に向かって登録されます。例えば&H25543であればレジストリには0x43 0x55 0x02 0x00の順になります。一番右には終端の0x00が登録されます。

QWORD型と複数行文字列型は、先にも書いていますが、RegWriteメソッドでは登録できません。サンプルではWshShellのExecメソッドを使ってregコマンドを使って登録しています。

取得ではQWORD型はエラーになります。QWORDを使うことなどまずないのもあって取得方法は面倒なので書いていません。

削除はキーを指定するだけなので特別なことはありませんが、存在しないキーの削除はエラーになります。キー自体を削除したい場合はそのキーを書けば削除になります。

登録と削除をほぼ同時に行うとエラーになる

あまりこういうことはしないと思いますが、上記サンプルコードのように登録してすぐに削除したりするようなコードはエラーになることがあります。

その理由はレジストリの登録処理を実行したあとに、実際のレジストリへの登録が行われる前にRegDeleteメソッドでの削除処理が行われると存在しないキーの削除としてエラーになります。