VBAで実行しているファイルのディレクトリのパスを取得する方法

プログラミング

はじめに

VBA(Visual Basic for Applications)を使うと、実行中のファイルが保存されているディレクトリのパスを簡単に取得可能だ。
この操作は、関連ファイルの操作やデータ保存時に便利な手段となる。


スポンサーリンク
スポンサーリンク

ディレクトリパス取得の基本方法

VBAで現在のワークブックのディレクトリパスを取得するには、ThisWorkbook.Path プロパティを使用する。
このプロパティは、ファイルが保存されている場所のパスを返す。

基本コード例

Sub GetDirectoryPath()
' 現在のワークブックのディレクトリパスを取得
Dim directoryPath As String
directoryPath = ThisWorkbook.Path

' パスをメッセージボックスで表示
MsgBox "現在のファイルのディレクトリパス: " & directoryPath
End Sub

実行例

以下の場所にファイルが保存されている場合:
C:\Users\YourName\Documents\VBAProjects

結果として次のようなメッセージが表示される。

現在のファイルのディレクトリパス: C:\Users\YourName\Documents\VBAProjects

ファイルのフルパス取得

ディレクトリパスだけでなく、ファイル名を含むフルパスが必要な場合は、ThisWorkbook.FullName を利用する。
このプロパティはディレクトリパスとファイル名を組み合わせた文字列を返す。

コード例

Sub GetFullFilePath()
' ワークブックのフルパスを取得
Dim fullPath As String
fullPath = ThisWorkbook.FullName

' フルパスをメッセージボックスで表示
MsgBox "現在のファイルのフルパス: " & fullPath
End Sub

実行例

ファイル名が Sample.xlsx の場合、結果は次のようになる。

現在のファイルのフルパス: C:\Users\YourName\Documents\VBAProjects\Sample.xlsx

パス取得時の注意点

  1. 保存されていないファイルの場合
    ThisWorkbook.Path は保存されていないファイルに対して空文字列を返す。
    この場合、次のコードで対処できる。
Sub GetDirectoryPathWithErrorHandling()
Dim directoryPath As String
directoryPath = ThisWorkbook.Path

If directoryPath = "" Then
MsgBox "ファイルが保存されていません。ディレクトリパスは取得できません。"
Else
MsgBox "現在のファイルのディレクトリパス: " & directoryPath
End If
End Sub
  1. 末尾のバックスラッシュが含まれない
    ThisWorkbook.Path の結果には末尾のバックスラッシュ (\) が付いていない。
    必要であれば次のように追加する。
Dim pathWithSlash As String
pathWithSlash = ThisWorkbook.Path & "\"

応用例:ログファイルを同じフォルダ内の log フォルダに保存

実行しているファイルのディレクトリを利用して、ログファイルを自動的に管理する方法を紹介する。
この方法では、ファイルのディレクトリ内に新しいフォルダ(例: log フォルダ)を作成し、そこにログファイルを保存する。

コード例

Sub SaveLogFile()
Dim logFolderPath As String
Dim logFilePath As String
Dim logFileName As String
Dim fileNumber As Integer

' 現在のファイルのディレクトリパスを取得
Dim currentDir As String
currentDir = ThisWorkbook.Path

' logフォルダのパスを設定
logFolderPath = currentDir & "\log"

' logフォルダが存在しない場合は作成
If Dir(logFolderPath, vbDirectory) = "" Then
MkDir logFolderPath
End If

' ログファイル名を設定(例: Log_YYYYMMDD.txt)
logFileName = "Log_" & Format(Date, "YYYYMMDD") & ".txt"
logFilePath = logFolderPath & "\" & logFileName

' ファイル番号を取得し、ログファイルに書き込む
fileNumber = FreeFile
Open logFilePath For Append As #fileNumber
Print #fileNumber, "ログの記録開始: " & Now
Print #fileNumber, "-------------------------"
Print #fileNumber, "実行した処理の内容などを記載します。"
Print #fileNumber, "例: データの処理が完了しました。"
Close #fileNumber

' 完了メッセージを表示
MsgBox "ログファイルが保存されました: " & logFilePath
End Sub

コード解説

  1. ディレクトリパスの取得
    実行中のファイルのディレクトリパスを ThisWorkbook.Path で取得する。
  2. フォルダの存在確認と作成
    Dir 関数を使い、指定した log フォルダが存在するかを確認する。存在しない場合、MkDir を使ってフォルダを作成する。

  3. ログファイル名の生成
    日付を基にしたファイル名(例: Log_YYYYMMDD.txt)を生成し、管理しやすくする。

  4. ログ内容の書き込み
    Open ... For Append を使い、ログファイルに追記する形式でデータを書き込む。

  5. メッセージの表示
    処理が完了したことをユーザーに知らせるため、メッセージボックスを表示する。


実行例

  1. 実行中のファイルのディレクトリが以下の場合:

C:\Users\YourName\Documents\VBAProjects

  1. 実行後、以下のフォルダ構造が生成される:
C:\Users\YourName\Documents\VBAProjects
├── YourWorkbook.xlsm
└── log
└── Log_YYYYMMDD.txt
  1. ログファイル内容の例:
ログの記録開始: 2024-12-31 10:30:00
-------------------------
実行した処理の内容などを記載します。
例: データの処理が完了しました。

注意点

  • エラーハンドリング
    フォルダの作成やファイルの書き込み中にエラーが発生した場合を考慮し、On Error を使ったエラーハンドリングを追加するとより安全なコードとなる。
  • 既存のログファイルの管理
    日付ごとにログファイルを生成することで、既存のログが上書きされることを防げる。


まとめ

VBAでは、実行中のファイルがどこに保存されているかを簡単に確認できる。
ThisWorkbook.PathThisWorkbook.FullName を利用することで、柔軟なファイル操作が可能だ。

コメント