マクロの実行ログに「誰が実行したか」を残したい、共有ブックを使っているPCごとに保存先フォルダを自動で切り替えたい——そんなときに便利なのがEnviron関数です。Windowsが管理している「環境変数」から、ユーザー名やPC名、一時フォルダのパスなどをVBAから簡単に取得できます。
この記事では、Environ関数の基本的な使い方と、実務でよく使う環境変数の一覧、ログ記録や保存先自動判定への活用例、Environ$関数との違いまでを解説します。
Environ関数の基本構文
Environ関数は、指定した名前の環境変数の値を文字列として返します。
Sub ShowUserName()
Dim userName As String
userName = Environ("USERNAME")
MsgBox "現在のユーザー名: " & userName
End Sub
引数には環境変数名を文字列で指定します。大文字・小文字は区別されないため、Environ("username")のように書いても同じ結果が得られます。
よく使う環境変数一覧
実務でよく使う環境変数には、以下のようなものがあります。
| 環境変数名 | 内容 |
|---|---|
| USERNAME | 現在ログインしているユーザー名 |
| COMPUTERNAME | PC(コンピューター)の名前 |
| USERPROFILE | ユーザーのプロファイルフォルダ(例:C:\Users\username) |
| TEMP または TMP | 一時ファイル用フォルダのパス |
| APPDATA | アプリケーションデータの保存フォルダ |
| OS | OSの種別(例:Windows_NT) |
実際にどんな値が取得できるかを一覧で確認したい場合は、以下のマクロが便利です。
Sub ShowMainEnvironVars()
Dim names As Variant
Dim i As Long
Dim msg As String
names = Array("USERNAME", "COMPUTERNAME", "USERPROFILE", "TEMP", "APPDATA", "OS")
For i = LBound(names) To UBound(names)
msg = msg & names(i) & " = " & Environ(names(i)) & vbCrLf
Next i
MsgBox msg
End Sub
具体例1:ログにユーザー名・PC名を記録する
複数人で共有しているブックの操作ログに、誰がいつ操作したかを記録する例です。
Sub WriteOperationLog(ByVal action As String)
Dim logSheet As Worksheet
Dim nextRow As Long
Set logSheet = ThisWorkbook.Worksheets("操作ログ")
nextRow = logSheet.Cells(logSheet.Rows.Count, "A").End(xlUp).Row + 1
logSheet.Cells(nextRow, "A").Value = Now
logSheet.Cells(nextRow, "B").Value = Environ("USERNAME")
logSheet.Cells(nextRow, "C").Value = Environ("COMPUTERNAME")
logSheet.Cells(nextRow, "D").Value = action
End Sub
Sub SampleUsage()
WriteOperationLog "集計マクロを実行"
End Sub
Windowsのログインアカウント名がそのまま取得できるため、IDやパスワードの入力を求めることなく、簡易的な実行者記録として利用できます。
具体例2:一時フォルダ(TEMP)に作業ファイルを保存する
処理の途中経過を一時的にファイルへ書き出したいとき、Environ("TEMP")を使えば、ユーザーごとに存在が保証された一時フォルダへ確実に保存できます。
Sub SaveTempFile()
Dim tempPath As String
Dim fileNo As Integer
tempPath = Environ("TEMP") & "\work_data.txt"
fileNo = FreeFile
Open tempPath For Output As #fileNo
Print #fileNo, "処理結果: " & Now
Close #fileNo
MsgBox "一時ファイルを保存しました: " & tempPath
End Sub
固定のフォルダパスをコードに直接書いてしまうと、他のPCで実行したときに「フォルダが存在しない」エラーになりがちですが、TEMP環境変数を使えばその心配がありません。
具体例3:ユーザーごとに保存先フォルダを自動判定する
USERPROFILEを使うと、ユーザーのフォルダ配下(デスクトップやドキュメント)を動的に組み立てられます。
Sub SaveToDesktop()
Dim desktopPath As String
desktopPath = Environ("USERPROFILE") & "\Desktop\"
ThisWorkbook.SaveCopyAs desktopPath & "バックアップ_" & Format(Now, "yyyymmdd_hhmmss") & ".xlsm"
MsgBox "デスクトップにバックアップを保存しました"
End Sub
「C:\Users\〇〇\Desktop」のように、ユーザー名部分をハードコーディングせずに済むため、複数人が使うマクロで特に有効です。
注意点:Environ関数とEnviron$関数の違い
VBAにはEnviron関数とEnviron$関数の2種類があり、挙動に違いがあります。
- Environ:戻り値はVariant型。存在しない環境変数名を指定すると、空文字列(“”)が返る
- Environ$:戻り値はString型。存在しない環境変数名を指定すると、実行時エラーが発生する
Sub CompareEnvironFunctions()
Dim result1 As Variant
Dim result2 As String
result1 = Environ("NOT_EXIST_VAR") ' "" が返る(エラーにならない)
MsgBox "Environ結果: [" & result1 & "]"
On Error Resume Next
result2 = Environ$("NOT_EXIST_VAR") ' 実行時エラーが発生する
If Err.Number <> 0 Then
MsgBox "Environ$はエラーが発生しました: " & Err.Description
End If
On Error GoTo 0
End Sub
存在しない変数名を指定する可能性がある場合は、エラーにならないEnviron関数を使う方が安全です。
まとめ
Environ関数を使えば、ユーザー名・PC名・一時フォルダのパスなどをOSから直接取得でき、操作ログの記録や、環境に依存しない保存先フォルダの自動判定に活用できます。複数人・複数PCで使うマクロを作る際は、フォルダパスの決め打ちを避け、ぜひEnviron関数を活用してみてください。


コメント