みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
これまで、エクセルVBAでファイルやフォルダを取り合う使う方法についてシリーズでお伝えしてきました。
前回お届けしたこちらの記事
も含めて、Dir関数を中心にファイルやフォルダを操作する方法をお伝えしてきました。
Dir関数はそれ一つで色々なことができるので便利である半面で
- ループの処理が理解しづらい
- 3文字の拡張子が前方一致で判定されてしまう
- ネットワークドライブや長いパス名でエラー
などのデメリットがあります。しかも、これらのデメリット…初心者にはちょっと洗礼がきついです。
参照:Dir関数の制限について
それで、そんな悩みを解決する素敵なテクニックが、FileSystemオブジェクトなのです。
FileSystemオブジェクトを使うことにより、上記でメリットを解消しつつ、さらに細やかなファイルやフォルダの操作が可能になります。
ということで、何回かに渡って、FileSystemオブジェクトを中心に紹介していきます。
まず今回は、FileSystemオブジェクトの使い方と、FileSystemオブジェクトを使ってファイルのフルパスを簡単に生成&分解する方法ついてお伝えします。
FileSystemオブジェクトとは
FileSystemオブジェクトはファイル、フォルダ、ドライブを操作するためのオブジェクトです。
VBAにはDir関数、GetAttr関数、OpenやFileCopyなどのステートメントが存在していますが、FileSystemオブジェクトを使うことで
- ドライブ、フォルダ、ファイルなどをコレクションやオブジェクトとして取り扱うことができる
- 冒頭に挙げたDir関数の特徴のような特殊な事情を回避できる
- 細やかなファイルやフォルダの操作が可能
というメリットがあります。
初心者にとっては「オブジェクト」というと少し抵抗感があるかも知れませんが、慣れてしまえばFileSystemオブジェクトのほうがスッキリ使えるはずです。
FileSystemオブジェクトの生成と破棄
FileSystemオブジェクトを使う場合は、オブジェクトを生成する必要があります。
他のオブジェクトと同様ですが、このように書きます。
Set オブジェクト変数 = CreateObject(“Scripting.FileSystemObject”)
また、FileSystemオブジェクトを破棄したい場合は
とします。
例えば、オブジェクト変数をobjFsoとすると
Sub FSOを使う()
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
'処理
Set objFso = Nothing
End Sub
というプログラムがベースになり、途中に実行したい処理を入れていくということになります。
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
実行すると以下のように出力されます。
いつもは
ThisWorkbook.Path & "\text.txt"
などと”\”に注意する必要があったのですが、もうその気遣いは不要です。
ファイルのフルパスから様々な情報を取得する
FileSystemオブジェクトは、それとは逆に、ファイルのフルパスから様々な情報を分解して取得することも得意です。
いくつかの例を紹介しましょう。
GetParentFolderNameでフォルダ名を取得する
ファイルのフルパスからフォルダ名を取得する場合は、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メソッドです。
Dim strFilePath As String
strFilePath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\text.txt"
Debug.Print objFso.GetFileName(strFilePath) 'text.txt
GetBaseNameでベースネームを取得する
ファイルのフルパスからベースネームを取得する場合は、GetBaseNameメソッドです。
ベースネームというのは、ファイル名の拡張子を除いたものです。
Dim strFilePath As String
strFilePath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\text.txt"
Debug.Print objFso.GetBaseName(strFilePath) 'text
GetExtensionNameで拡張子を取得する
ファイルのフルパスから拡張子を取得する場合は、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オブジェクトですが、もちろん他のメソッドもたくさんありますので、順次紹介をしていきます。
まず、次回の記事では指定のファイルやフォルダが存在するかを判定する方法についてお伝えします。
どうぞお楽しみに!