
こんにちわ、マツコ先生 です。
「VBAを使ってファイルパスとファイル名を取得する方法」でお困りではないでしょうか?
本記事でそんなお悩みを解決していきますよ!
本記事を読むことで |
---|
・選択したファイル(フォルダ)のファイルパスを取得し表示できる ・選択したファイルのファイル名を取得し表示できる |
ファイルパスやファイル名をファイルを選択する方法で取得するメリット
- ファイル選択ダイアログが表示されるため、誰でも取得できる(特別なスキルを必要としない)
- 存在しないファイルパスやファイル名を後続処理に送ってしまい、エラーになることがない
- 選択できるファイルの拡張子(".xlxs"等)を指定するため、間違った拡張子のファイルを選ぶことがない
完成イメージは次のようになります。
上段は、ファイルパスとファイル名を取得して表示する処理を実装します。
下段は、ファイルパスを取得して表示する処理を実装します。

完成イメージのような操作画面を作る
まず、最初に処理のコードを入力していきます。
"開発"タブから、"Visual Basic" を押下します。

"開発"タブが表示されていない方は、こちらの記事を参考に、"開発”タブを表示してから作業を進めてください。
VBAの開発画面が表示されたら、左の "プロジェクト" からシート名称を押下すると、右側のコード入力ウィンドウが表示されます。
今回は、"Sheet1" にボタン等を配置する予定なので、"Sheet1" を押下します。

今回は、ボタンを2つ配置する予定なので、各ボタン用の処理を入力します。
処理は後から入力するので、次のように最低限の記述だけ入力します。
入力したら、一旦、保存してください。

一旦、エクセルのシート画面に戻ります。
完成イメージと同じになるように、テキストのほか、ボタンを配置していきます。
開発メニューの"挿入"から、フォームコントロールの "ボタン" を選択して配置します。
"ActiveXコントロール" と "フォームコントロール" はどっちでもいいのかな?
"ActiveXコントロール" のボタンを使ってしまうと、windowsでしか動作しないため、Macとwindowsのどちらでも動作する "フォームコントロール" のボタンを使いましょう!


ボタンを配置したときに、どのマクロを割り当てるかの選択画面が表示されます。
ここで、VBAの開発画面に設定した各ボタン用の処理を選択します。
上段は、"Button1"、下段は、"Button2" を選択します。

後からマクロを変更したくなったらどうしたらいいのかな?
ボタンを右クリックすると表示されるメニューから、"マクロの登録" を選択すると割り当てるマクロの選択画面が再表示されます。

処理の内容を記述する
ここまでは、ボタンや表示など外枠を作ってきましたが、ここからは具体的な処理を記述していきます。
記述する処理は大きく4つです。
先に入力したボタンに直接割り当てている次の2つ
・Button1()
・Button2()
具体的な処理を行う次の2つの計4つになります
・GetFilePathAndName()
・GetFilePath()
完成イメージは次のようになります。
次の順番で処理が記述されています。
・Button1()
・Button2()
・GetFilePathAndName()
・GetFilePath()


VBAの開発画面を開き、Button2()の処理の下に次の2つの処理を追加していきます。
・GetFilePathAndName()
・GetFilePath()

まず、ファイルパスとファイル名を取得する処理 "GetFilePathAndName()" を追加します。
Button2()の処理の下("End Sub"の下)に次のコードをコピー&ペーストします。
Function GetFilePathAndName(toWorkbook As Workbook, withSheetName As String, fileType As String, fileExt As String, range_Path As String, range_Name As String)
' Dim toWorkbook As workbook '出力先ブック
' Dim withSheetName As String '出力先シート名
' Dim fileType As String 'ファイル選択対象とするファイルの種類名
' Dim fileExt As String 'ファイル選択対象とするファイルの拡張子
' Dim range_Path As String '取得したファイルパスの表示先セル
' Dim range_Name As String '取得したファイル名の表示先セル
Dim fullPath As Variant 'ファイルの保存先とファイル名
Dim pos As Integer 'ファイル名の文字数
Dim filePath As String 'ファイルの保存先
Dim fileName As String 'ファイル名
Dim dialogReturn As Integer
With Application.FileDialog(msoFileDialogFilePicker)
' 選択できるファイルの種類を指定する
.Filters.Clear
.Filters.Add fileType, fileExt
' 複数ファイルの選択を禁止
.AllowMultiSelect = False
' ファイル選択画面を表示
dialogReturn = .Show
' ファイル選択したら、ファイルパスとファイル名に分けてセルに表示する
If dialogReturn <> 0 Then
fullPath = .SelectedItems(1)
' ファイル名の文字数を確認し、ファイルパスとファイル名に分割する
pos = InStrRev(fullPath, "\")
filePath = Left(fullPath, pos - 1)
fileName = Mid(fullPath, pos + 1)
' 取得結果をシートのセルに出力
toWorkbook.Worksheets(withSheetName).Range(range_Path).Value = filePath
toWorkbook.Worksheets(withSheetName).Range(range_Name).Value = fileName
Else
MsgBox "ファイルパスとファイル名が取得できませんでした"
End If
End With
End Function
次に、ファイルパスを取得する処理 "etFilePath()" を追加します。
GetFilePathAndName()の処理の下("End Sub"の下)に次のコードをコピー&ペーストします。
Function GetFilePath(toWorkbook As Workbook, withSheetName As String, range_Path As String)
' Dim toWorkbook As workbook '出力先ブック
' Dim withSheetName As String '出力先シート名
' Dim range_Path As String '取得したファイルパスの表示先セル
Dim filePath As String 'ファイルの保存先
Dim dialogReturn As Integer
With Application.FileDialog(msoFileDialogFolderPicker)
' ファイル選択画面を表示
dialogReturn = .Show
' ファイル選択したら、ファイルパスとファイル名に分けてセルに表示する
If dialogReturn <> 0 Then
filePath = .SelectedItems(1)
' 取得結果をシートのセルに出力
toWorkbook.Worksheets(withSheetName).Range(range_Path).Value = filePath
Else
MsgBox "ファイルパスが取得できませんでした"
End If
End With
End Function
ここで一旦、保存した方が良さそうですね。
ここからは、ボタンに直接割り付けている処理を入力していきます。
皆さんの状況に合わせてカスタマイズする場合は、ここを変更してください。
"Button1()" の処理は、ファイルパスとファイル名を取得することです。
具体的な処理は、 "GetFilePathAndName()" 内で行われますが、条件をここで設定しています。
withSheetName: ボタンや出力先セルがあるシート名称
fileType: 選択するファイルの種類(CSVファイルの場合は、"CSVファイル" を設定します)
fileExt: 選択するファイルの拡張子(CSVファイルの場合は、"*.csv" を設定します)
range_Path: 取得したファイルパスの出力先セル
range_Name: 取得したファイル名の出力先セル
今回は、このまま "Button1()" にコピー&ペーストですね!
Sub Button1()
'ファイルを選択するとファイルパスとファイル名をセルに表示する処理を呼び出す
Dim toWorkbook As Workbook '出力先ブック
Dim withSheetName As String '出力先シート名
Dim fileType As String 'ファイル選択対象とするファイルの種類名
Dim fileExt As String 'ファイル選択対象とするファイルの拡張子
Dim range_Path As String '取得したファイルパスの表示先セル
Dim range_Name As String '取得したファイル名の表示先セル
Set toWorkbook = ThisWorkbook
withSheetName = "sheet1"
fileType = "EXCELファイル"
fileExt = "*.xlsx"
range_Path = "C3"
range_Name = "C4"
Call GetFilePathAndName(toWorkbook, withSheetName, fileType, fileExt, range_Path, range_Name)
End Sub
"Button2()" の処理は、ファイルパスを取得することです。
具体的な処理は、 "GetFilePath()" 内で行われますが、条件をここで設定しています。
withSheetName: ボタンや出力先セルがあるシート名称
range_Path: 取得したファイルパスの出力先セル
ここも、今回は、このまま "Button2()" にコピー&ペーストですね!
Sub Button2()
'フォルダを選択するとファイルパスをセルに表示する処理を呼び出す
Dim toWorkbook As Workbook '出力先ブック
Dim withSheetName As String '出力先シート名
Dim range_Path As String '取得したファイルパスの表示先セル
Set toWorkbook = ThisWorkbook
withSheetName = "sheet1"
range_Path = "C8"
Call GetFilePath(toWorkbook, withSheetName, range_Path)
End Sub
これで完成です!難しいところがあったら復習しましょう。
完成したVBAをテストする
それでは、テストしてみましょう!
まずは、”ファイルパス&ファイル名を取得” を押下してください・

ファイル選択のダイアログ(ウィンドウ)が開いたら、エクセルファイルを選択して、"OK" を押下します。

ボタンの隣のセルにファイルパスとファイル名が表示されたら成功です!
次は、”ファイルパス取得” を押下してください


ファイル選択のダイアログ(ウィンドウ)が開いたら、取得したいフォルダまでフォルダを選択していき、"OK" を押下します。

ボタンの隣のセルにファイルパスが表示されたら成功です!

まとめ
今回は「VBAを使ってファイルパスとファイル名を取得する方法」をご説明しました。
VBAを使って、ファイルパスやファイル名の取得を行うことで、ファイルパスやファイル名の設定が必要なツールにおいて、ミスやエラーの発生を低減できます。
次の、"ファイルパスやファイル名をファイルを選択する方法で取得するメリット” を再掲しますので、よく理解して今回の処理を活用していただけると幸いです。
- ファイル選択ダイアログが表示されるため、誰でも取得できる(特別なスキルを必要としない)
- 存在しないファイルパスやファイル名を後続処理に送ってしまい、エラーになることがない
- 選択できるファイルの拡張子(".xlxs"等)を指定するため、間違った拡張子のファイルを選ぶことがない