【エクセルVBA】FileSystemオブジェクトの基本と簡単にフルパスを生成・分解する方法


File under C for Cat

photo credit: Johnny Vulkan File under C for Cat via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

これまで、エクセルVBAでファイルやフォルダを取り合う使う方法についてシリーズでお伝えしてきました。

前回お届けしたこちらの記事

エクセルVBAでDir関数を使ってフォルダ一覧を表示する方法
エクセルVBAでファイルやフォルダを取り合う使う方法についてお伝えしています。Dir関数を使えばフォルダ一覧の出力もお手のもの。今回は、エクセルVBAでDir関数を使ってフォルダ一覧を表示する方法です。

も含めて、Dir関数を中心にファイルやフォルダを操作する方法をお伝えしてきました。

Dir関数はそれ一つで色々なことができるので便利である半面で

  • ループの処理が理解しづらい
  • 3文字の拡張子が前方一致で判定されてしまう
  • ネットワークドライブや長いパス名でエラー

などのデメリットがあります。しかも、これらのデメリット…初心者にはちょっと洗礼がきついです。

参照Dir関数の制限について

それで、そんな悩みを解決する素敵なテクニックが、FileSystemオブジェクトなのです。

FileSystemオブジェクトを使うことにより、上記でメリットを解消しつつ、さらに細やかなファイルやフォルダの操作が可能になります。

ということで、何回かに渡って、FileSystemオブジェクトを中心に紹介していきます。

まず今回は、FileSystemオブジェクトの使い方と、FileSystemオブジェクトを使ってファイルのフルパスを簡単に生成&分解する方法ついてお伝えします。

スポンサーリンク

FileSystemオブジェクトとは

FileSystemオブジェクトファイル、フォルダ、ドライブを操作するためのオブジェクトです。

VBAにはDir関数、GetAttr関数、OpenやFileCopyなどのステートメントが存在していますが、FileSystemオブジェクトを使うことで

  • ドライブ、フォルダ、ファイルなどをコレクションやオブジェクトとして取り扱うことができる
  • 冒頭に挙げたDir関数の特徴のような特殊な事情を回避できる
  • 細やかなファイルやフォルダの操作が可能

というメリットがあります。

初心者にとっては「オブジェクト」というと少し抵抗感があるかも知れませんが、慣れてしまえばFileSystemオブジェクトのほうがスッキリ使えるはずです。

FileSystemオブジェクトの生成と破棄

FileSystemオブジェクトを使う場合は、オブジェクトを生成する必要があります。

他のオブジェクトと同様ですが、このように書きます。

Dim オブジェクト変数 As Object
Set オブジェクト変数 = CreateObject(“Scripting.FileSystemObject”)

また、FileSystemオブジェクトを破棄したい場合は

Set オブジェクト変数 = Nothing

とします。

例えば、オブジェクト変数をobjFsoとすると

Sub FSOを使う()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

'処理

Set objFso = Nothing

End Sub

というプログラムがベースになり、途中に実行したい処理を入れていくということになります。

BuildPathメソッドでファイルのフルパスを生成する

そんなFileSystemオブジェクトですが、まず最初にお伝えしたい便利なメソッドがファイルのフルパスを生成するBuildPathメソッドです。

書き方はこちら。

FileSystemオブジェクト.BuildPath(パス, ファイル名)

これで、パスとファイル名を結合して、そのファイルのフルパスを生成してくれます。

このメソッドが秀逸なのはフォルダ名の末尾の”\”を自動的に付与してくれることです。

例えば、以下のようなプログラムを作りました。

Sub ファイルのフルパスを生成する()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

Debug.Print objFso.BuildPath(ThisWorkbook.Path, "text.txt")

Set objFso = Nothing

End Sub

実行すると以下のように出力されます。

エクセルVBAでフルパスを生成して出力

いつもは

ThisWorkbook.Path & "\text.txt"

などと”\”に注意する必要があったのですが、もうその気遣いは不要です。

ファイルのフルパスから様々な情報を取得する

FileSystemオブジェクトは、それとは逆に、ファイルのフルパスから様々な情報を分解して取得することも得意です。

いくつかの例を紹介しましょう。

GetParentFolderNameでフォルダ名を取得する

ファイルのフルパスからフォルダ名を取得する場合は、GetParentFolderNameメソッドを使います。

FileSystemオブジェクト.GetParentFolderName(フルパス)
Dim strFilePath As String
strFilePath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\text.txt"

Debug.Print objFso.GetParentFolderName(strFilePath) 'C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir

GetFileNameでファイル名を取得する

ファイルのフルパスからファイル名を取得する場合は、GetFileNameメソッドです。

FileSystemオブジェクト.GetFileName(フルパス)
Dim strFilePath As String
strFilePath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\text.txt"

Debug.Print objFso.GetFileName(strFilePath) 'text.txt

GetBaseNameでベースネームを取得する

ファイルのフルパスからベースネームを取得する場合は、GetBaseNameメソッドです。

ベースネームというのは、ファイル名の拡張子を除いたものです。

FileSystemオブジェクト.GetBaseName(フルパス)
Dim strFilePath As String
strFilePath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\text.txt"

Debug.Print objFso.GetBaseName(strFilePath) 'text

GetExtensionNameで拡張子を取得する

ファイルのフルパスから拡張子を取得する場合は、GetExtensionNameメソッドを使います。

FileSystemオブジェクト.GetExtensionName(フルパス)
Dim strFilePath As String
strFilePath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\text.txt"

Debug.Print objFso.GetExtensionName(strFilePath) 'txt

ちなみに、GetExtensionNameで取得する拡張子にはピリオドは含まれません。

まとめ

以上、エクセルVBAでFileSystemオブジェクトを生成・破棄する方法と、ファイルのフルパスを生成・分解する便利なメソッドをお伝えしました。

今回ご紹介したメソッドはこちら。

  • BuildPathメソッド:パスとファイル名からフルパスを生成する
  • GetParentFolderNameメソッド:フルパスからフォルダ名を取得する
  • GetFileNameメソッド:フルパスからファイル名を取得する
  • GetBaseNameメソッド:フルパスからベースネームを取得する
  • GetExtensionName:フルパスから拡張子を取得する

いずれも使いどころはけっこうあると思います。

これだけでも便利なFileSystemオブジェクトですが、もちろん他のメソッドもたくさんありますので、順次紹介をしていきます。

まず、次回の記事では指定のファイルやフォルダが存在するかを判定する方法についてお伝えします。

【エクセルVBA】FileSystemオブジェクトでファイルやフォルダが存在するかを判定する
エクセルVBAのFileSystemオブジェクトでファイルやフォルダの操作をする方法をお伝えしています。今回はFileExists、FolderExistsメソッドでファイル・フォルダの存在を判定します。

どうぞお楽しみに!

連載目次:FileSystemオブジェクトでフォルダやファイルを操作する

ファイルやフォルダを操作するのはデリケートな気がしますが、エクセルVBAではFileSystemオブジェクトを使うことでファイル、フォルダ、ドライブをオブジェクトとして安全にそして細やかに操作をすることができます。 このシリーズでは、FileSystemオブジェクトの様々な活用法についてシリーズでお伝えしていきます。
  1. 【エクセルVBA】FileSystemオブジェクトの基本と簡単にフルパスを生成・分解する方法
  2. 【エクセルVBA】FileSystemオブジェクトでファイルやフォルダが存在するかを判定する
  3. 【エクセルVBA】指定のフォルダが存在するか判定して、存在してなければ作成する方法
  4. 【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法
  5. 【エクセルVBA】FileSystemオブジェクトでフォルダ内のサブフォルダ一覧を取得する

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