【ExcelVBA・マクロ】Environ関数の使い方|Windows環境変数からユーザー名・PCの情報を取得する方法【コピペOK】

ExcelVBA

マクロの実行ログに「誰が実行したか」を残したい、共有ブックを使っている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関数を活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました