大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAを使ってファイルパスを取得する方法をまとめました。使いたい方法に応じてDir関数やワイルドカード、ダイアログでファイルのフルパスを取得できます。

はじめに

こちらの記事ではファイルパスを取得する方法について、一番簡単なフルパスで指定する方法からDir関数やワイルドカード、選択ダイアログを使う方法をご紹介します

Excel VBAでファイルを開いたりデータを取得したりするファイルの操作はファイルパスを取得する必要がありますのでファイル操作する際に使える情報かと思います。

こちらの記事を読んで得られることです

この記事から得られること

  • Excel VBAでファイルパスを取得する方法がわかります
  • ファイル名やフォルダ名が変わったりしてもファイルパスを取得できる方法がわかります
  • やりたい作業内容に応じてファイルパスを取得する方法を選ぶことができます

目次から見たい項目へ移動すると便利ですよ。

目次

使用するフォルダ構成

使用するフォルダ構成は簡単にこちらを用意しました。

使用するフォルダ構成

使用するフォルダ構成

Excel VBAコードが書かれたマクロファイルと同階層に『TEST』フォルダをおき、TESTフォルダの中に『ファイル1.xlsx』が保存されています。

ここではTESTフォルダが保存されているフォルダが第1階層で、ファイル1.xlsxが保存されているフォルダが第2階層として説明していきます。

直接フルパスを指定してファイルパスを取得

一番簡単なファイルパス取得の方法が直接フルパスを設定することです。

直接フルパスを指定してファイルパスを取得

直接フルパスを指定してファイルパスを取得

簡単ではありますが、ファイル名やフォルダ名が少しでも変わってしまうとファイルパスを取得できなくなります。

用途としては、ファイル名やフォルダ名がほとんど変わることがない場合に使うことができます。データベースのファイルパス取得に使ったりしています。

データベースの保存場所は変更になることはほとんどありませんからね。

VBAコード:現在フォルダからファイルパスを取得

'ファイルのフルパスを指定します
FilePath = "C:〇〇\〇〇\〇〇\TEST\ファイル1.xlsx"

VBAコードは1行で書けますのでやはり簡単ではあります。

取得したいファイルのフルパスを調べてExcel VBAコードの中に記載すれば終了です。

現在フォルダからファイルパスを取得

現在フォルダからファイルパスを取得する方法です。

ここで現在フォルダはExcel VBAコードが保存されているマクロファイルがあるフォルダを指しています。

現在フォルダからファイルパスを取得

現在フォルダからファイルパスを取得

この方法のメリットは現在フォルダより上の階層のフォルダ名が変更になってもファイルパスを取得できることです。

私もよく使うファイルパスの取得方法です。

この方法を使うと第1階層のフォルダごと自由に移動することができますので便利です。

VBAコード:現在フォルダからファイルパスを取得

Dim Path, FileName, FilePath
    
'フォルダパスを指定します
Path = ThisWorkbook.Path & "\TEST\"

'ファイル名を指定します
FileName = "ファイル1.xlsx"

'ファイルのフルパスを指定します
FilePath = Path & FileName

ポイントは『ThisWorkbook.Path』でマクロファイルのフォルダパスを取得するところです。

『ThisWorkbook.Path』を使えばマクロファイルが保存されているフォルダパスまでを取得することができます。

この方法はExcel VBAが保存されたマクロファイルと取得したいファイルがある場所が同じ位置関係にある必要があります。

またファイル名が変わってしまうとファイルパスを取得できなくなってしまうデメリットがあります。

次に説明するDir関数とワイルドカードを使った方法だとファイル名が変更になってもファイルパスを取得することができます。

Dir関数+ワイルドカード『*』を使ってファイルパスを取得

先ほどの『ThisWorkbook.Path』とDir関数+ワイルドカード『*』を使ってファイルパスを取得する方法です。

この方法を使うメリットはファイル名が変わってもファイルパスを取得することができる点です。

『ThisWorkbook.Path』を組み合わせていますので、Excel VBAコードが保存されたマクロファイルより上の階層のフォルダ名が変わってもファイルパスを取得できます。

Dir関数+ワイルドカード『*』を使ってファイルパスを取得

Dir関数+ワイルドカード『*』を使ってファイルパスを取得

この方法は取得したいファイルパスのファイル名が変更されることがある場合に威力を発揮します。

たとえば、ファイル名に日付+現在時刻などがついているファイル『ファイル_202007251320.xlsx』があってこの数字の部分が変更されるとかですね。

VBAコード:Dir関数+ワイルドカード『*』を使ってファイルパスを取得

'探索するフォルダを指定します
Dim Path, FileName, FilePath

'フォルダパスを指定します
Path = ThisWorkbook.Path & "\TEST\"

'ファイル名を取得します。
FileName = Dir(Path & "*.xlsx")

'ファイルのフルパスを指定
FilePath = Path & FileName

VBAコードのポイントは『Dir(Path & "*.xlsx")』のところです。

Dir関数は引数にフルパスを入力して、そのファイルがあればそのファイル名を出力してくれます。

例えば、『C:〇〇\〇〇\TEST\ファイル1.xlsx』を入力すると、ファイル名の部分である『ファイル1.xlsx』を返してくれます。

ワイルドカード『*』はざっくりいうと全部という意味になります。

ここで使っている『*.xlsx』だと、拡張子が.xlsxであるファイル全部という意味になります。

これでファイル名が変更になっても拡張子.xlsxが変わらなければファイルパスを取得することができます。

ただし、第2階層のフォルダの中には1つのファイルのみを保存しなければなりません。複数のファイルがあるといずれかのファイルパスを取得していまうことになるので注意です。

この方法ではマクロファイルと取得したいファイルの位置関係は同じにしておく必要があります。

ファイル選択用ダイアログを使ってファイルパスを取得

ファイル選択用ダイアログを使う方法が一番確実にファイルパスを取得することができると思います。

デメリットを上げるとすると毎回選択するのが面倒という点ぐらいです。

ファイル選択用ダイアログを使ってファイルパスを取得

ファイル選択用ダイアログを使ってファイルパスを取得

VBAコードを実行するとファイル選択用のダイアログがでてきますのでファイルパスを取得したいファイルを選択すればファイルパスを取得することができます。

VBAコード:ファイル選択用ダイアログを使ってファイルパスを取得

Dim FilePath
    
'カレントディレクトリを設定します
With CreateObject("WScript.Shell")
    .CurrentDirectory = ThisWorkbook.Path
End With

'ファイルを指定するダイアログを表示します
FilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xlsx?")

'設定しない場合は、終了します
If FilePath = False Then Exit Sub

最初に開くフォルダを指定します

ファイル選択用ダイアログを使う際のポイントはダイアログを開いた際の最初のフォルダ設定です。

『CreateObject("WScript.Shell").CurrentDirectory=最初に開きたいフォルダのパス』と指定することで最初に開きたいフォルダを指定できます。

ここでは最初に開きたいフォルダのパスを『ThisWorkbook.Path』とすることでマクロファイルがあるフォルダからスタートすることができます。

任意でファイル名を取得できるのはいいけど毎回デスクトップとかからファイルを探しにいくのは大変ですね。なのでダイアログを使う場合は最初のフォルダパスを指定することをおすすめします。

Application.GetOpenFilenameを使ってファイル選択用のダイアログを表示します

『Application.GetOpenFilename』を使えばファイル選択用のダイアログを表示させることができます。

開くファイル拡張子を指定できます

拡張子が『.xlsx』のファイルだけを選択できるようにしたい場合は、引数に『("Microsoft Excelブック,*.xlsx?")』を入力すれば指定した拡張子だけを選択できるようにすることができます。

ネットワークドライブ上でも使えます

このCreateObjectを使う方法はネットワークドライブ上のフォルダパスも指定できますので便利です。最初のフォルダの指定はこの方法を覚えておけばいいと思います。

CurDir()のコードではネットワークドライブ上のフォルダパスは指定できないんです。

フォルダ選択用ダイアログ+ワイルドカード『*』を使ってファイルパスを取得

最後の方法がフォルダ選択ダイアログ+ワイルドカード『*』を使ってファイルパスを取得する方法です。

ファイル選択用ダイアログを使う方法から少し手を加えたものでダイアログでフォルダを選択さえすればファイルパスが取得できる点がメリットになります。

フォルダ選択用ダイアログ+ワイルドカード『*』を使ってファイルパスを取得

フォルダ選択用ダイアログ+ワイルドカード『*』を使ってファイルパスを取得

VBAコードを実行するとフォルダ選択用のダイアログを表示されますので名前を取得したいファイルパスが保存されているフォルダを選択します。

選択したフォルダ内の.xlsxファイルを探してきてファイルパスを取得することができます。

VBAコード:フォルダ選択用ダイアログ+ワイルドカード『*』を使ってファイルパスを取得

Dim Path, FileName, FilePath

'任意フォルダを設定するダイアログを表示します
With Application.FileDialog(msoFileDialogFolderPicker)
    
    'カレントディレクトリを指定します
    .InitialFileName = ThisWorkbook.Path
    
    '設定しなかったら終了します
    If .Show = False Then Exit Sub
        
    '設定したフォルダを表示します
    Path = .SelectedItems(1)
    
End With

'ファイル名を取得します
FileName = Dir(Path & "\*.xlsx")

'ファイルのフルパスを設定します
FilePath = Path & "\" & FileName

『Application.FileDialog(msoFileDialogFolderPicker)』を使ってフォルダ選択用のダイアログを表示します。

FileDialogを使う場合は手動で参照設定が必要になります

VBA画面の『ツール』を選択します。

『ツール』の中から『参照設定』を選択します。

参照設定のダイアログがでてきますので『Microsoft Office 16.0 Object Library』をチェックしてOKをクリックします。

これでFileDialogが使えるようになります。

最初に開くフォルダを設定します

『.InitialFileName = ThisWorkbook.Path』で最初に開くフォルダパスを指定します。今回はマクロファイルが保存されたフォルダを最初に開くようにしています。

.SelectedItems(1)でフォルダパス取得

フォルダが選択されると『Path = .SelectedItems(1)』でフォルダのパスを保存します。

Dir()でファイルパス取得

『FileName = Dir(Path & "\*.xlsx")』でフォルダ選択用ダイアログで設定したフォルダ内の.xlsxファイルのファイル名を取得します。

『FilePath = Path & "\" & FileName』でフォルダパスとファイル名をつなげてファイルパスを取得することができます。

ファイル選択までクリックするのは面倒だという場合はこのフォルダ選択用ダイアログの方法を使うのもありだと思います。

おわりに

Excel VBAでファイルパスを取得する5つの方法について説明しました。

最初に説明した直接フルパスを指定してファイルパスを取得する方法は簡単ですが応用が利かないもので、あとに説明していくものは少しコードが複雑になりますが応用が利くものというように説明しました。

私が一番よく使うものは『ThisWorkbook.Path』を使ったファイルパスの取得です。簡単なコードを作る場合に使える方法です。

しっかりExcel VBAコードを作りこんで応用が利くものを作りたいといった場合はDir関数+ワイルドカードを使った方法やファイル選択のダイアログを使ってファイルパスを取得しています。

使いたい場面に応じたファイルパス取得のコードをまとめてありますのでご参考になるかと思います。

最後までご覧くださいましてありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

アーカイブから探す