初めまして、blueといいます。
このページではExcel VBAで用いる「FileSystemObject(FSO)」についてわかりやすくまとめた記事を紹介します。
Excel VBAで少し自動化ができるようになった頃
・ファイルやフォルダを操作の際FSOという言葉が出てくる
・VBAを使って多量のフォルダやファイルを操作したい
と思ったことはないでしょうか?
ここではそんな方に対してFSOについて詳しく説明していこうと思います。
私はExcel VBAスタンダードを2021年8月に1000点中の950点とほぼ満点の内容で合格しています。
また取得後もVBAを用いて業務の効率化を行っています。
この「FileSystemObjectまとめ記事」ではFSOの使用方法を
- 初めての方向けに
- できる限りわかりやすい方法で
- 図表多め
で書き綴っていきましたので紹介します。
初めての方のよくある疑問
- そもそもFSOって何なの?
- どうやって使用するの?
- どういった場面で使えるの?
こんな疑問もまとめ記事の中で説明しながら進めていきます。
なお使用するにもある程度決まった型があるのでこのまとめ記事で流れさえ覚えてしまえれば自然に使えるようになります(難しいという方はDir関数という方法もあります リンクはこちら)
細かい説明はいいから実用コードについて教えて!という方は下のボタンから飛べます。
なお、このまとめ記事ではVBAのコード自体はほぼ記載していません。
あくまでわかりやすく「流れ」を説明するための記事ですので、実際のコードを見たい方は途中にある個別記事をご覧いただければ幸いです。
[STEP1] FSOって何?
FileSystemObjectとはWindowsのファイルシステムにアクセスするためのオブジェクトです。
これだけだとわかりにくいですが以下のようにWindowsのエクスプローラーを操作するイメージです。
いくつか例を紹介します。
エクスプローラーでは階層構造のファイルやフォルダを見たり・・・
ファイルの名前や基本情報を見たり・・・
ファイルに対してアクション(メソッド)やより詳細な情報(プロパティ)を確認したりできます。
これらの機能はFSOを生成(インスタンス化)するとすべて(!)使えるようになります。
FSOって何?に関する記事はこちら
[STEP2] FSOを使用する流れ
FSOを使用してファイル(フォルダ)を操作する手順は以下のようになります。
なおここでいうファイルやフォルダの操作はファイルを開くとか保存するとかなどExcel内で操作できる内容ではなく、ファイルにアクセスして操作する手順になります。
- 対象となるファイルあるいはフォルダパスを取得する
- 対象のファイル、フォルダパスに対するオブジェクトを取得する
- オブジェクトに対してメソッドやプロパティを使用する
2以降がFSOの関連する部分となりますが1も覚えておくと楽になるのでこちらも説明します。
[STEP3] ファイル、フォルダパスを取得する
ファイルを操作するにはまず対象となるフォルダやファイルのフルパスを取得する必要があります。
結論としては以下の3つの方法から取得するとよいです。
- フルパスを文字列型として直接コードに記載する
- Application.GetOpenFileNameメソッドを使って取得する
- Application.FileDialogを使って取得する
用途によりますが固定された場所を指定する場合は1を、ユーザーに指定させたい場合単純なものは2を、親切なものは3を使えばよいと思います。
これらを使ってフォルダやファイルパスを取得するのが最初の作業となります。
ファイル、フォルダパスの取得に関する記事はこちら
[STEP4] FSOを使用し、中を覗いてみる
VBAでFSOを使用できるようにするには環境を整える必要があります。
方法としては以下の2通りがあります。
- 参照設定を行った後 Newキーワードで生成させる
- CreateObjectで実行時に生成させる
以下の動画は参照設定を使ってFSOを取得する簡単なコードでWindowsのフォルダの情報までの階層を確認しています。
Sub FileSystemObject1()
'参照設定を行う方法
Dim FSO As Scripting.FileSystemObject
Set FSO = New FileSystemObject
End Sub
この方法を用いてFSOを使用すると以下のようにWindows内にあるファイル情報をすべて一瞬で取得することができるようになります。
FSOの取得に関する記事はこちら
[STEP5] FSO内のオブジェクトを取得する
STEP4で取得したFSOの中身は以下のようになっています。
下層のオブジェクトは上から一つずつ取得することもできますには直接指定して取得することが可能な以下のメソッドがあります。
- FSO.GetDriveメソッド…指定したパスに対応するDriveオブジェクトを返します
- FSO.GetFileメソッド…指定したパスに対応するFileオブジェクトを返します
- GetFolderメソッド…指定したパスに対応するFolderオブジェクトを返します
以下の記事ではこれらオブジェクトの取得方法を宣言方法から詳しく説明しています。
File、Folderオブジェクトの取得に関する記事はこちら
[STEP6] FSOのプロパティ、メソッドを使用する
STEP5でオブジェクトを取得すれば後はプロパティでエクスプローラーに存在する情報は簡単に取得できます。
プロパティで実際に取得できる情報をエクスプローラーで説明すると以下のようになります。
(例:以下のように「子フォルダ1」に関する情報を取得する場合)
ファイルの場所
「子フォルダ1」のプロパティの取得
「子フォルダ1」の上層のParentFolder,下層のSubFolders、Filesプロパティ
実際に使用するプロパティについては以下で詳しく説明しています。
またFSOのメソッドを使用してファイルのコピーや移動を行ったり、以下のようにフォルダやファイルパスの任意の情報を取得することもできます。
オブジェクトのメソッドに関する記事はこちら
[STEP7] FSOの実務コードを紹介!
ここからは私が実務で実際に使用しているコードを説明します。
1 フォルダ内のファイル名を一括変更する
このコードはフォルダ内のファイル名の先頭や末尾に同じ文字列を追加したい場合に使えます。
私は[〇〇Ptoject]や[01~]の通し番号を付けたい時に使っています。
2 フォルダ内の最新ファイルを取得する
このコードはフォルダ内のファイルが日々追加されていく中で最新ファイルを取得したい時に使えます。
私はファイルが日々修正されていくような状況で最新ファイルを取得してOutlookで送付するようなプログラムに使っています。
3 365日分のファイルを作成する
このコードは1年間分のファイルを月ごとに分けて作りたい場合などに使えます。
私は日々フォーマットを使用して作成する必要がある業務などであらかじめ作成しています。
4 フォルダ以下の全てのファイルパスを取得する
このコードは特定フォルダ内の最下層までの全てのファイルパスを取得したい場合に使えます。
私は共有フォルダなどのファイル検索に時間がかかる場面に対してあらかじめパスを取得しておいて、その後エクセルの検索機能を使えるようにしています。
5 フォルダ以下の全てのファイルパスを取得する(階層構造)
このコードは4に対して階層構造やハイパーリンクを追加したものです。
深い構造や多岐にわたるフォルダの場合は逆に煩雑になりますがハイパーリンクの機能は使えます。
まとめ
今回はFSOって何なの?というところから実用例までの紹介をしました。
実際のコードについては少し難しいものも存在しますが、まずは全体の流れをつかめればよいと思っています。
全体の流れがわかれば理解も早くなると思っています。
これらの記事を通して少しでもFSOを使えるようになっていただければ幸いです。
おまけ
フォルダやファイルの一覧を検索したい場合に使うDir関数についてもまとめました。
FSOが使えてしまえば不要な関数ですが他の方のコードで見る機会もあると思いますので参考にしていただければ幸いです。
コメント