VBAで環境変数の追加と編集を行うには
VBAで環境変数の追加や編集を行うにはWshShellオブジェクトを利用します。
なお、環境変数の一覧の取得方法については「VBAで環境変数の一覧を取得する」をご参照ください。
参照設定
WshShellはCreateObject関数を利用してこのような書き方を紹介されることが多いと思います。
1 2 |
Dim obj Set obj = CreateObject("WScript.Shell") |
しかしこの書き方では利用できるプロパティやメソッドを候補表示できません。しかし参照設定を行えばプロパティやメソッドを表示することが可能です。
WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。これでWshShellクラスを利用できるようになります。
以下はWshShellクラスのインスタンス変数の作成サンプルです。書き方は2通りあります。どちらでもいいです。
1つ目のように1行で書いてもいいですし、2つ目のように変数定義とSetを別に書いてもいいです。
「VBAでクラス変数の宣言とNewを1行で書いてよいか」にも書いていますが、作法としては2行目が推奨されていますが、私は1行で書くことが多いです。
1 |
Dim obj As New IWshRuntimeLibrary.WshShell |
1 2 |
Dim obj As IWshRuntimeLibrary.WshShell Set obj = New IWshRuntimeLibrary.WshShell |
以降のサンプルコードは参照設定を行った場合の書き方になります。
環境変数名の種類
WshShellクラスのEnvironmentプロパティに設定できる引数は以下の通りです。
一般的にはシステム環境変数の”System”への登録が多いとは思います。
文字列 | 内容 |
---|---|
System | システム環境変数。全ユーザーに適用される。 |
User | ユーザー環境変数。ユーザーごとに設定する。 |
Volatile | 揮発性環境変数。ログオフすると破棄される。 |
Process | プロセス環境変数。現プロセスで利用可能な環境変数。 |
環境変数の編集のサンプルコード
1つ目と2つ目の関数が環境変数の追加および編集を行う関数です。違いは9行目と18行目の設定値で、既存値を保持するかしないかの違いしかありません。
ほとんど同じ処理なのでまとめてもいいのですが、説明しやすいようにわざと分けています。
どちらも3つの引数があり、引数1は上に挙げた4つの環境変数名のいずれか、引数2は設定する変数名、引数3は変数名に設定する値です。
3つ目の関数はテスト用の関数です。ここでの設定内容を見ると引数の設定が分かると思います。
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 |
'// 環境変数の追加 Sub AddEnvironment(envType, envKey, envValue) Dim wsh As New IWshRuntimeLibrary.WshShell '// WshShell Dim s '// 環境変数文字列 '// 環境変数の値を取得 s = wsh.Environment(envType).Item(envKey) wsh.Environment(envType).Item(envKey) = s & ";" & envValue Set wsh = Nothing End Sub '// 環境変数の編集 Sub EditEnvironment(envType, envKey, envValue) Dim wsh As New IWshRuntimeLibrary.WshShell '// WshShell wsh.Environment(envType).Item(envKey) = envValue Set wsh = Nothing End Sub Sub AddEnvironmentTest() '// システム環境変数の"Path2"にパスを追加 Call AddEnvironment("System", "Path2", "C:\test") '// ユーザ環境変数に"AAA"と値3を追加 Call AddEnvironment("User", "AAA", "3") '// システム環境変数の"Path2"を書き換え Call EditEnvironment("System", "Path2", "C:\test;C:\Program Files") End Sub |