こんにちは、blueです。
今回からはFileSystemObject(FSO)についての話をします。
FSOとは簡単に言うと「エクスプローラーを直接操作するための機能」です。
FSOが使えるようになるとファイルの名前変更やコピー、移動などエクスプローラー上で行う操作はすべて可能になります。
難しそうに見えるかもしれませんがおおよその手順は決まっています。
大事な個所を絞って説明していきますのですべて読んでいただければきっと使えるようになります。
Excel内でのVBA操作から一歩踏み出て外の機能が使えるようになっていきましょう。
FSOを使用する手順
FSOを使用してファイル(フォルダ)を操作する手順は以下のようになります。
なおここでいうファイルやフォルダの操作はファイルを開くとか保存するとかなどExcel内で操作できる内容ではなく、ファイルにアクセスして操作する手順になります。
- 対象となるファイルあるいはフォルダパスを取得する
- 対象のファイル、フォルダパスに対するオブジェクトを取得する
- オブジェクトに対してメソッドやプロパティを使用する
今回は1について説明します。
ファイル、フォルダパスを取得する
ファイルを操作するにはまず対象となるフォルダやファイルのフルパスを取得する必要があります。
結論としては以下の3つの方法から取得するとよいです。
- フルパスを文字列型として直接コードに記載する
- Application.GetOpenFileNameメソッドを使って取得する
- Application.FileDialogを使って取得する
用途によりますが固定された場所を指定する場合は1を、ユーザーに指定させたい場合単純なものは2を、親切なものは3を使えばよいと思います。
次から詳しく説明します。
直接コードに記載する
いうまでもなく簡単です。ただ汎用性は落ちます。
コードは以下のようになります。一応取得したパスを利用してExcelファイルとして開いています。
Private Sub FileName()
Dim FileName As String
FileName = "C:\Users\Public\Book1.xlsx"
Workbooks.Open FileName
End Sub
Application.GetOpenFileNameメソッドを使って取得する
Officeアプリケーションの[ファイルを開く]ダイアログを表示させて取得するメソッドです。
Excel 97から存在するユーザーにファイルを選択させるもっとも簡単な方法になります。
なお最初にも述べた通り[ファイルを開く]ダイアログを表示させるメソッドなので実際にはファイルは開かれません(OpenFileName=「ファイルを開く」ダイアログを意味してます。わかりにくいですね)。
戻り値としてファイルのフルパスが取得できます。
単純にファイルのフルパスを取得したいだけならこの方法が一番楽です。
ただ以下のメリット、デメリットがある為使い分けを推奨します。
メリット:一行で「ファイル」のフルパスを取得できる(Excel VBA限定)
デメリット:ExcelVBA以外にはない機能の為WordVBAなどではできない。フォルダの取得ができない
サンプルコードは以下になります。
Private Sub GetOpenFileName()
Dim FileName As String
FileName = Application.GetOpenFileName
If FileName = "False" Then
Exit Sub
End If
Workbooks.Open FileName
End Sub
なおIf文については必須ではないですが「ファイルを開く」ダイアログにてキャンセルを押した場合の処理になります。
If文がない場合は以下のエラーになります。
ユーザーがキャンセルを押した場合はFalseが返る仕様になっています。
マクロがエラーで止まることを考慮するなら付け加えておいたほうが親切です。
Application.FileDialogを使って取得する
これはExcel 2002以降に追加されたオブジェクトです。
GetOpenFileNameより後に出た為多くの優れた点が存在します。
- 4種類のダイアログを表示させることができる
- オブジェクトなので色々なプロパティ、メソッドが存在する
1ではGetOpenFileNameであった[ファイルを開く]ダイアログボックス以外にもダイアログボックスを表示させることが可能です。
具体的には以下のように4種類が存在しますが、開く際に使用するのはmsoFileDialogFilePickerかmsoFileDialogFolderPickerで良いと思います。
理由としてはmsoFileDialogOpenの場合はExcelで開くことになり、エクセルで開けない場合はエラーになる為です。その為ファイルを開く操作は分けた方がいいと思います。
2では最初に表示されるフォルダ(カレントフォルダ)の指定や複数ファイルの選択が容易です。
InitialFileNameなど色々なプロパティがありますがここでは割愛します。
メリットとしては色々な機能が使えるこのコードですが、デメリットとしてはFileDialogオブジェクトをセットする必要があるのとコードが長くなるので最初は慣れないということがありますかね。
サンプルコードは以下になります。
Private Sub FD()
Dim FileName As String
Dim FD As FileDialog
Set FD = Application.FileDialog(msoFileDialogFilePicker)
If FD.Show = True Then
FileName = FD.SelectedItems(1)
Else
Exit Sub
End If
Workbooks.Open FileName
End Sub
なおElse文は必須ではないですが ダイアログにてキャンセルを押した場合の処理になります。
Elseがない場合は以下のエラーになります。
FileDialogにおいては ユーザーがキャンセルを押した場合は””が返ります。
この場合だと次のオブジェクトが取得できずエラーになるので注意ください。
まとめ
ここではファイル(フォルダ)パスの取得方法について説明しました。
なお、「ファイルを開く」操作などがあるのでFSOと勘違いされるかもしれませんがここまではExcel内での操作であり、まだFSOは使用していないことに注意してください。
次回以降で説明していきますので随時理解していただければと思います。
コメント