こんにちは、blueです。
前回はFileSystemObject(FSO)内のオブジェクトに対してプロパティの説明をしました。
前回の記事はこちら
今回は取得したオブジェクトに対してメソッドの説明をします。
FSOが使えるようになるとファイルの名前変更やコピー、移動などエクスプローラー上で行う操作はすべて可能になります。
難しそうに見えるかもしれませんがおおよその手順は決まっています。
大事な個所を絞って説明していきますのですべて読んでいただければきっと使えるようになります。
Excel内でのVBA操作から一歩踏み出て外の機能が使えるようになっていきましょう。
FSOを使用する手順
FSOを使用してファイル(フォルダ)を操作する手順は以下のようになります。
なおここでいうファイルやフォルダの操作はファイルを開くとか保存するとかなどExcel内で操作できる内容ではなく、ファイルにアクセスして操作する手順になります。
- 対象となるファイルあるいはフォルダパスを取得する
- 対象のファイル、フォルダパスに対するオブジェクトを取得する
- オブジェクトに対してメソッドやプロパティを使用する
今回は3のオブジェクトのメソッドについて説明します。
Folderオブジェクトのメソッド
フォルダオブジェクトのメソッドとしては以下のようなものがあります。
メソッド | 引数 | 説明 |
Copy | コピー先フォルダのパス, [上書きの有無] | Folderオブジェクトをコピー先フォルダにコピーする 上書きの有無は省略可能 規定値はTrue |
Delete | [読み取り専用の削除有無] | Folderオブジェクトを削除する 読み取り専用の削除有無は省略可能 規定値はFalse |
Move | 移動先フォルダのパス | Folderオブジェクトを移動先フォルダに移動する |
これらは普通にエクスプローラー上でもできる操作なのでイメージがわきやすいと思います。
実際のコードは以下になります。
(長いですが今回追加したコードは下から4行目以降です)
Private Sub Folder()
Dim FSO As Scripting.FileSystemObject
Dim objFolder As Scripting.Folder
Dim FD As FileDialog
Dim FolderName As String
Set FD = Application.FileDialog(msoFileDialogFolderPicker)
If FD.Show = True Then
FolderName = FD.SelectedItems(1)
Else
Exit Sub
End If
Set FSO = New Scripting.FileSystemObject
Set objFolder = FSO.getFolder(FolderName)
objFolder.Copy "C:\Users\Public\Documents\親フォルダ2\"
objFolder.Move "C:\Users\Public\Videos\"
objFolder.Delete
End Sub
注意点としては
- パスを直接記載する際は最後に\が必要
- Moveメソッドで移動したあとはオブジェクトのパスも変わる
- 同名のフォルダが存在する際Copyメソッドではエラーが出ないが, Moveメソッドではエラーになる
でしょうか。
これらのメソッドでは元のパスがobjFolderのパスになるので行き先パスだけの記載になります。
Fileオブジェクトのメソッド
ファイルオブジェクトのメソッドとしては以下のようなものがあります。
メソッド | 引数 | 説明 |
Copy | コピー先フォルダのパス, [上書きの有無] | Fileオブジェクトをコピー先フォルダにコピーする 上書きの有無は省略可能 規定値はTrue |
Delete | [読み取り専用の削除有無] | Fileオブジェクトを削除する 読み取り専用の削除有無は省略可能 規定値はFalse |
Move | 移動先フォルダのパス | Fileオブジェクトを移動先フォルダに移動する |
同様に実際のコードは以下になります。
(同様に今回作成したコードは下から4行目以降です)
Private Sub FileMethod()
Dim FSO As Scripting.FileSystemObject
Dim objFile As Scripting.File
Dim FD As FileDialog
Dim FileName As String
Set FD = Application.FileDialog(msoFileDialogFilePicker)
If FD.Show = True Then
FileName = FD.SelectedItems(1)
Else
Exit Sub
End If
Set FSO = New Scripting.FileSystemObject
Set objFile = FSO.getFile(FileName)
objFile.Copy "C:\Users\Public\Documents\親フォルダ1\子フォルダ2\"
objFile.Move "C:\Users\Public\Documents\親フォルダ1\子フォルダ3\"
objFile.Delete
End Sub
これらのメソッドも元のパスがobjFileのパスになるので行き先パスだけの記載になります。
Foldersコレクションのメソッド
Foldersコレクションのメソッドは以下になります。
メソッド | 引数 | 説明 |
Add | 名前 | Foldersコレクションに名前で表されるFolderオブジェクトを作成する |
フォルダの追加メソッドはFoldersコレクションに対して行います。
FileSystemObjectのメソッド
FileSystemObjectにも実は同様のメソッドが存在します。
メソッド | 引数 |
CopyFolder | コピー元フォルダのパス,コピー先フォルダのパス,[上書きの有無] |
CopyFile | コピー元ファイルのパス,コピー先フォルダのパス,[上書きの有無] |
DeleteFolder | 削除フォルダのパス |
DeleteFile | 削除ファイルのパス |
MoveFolder | 移動元フォルダのパス,移動先フォルダのパス |
MoveFile | 移動元フォルダのパス,移動先フォルダのパス |
違いがわかりにくいかもしれませんがこれらを使用するメリット、デメリットは以下です。
- (メリット)あらかじめコレクションやオブジェクトを取得する必要がない
- (メリット)複数のフォルダやファイルの指定が可能
- (デメリット)両方のパスを記載しないといけない
直接FSOから操作したほうがよいのか、オブジェクトを取得指定から操作するのがよいのかは作りたいプログラムによりますが、両方使えるようになるとよいと思います。
またFSOには別に以下のメソッドも存在します。
メソッド | 引数 | 説明 |
CreateFolder | フォルダパス | パスで表されるフォルダを新規作成する |
FolderExists | フォルダスペック | フォルダスペックで表されるフォルダが存在するかを調べる |
FileExists | ファイルスペック | ファイルスペックで表されるフォルダが存在するかを調べる |
GetFolder | フォルダパス | 第三回目で紹介 |
GetFile | ファイルパス | 第三回目で紹介 |
GetParentFolderName | ファイルパス | パスからフォルダパスを取得する |
GetFileName | ファイルパス | パスからファイル名(拡張子含む)のみを取得する |
GetBaseName | ファイルパス | パスからファイル名(拡張子含まない)のみを取得する |
GetExtensionName | ファイルパス | パスから拡張子のみを取得する |
GetAbsolutePathName | ファイルパス | パスから絶対パスを取得する |
GetDriveName | ファイルパス | パスからドライブ名を取得する |
〇〇〇Existsはフォルダやファイルの存在の有無を調べます。
またGet〇〇〇Nameで表されるメソッドは以下のようにパスの中の情報を取得します。
FileオブジェクトにはExtensionNameやBaseNameといったプロパティは存在しません。
これらを取得する際は文字列の操作が必要となりますが、FSOを使用すればパスから情報を取得することも可能です。
まとめ
今回はFSOで取得したオブジェクトに関するメソッドについて説明しました。
メソッドについてはFolderやFileオブジェクトのみでなく。FSOにも多くのものが存在します。
使い分けは必要となりますがぜひ自分のファイル、フォルダで試してみてもらえると幸いです。
次回からは実務で使える実際のコードについて説明します。
コメント