Excel VBAでオブジェクト指向プログラミング(FSO編)

2024-01-05

■FileSystemObject(FSO)とは

FileSystemObject(FSO)はMicrosoftから提供されている、ファイルシステムへのアクセスに特化したオブジェクトで、さまざまな下位オブジェクト(サブクラス)やメソッドがあります。
操作対象によって大別すると、ドライブ関連、フォルダ関連、ファイル関連、テキストファイル関連の4グループに分かれており、提供されているメソッドは下表の通りです。
⇒詳細はMicrosoftのサイト(FileSystemObject オブジェクト)を参照して下さい。

ドライブ関連のメソッド

項目 説明
GetDriveメソッド 指定したドライブのDriveオブジェクトを返す
GetDriveNameメソッド 指定したパスのドライブ名を返す
DriveExistsメソッド 指定したドライブが存在するかどうかを返す

フォルダ関連のメソッド

項目 説明
CreateFolderメソッド フォルダを作成し、Folderオブジェクトを返す
GetFolderメソッド 指定したフォルダのFolderオブジェクトを返す
GetSpecialFolderメソッド 指定した特殊フォルダのFolderオブジェクトを返す
GetParentFolderNameメソッド 指定したフォルダの親フォルダ名を返す
FolderExistsメソッド 指定したフォルダが存在するかどうかを返す
CopyFolderメソッド フォルダをコピーする(戻り値なし)
DeleteFolderメソッド フォルダを削除する(戻り値なし)
MoveFolderメソッド フォルダを移動する(戻り値なし)

ファイル関連のメソッド

項目 説明
GetFileメソッド 指定したファイルのFileオブジェクトを返す
BuildPathメソッド パスとファイル名から生成したパスを返す
GetAbsolutePathNameメソッド 省略したパスから完全なパスを返す
GetBaseNameメソッド パスからファイル名のベース名(※)を返す
(※)ファイル名から拡張子を除いた部分
GetExtensionNameメソッド パスからファイル名の拡張子を返す
GetFileNameメソッド パスからファイル名を返す
GetFileVersionメソッド 指定したファイルのバージョンを返す
GetTempNameメソッド 生成した一時ファイル名を返す
FileExistsメソッド 指定したファイルが存在するかどうかを返す
CopyFileメソッド ファイルをコピーする(戻り値なし)
DeleteFileメソッド ファイルを削除する(戻り値なし)
MoveFileメソッド ファイルを移動する(戻り値なし)

テキストファイル関連のメソッド

項目 説明
CreateTextFileメソッド テキストファイルを作成し、TextStreamオブジェクトを返す
OpenTextFileメソッド テキストファイルをオープンし、TextStreamオブジェクトを返す
GetStandardStreamメソッド 標準入出力をオープンし、TextStreamオブジェクトを返す(VBAでは使用不可)

■FSOを使用するための事前準備

FSOを使用するための事前準備は、以下の3ステップです。
⇒オブジェクトを使用するための事前準備とオブジェクトブラウザによる調査方法については、Excel VBAでオブジェクト指向プログラミング(事前準備編)を参照して下さい。

①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでMicrosoft Scripting Runtimeのチェックボックスにチェックを入れ、[OK]ボタンを押下。

②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。

  1. Dim fso As Object

③インスタンスの生成
プログラムの処理部でインスタンスを生成。

  1. Set fso = New FileSystemObject
  2. 'ここにオブジェクトを使用した処理を記述
  3. Set fso = Nothing

(参考)「Set fso = New FileSystemObject」の部分を「Set fso = CreateObject(“Scripting.FileSystemObject")」と記述すれば、ステップ①(ライブラリの参照設定)は不要です。

次項以降ではドライブ関連の操作、フォルダ関連の操作、ファイル関連の操作について、もう少し詳しく説明します。

■ドライブ関連の操作

FSOでドライブ関連の操作を行うためには、FSOのドライブ関連のメソッドおよびDriveオブジェクトを使用します。

Driveオブジェクトの取得方法

①GetDriveメソッドによる取得
FSOのGetDriveメソッドにより取得する方法です。

  1. Dim fso As Object
  2. Dim drive As Object
  3. Private Sub Sample1()
  4.     Set fso = New FileSystemObject
  5.     Set drive = fso.GetDrive(“c:")
  6.     'ここにDriveオブジェクトを使用した処理を記述
  7.     Set drive = Nothing
  8.     Set fso = Nothing
  9. End Sub

②Drivesコレクションによる取得
FSOのDrivesプロパティにより、利用可能な全てのドライブの集合体であるDrivesコレクションを使用して取得する方法です。

  1. Dim fso As Object
  2. Dim drive As Object
  3. Private Sub Sample2()
  4.     Set fso = New FileSystemObject
  5.     For Each drive In fso.drives
  6.         'ここにDriveオブジェクトを使用した処理を記述
  7.     Next drive
  8.     Set fso = Nothing
  9. End Sub

Driveオブジェクトのプロパティ

項目 説明
AvailableSpaceプロパティ 当該ドライブの使用可能な容量を返す
DriveLetterプロパティ 当該ドライブのドライブ文字を返す
DriveTypeプロパティ 当該ドライブの種類を返す
FileSystemプロパティ 当該ドライブのファイルシステムの種類を返す
FreeSpaceプロパティ 当該ドライブの空き容量を返す
IsReadyプロパティ 当該ドライブが使用可能かどうかを返す
Pathプロパティ 当該ドライブのパスを返す
RootFolderプロパティ 当該ドライブのルートフォルダを返す
SerialNumberプロパティ 当該ドライブのシリアル番号を返す
ShareNameプロパティ 当該ドライブの共有名を返す
TotalSizeプロパティ 当該ドライブの全体の容量を返す
VolumeNameプロパティ 当該ドライブのボリューム名を返す

■フォルダ関連の操作

FSOでフォルダ関連の操作を行うためには、FSOのフォルダ関連のメソッドやFolderオブジェクトのメソッドおよびプロパティを使用します。

Folderオブジェクトの取得方法

①GetFolderメソッドによる取得
FSOのGetFolderメソッドにより取得する方法です。

  1. Dim fso As Object
  2. Dim folder As Object
  3. Private Sub Sample3()
  4.     Set fso = New FileSystemObject
  5.     Set folder = fso.GetFolder(“c:\work")
  6.     'ここにFolderオブジェクトを使用した処理を記述
  7.     Set folder = Nothing
  8.     Set fso = Nothing
  9. End Sub

②Foldersコレクションによる取得
指定したフォルダのサブフォルダを取得する場合、FolderオブジェクトのSubFoldersプロパティにより、サブフォルダの集合体であるFoldersコレクションを使用して取得する方法です。

  1. Dim fso As Object
  2. Dim subfolders As Object
  3. Dim folder As Object
  4. Private Sub Sample4()
  5.     Set fso = New FileSystemObject
  6.     Set subfolders = fso.GetFolder(“c:\work").subfolders
  7.     For Each folder In subfolders
  8.         'ここにFolderオブジェクトを使用した処理を記述
  9.     Next folder
  10.     Set folder = Nothing
  11.     Set fso = Nothing
  12. End Sub

Folderオブジェクトのメソッド

項目 説明
Copyメソッド 当該フォルダをコピーする
CreateTextFileメソッド テキストファイルを作成する
Deleteメソッド 当該フォルダを削除する
Moveメソッド 当該フォルダを移動する

Folderオブジェクトのプロパティ

項目 説明
Attributesプロパティ 当該フォルダの属性を返す
DateCreatedプロパティ 当該フォルダの作成日時を返す
DateLastAccessedプロパティ 当該フォルダの最終アクセス日時を返す
DateLastModifiedプロパティ 当該フォルダの最終更新日時を返す
Driveプロパティ 当該フォルダを含むDriveオブジェクトを返す
Filesプロパティ 当該フォルダのFilesコレクションを返す
IsRootFolderプロパティ 当該フォルダがルートフォルダかどうかを返す
Nameプロパティ 当該フォルダのフォルダ名を返す
ParentFolderプロパティ 親フォルダのFolderオブジェクトを返す
Pathプロパティ 当該フォルダのパスを返す
ShortNameプロパティ 当該フォルダの8.3形式のフォルダ名を返す
ShortPathプロパティ 当該フォルダの8.3形式のパスを返す
Sizeプロパティ 当該フォルダの合計サイズを返す
SubFoldersプロパティ 当該フォルダのSubFoldersコレクションを返す
Typeプロパティ 当該フォルダの種類を返す

■ファイル関連の操作

FSOでファイル関連の操作を行うためには、FSOのファイル関連のメソッドやFileオブジェクトのメソッドおよびプロパティを使用します。

Fileオブジェクトの取得方法

①GetFileメソッドによる取得
FSOのGetFileメソッドにより取得する方法です。

  1. Dim fso As Object
  2. Dim file As Object
  3. Private Sub Sample5()
  4.     Set fso = New FileSystemObject
  5.     Set file = fso.GetFile(“c:\work\test.txt")
  6.     'ここにFileオブジェクトを使用した処理を記述
  7.     Set file = Nothing
  8.     Set fso = Nothing
  9. End Sub

②Filesコレクションによる取得
指定したフォルダのファイルを取得する場合、FolderオブジェクトのFilesプロパティにより、ファイルの集合体であるFilesコレクションを使用して取得する方法です。

  1. Dim fso As Object
  2. Dim files As Object
  3. Dim file As Object
  4. Private Sub Sample6()
  5.     Set fso = New FileSystemObject
  6.     Set files = fso.GetFolder(“c:\work").files
  7.     For Each file In files
  8.         'ここにFileオブジェクトを使用した処理を記述
  9.     Next file
  10.     Set file = Nothing
  11.     Set fso = Nothing
  12. End Sub

③FoldersコレクションとFilesコレクションの併用
指定したフォルダ配下の全ファイル(指定したフォルダ直下のファイルおよびサブフォルダの中にあるファイル)を処理したい場合は、FoldersコレクションとFilesコレクションを併用して、再帰的に処理を行うのが良いです。

  1. Dim fso As Object
  2. Dim folder As Object
  3. Dim subfolder As Object
  4. Dim file As Object
  5. Private Sub Sample7()
  6.     Set fso = New FileSystemObject
  7.     Call Sample7_sub(“c:\work")
  8.     Set fso = Nothing
  9. End Sub
  10. Public Sub Sample7_sub(path As String)
  11.     Set folder = fso.GetFolder(path)
  12.     For Each file In folder.Files
  13.         'ここにFileオブジェクトを使用した処理を記述
  14.     Next file
  15.     For Each subfolder In folder.subfolders
  16.         Call Sample7_sub(subfolder.path)
  17.     Next subfolder
  18. End Sub

Fileオブジェクトのメソッド

項目 説明
Copyメソッド 当該ファイルをコピーする
Deleteメソッド 当該ファイルを削除する
Moveメソッド 当該ファイルを移動する
OpenAsTextStreamメソッド テキストファイルをオープンする

Fileオブジェクトのプロパティ

項目 説明
Attributesプロパティ 当該ファイルの属性を返す
DateCreatedプロパティ 当該ファイルの作成日時を返す
DateLastAccessedプロパティ 当該ファイルの最終アクセス日時を返す
DateLastModifiedプロパティ 当該ファイルの最終更新日時を返す
Driveプロパティ 当該ファイルを含むDriveオブジェクトを返す
Nameプロパティ 当該ファイルのファイル名を返す
ParentFolderプロパティ 当該ファイルを含むFolderオブジェクトを返す
Pathプロパティ 当該ファイルのパスを返す
ShortNameプロパティ 当該ファイルの8.3形式のファイル名を返す
ShortPathプロパティ 当該ファイルの8.3形式のパスを返す
Sizeプロパティ 当該ファイルのサイズを返す
Typeプロパティ 当該ファイルの種類を返す

■FSOを利用したExcelツールの具体例

FSOを利用したExcelツールの具体例については、Excel VBAでオブジェクト指向プログラミング(FSOを利用したExcelツール編)を参照して下さい。

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ