VBAでフォルダやファイルを操作するとき、FSO(FileSystemObject)を設定すると便利です。
このページではFileSystemObjectを使うために必要な設定(参照設定の方法)を紹介します。
また参照設定なしでFileSystemObjectを起動する方法も紹介します。
・参照設定を使えない場合の対処方法も紹介
・FileSystemObjectを使ったVBAプログラムの事例
以下で説明します。
目次
VBAでFileSystemObjectを使うための2つの方法
VBAでフォルダやファイルを操作するとき、FileSystemObjectを使うと便利です。
しかしFileSystemObjectを使うためには、準備しておくことがあります。
以下の2つのどちらかを採用することで、FileSystemObjectを操作できるようになります。
方法2. 参照設定を使わない方法
推奨は方法1です。
以下で詳しく設定方法と推奨理由を説明します。
方法1. 参照設定を使う方法
VBEで外部ライブラリへの参照設定を追加する方法です。参照設定とは、機能拡張させることです。
「Microsoft Scripting Runtime」にチェックを入れることで、FileSystemObjectを操作できるようになります。
具体的な手順は以下です。
手順1. VBEを開く
手順2. 「ツール」→「参照設定」
手順3. Microsoft Scripting Runtimeのライブラリにチェック
手順4. OKをクリック
以下で手順を見ていきます。
手順1. VBEを開く
エクセルを開いた状態で、[Alt] + [F11]のショートカットキーでVBE(Visual Basic Editor)を開くことができます。
なおエクセルVBAを使用するにあたって、以下の2つの準備をしておくと後で困ることが減ります。
2. 開発タブを追加
保存ファイルの拡張子変更、Excelの基本設定変更の2つです。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下のページで解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
手順2. 「ツール」→「参照設定」
「ツール」をクリックして、さらに「参照設定」をクリックします。
手順3. Microsoft Scripting Runtimeのライブラリにチェック
「Microsoft Scripting Runtime」にチェックを入れます。
手順4. OKをクリック
これで設定完了です。
方法2. 参照設定を使わない方法
Microsoft Scripting Runtimeの参照設定なしの(使えない)場合は、以下のようにプログラムを書くとOutlookを操作できます。
1 2 3 4 5 6 7 8 9 |
Sub UseFileSystemObject() '参照設定なし Dim fs As Object Set fs = CreateObject("Scripting.FileSystemObject") '参照設定あり 'Dim fs As Scripting.FileSystemObject 'Set fs = New Scripting.FileSystemObject End Sub |
上記の参照設定なしでのプログラムでも可能です。
Set fs = CreateObject(“Scripting.FileSystemObject”)
このようにObjectとCreateObject関数を使って参照設定なしでもFileSystemObjectを使うことは可能です。
方法1を推奨する理由
方法1の参照設定ありを使用することを推奨します。
なぜならMicrosoft Scripting Runtimeの参照設定にチェックを入れると、VBEでプログラムを作成しているときに、補完(ヒント)が出現します。
画像のように「fs.」と入力したら、そこから選択できるメソッドなどを表示してくれます。
これにより、コーディングミスを減らすことができます。
たしかに参照設定を使わなくてもコーディングはできますが、参照設定を使うほうが便利です。
FileSystemObjectで「ユーザー定義型は定義されていません」とエラーが出たときの対処法
「ユーザー定義型は定義されていません」とエラーが出る理由は、参照設定なしで「Scripting.FileSystemObject」を使おうとしたときに出現します。
エラーが出るパターン
「参照設定なし」で以下のプログラムを実行するとエラーが出ます。
1 2 3 4 5 6 |
Option Explicit Sub UseFileSystemObject() Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject End Sub |
参照設定をしていないので、「Dim fs As Scripting.FileSystemObject」のような変数を設定できない。
1 2 3 4 5 6 |
Option Explicit Sub UseFileSystemObject() Dim fs As Object Set fs = New Scripting.FileSystemObject End Sub |
参照設定をしていないので、「New Scripting.FileSystemObject」のオブジェクトを使えない。
上記のようなコードの場合は、上述した方法1のコードに変更することで、「ユーザー定義型は定義されていません」というエラーは出なくなります。
VBAでフォルダやファイル操作を行う方法|FileSystemObjectとDirのどちらが良いか?
VBAでフォルダやファイル操作を行う方法は以下の2つがあります。
2. Dir関数, FreeFile関数などを使う方法
2は外部ライブラリ(参照設定)を使わずに、プログラムを作ることができます。
わざわざ面倒な参照設定をして、FileSystemObjectを使うメリットはあるのか? と疑問に思う人もいるかもしれません。
しかし私は以下の2つの理由から、FileSystemObjectを使うことを推奨しています。
理由1|FileSystemObjectで高度なプログラムに慣れる
将来的なレベルアップのためです。
フォルダ操作のようなハイレベルの内容を扱っていくのあれば、将来的に外部ライブラリを使って出来ることを広げていくことを視野に入れてもよいと考えています。
参照設定も慣れてしまえば、そこまで煩雑な作業ではありません。
そのため今後のレベルアップという理由でDir関数やFreeFile関数よりもFileSystemObjectを推奨します。
理由2|FileSystemObjectで覚えることを少なくする
FileSystemObjectは、このオブジェクトでフォルダとファイルの両方を扱うことができます。
Dir関数やFreeFile関数は、フォルダやファイルと限定されています。
よって「フォルダやファイルを扱う場合は、FileSystemObjectを使う」と覚えることを少なくする点で有利と考えます。
そのため覚えることを少なくするという理由でDir関数やFreeFile関数よりもFileSystemObjectを推奨します。
FileSystemObjectに関連するオブジェクト・メソッド・プロパティ
FileSysteomに関連するオブジェクト(対象)、メソッド(操作)、プロパティ(性質)について説明します。
FileSystemObjectに関連するオブジェクト
このページで紹介するFileSystemObjectはコンピューターのファイルシステムへのアクセスするためのオブジェクトです。
オブジェクト | 説明 |
---|---|
FileSystemObject | ファイルシステムを操作するためのオブジェクトで、Folderオブジェクト、Fileオブジェクトが共通して利用する関数等を持つ。 |
Folders | フォルダのコレクション |
Folder | フォルダ操作用のオブジェクトであり、Foldersコレクションのメンバー |
Files | ファイルのコレクション |
File | ファイル操作用のオブジェクトであり、Filesコレクションのメンバー |
TextStream | テキストファイルでの入出力用のオブジェクト |
ここでは頻度高く使うオブジェクトのみを紹介しています。
FileSystemObjectのメソッド
メソッドとは、オブジェクトの動作・操作を指します。
FileSystemObjectのメソッドとしては、以下があります。
メソッド | 説明 |
---|---|
BuildPath | 既存のパスに名前を追加します。 |
CopyFile | 1 つ以上のファイルを別の場所にコピーします。 |
CopyFolder | 1 つ以上のフォルダーを別の場所にコピーします。 |
CreateFolder | 新しいフォルダーを作成します。 |
CreateTextFile | テキスト ファイルを作成し、ファイルの読み取りまたは書き込みに使用できる TextStream オブジェクトを返します。 |
DeleteFile | 指定した 1 つ以上のファイルを削除します。 |
DeleteFolder | 指定した 1 つ以上のフォルダーを削除します。 |
DriveExists | 指定したドライブが存在するかどうかを確認します。 |
FileExists | 指定したファイルが存在するかどうかを確認します。 |
FolderExists | 指定したフォルダーが存在するかどうかを確認します。 |
GetAbsolutePathName | 指定したパスのドライブのルートからの完全なパスを返します。 |
GetBaseName | 指定したファイルまたはフォルダーのベース名を返します。 |
GetDrive | 指定したパスのドライブに対応するドライブ オブジェクトを返します。 |
GetDriveName | 指定したパスのドライブ名を返します。 |
GetExtensionName | 指定したパスの最後のコンポーネントのファイル拡張子名を返します。 |
GetFile | 指定したパスのファイル オブジェクトを返します。 |
GetFileName | 指定したパスの最後のコンポーネントのファイル名またはフォルダー名を返します。 |
GetFolder | 指定したパスのフォルダー オブジェクトを返します。 |
GetParentFolderName | 指定したパスの最後のコンポーネントの親フォルダーの名前を返します。 |
GetSpecialFolder | Windows の一部の特殊フォルダーのパスを返します。 |
GetTempName | ランダムに生成された一時ファイルまたはフォルダーを返します。 |
Move | 指定したファイルまたはフォルダーを別の場所に移動します。 |
MoveFile | 1 つ以上のファイルを別の場所に移動します。 |
MoveFolder | 1 つ以上のフォルダーを別の場所に移動します。 |
OpenAsTextStream | 指定したファイルを開き、開いたファイルの読み取り、書き込み、または追加書き込みに使用できる TextStream オブジェクトを返します。 |
OpenTextFile | ファイルを開き、ファイルへのアクセスに使用できる TextStream オブジェクトを返します。 |
WriteLine | 指定した文字列と改行文字を TextStream ファイルに書き込みます。 |
以上がFileSystemObjectのメソッドです。
FileSystemObjectのプロパティ
プロパティとは、オブジェクトの状態や性質を指します。
FileSystemObjectのプロパティとしては、以下があります。
プロパティ | 説明 |
---|---|
Drives | コンピューター上のすべての Drive オブジェクトのコレクションを返します。 |
名前 | 指定したファイルまたはフォルダーの名前を設定するか返します。 |
Path | 指定したファイル、フォルダー、またはドライブのパスを返します。 |
Size | ファイルの場合は、指定したファイルのバイト単位でのサイズを返します。フォルダーの場合、そのフォルダーに含まれるすべてのファイルとサブフォルダーのサイズをバイト単位で返します。 |
Type | ファイルまたはフォルダーの種類に関する情報を返します (たとえば .TXT で終わるファイルの場合は、”Text Document” を返します)。 |
FileSystemObjectを使ったVBAプログラムの事例
FileSystemObjectを使ったVBAプログラムの事例を紹介します。
FileSystemObjectでファイル名取得・一覧化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub GetFoldersFilesName() 'プログラム2|シート設定 Dim ws As Worksheet Set ws = Worksheets("フォルダファイル取得") 'プログラム3|情報を取得するフォルダURLを取得 Dim path As String path = ws.Range("B2").Value 'プログラム4|FileSystemObjectの設定 Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject 'プログラム5|フォルダを取得 Dim basefolder As Scripting.Folder Set basefolder = fs.GetFolder(path) 'プログラム6|変数設定 Dim i As Long 'プログラム7|フォルダ内のフォルダを取得 Dim myfolders As Scripting.Folders Dim myfolder As Scripting.Folder Set myfolders = basefolder.SubFolders For Each myfolder In myfolders ws.Range("A5").Offset(i, 0).Value = "[フォルダ] " & myfolder.Name i = i + 1 Next 'プログラム8|フォルダ内のファイルを取得 Dim myfiles As Scripting.Files Dim myfile As Scripting.File Set myfiles = basefolder.Files For Each myfile In myfiles ws.Range("A5").Offset(i, 0).Value = "[ファイル] " & myfile.Name 'ws.Range("B5").Offset(i, 0).Value = "[拡張子] " & fs.GetExtensionName(myfile) i = i + 1 Next 'プログラム9|オブジェクト解放 Set myfile = Nothing Set myfiles = Nothing Set myfolder = Nothing Set myfolders = Nothing Set basefolder = Nothing Set fs = Nothing 'プログラム10|プログラム終了 End Sub |
以下で詳しく説明しています。
FileSystemobjectでフォルダ作成
1 2 3 4 5 6 7 |
Sub CreateFolder() Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject Dim path As String: path = "D:----" 'フルパスを入力 fs.CreateFolder (path) End Sub |
「fs.CreateFolder(path)」でフォルダを作成できます。
フォルダ作成は以下のページで詳しく説明しています。
FileSystemobjectでファイル拡張子を取得
1 2 3 4 5 6 7 |
Sub GetFileExtension() Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject Dim path As String: path = "D:----" 'ファイルパスを入力 fs.GetExtensionName (path) End Sub |
「fs.GetExtensionName (path)」でファイルの拡張子を取得できます。
拡張子を取得する事例は以下のページで詳しく説明しています。
FileSystemObjectでフォルダやファイルの存在チェック
フォルダの存在チェック
1 2 3 4 5 6 7 8 9 10 11 |
Sub CheckFolderExist() Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject Dim path As String: path = "D:----" 'フォルダパスを入力 If fs.FolderExists(path) = False Then 'フォルダが存在しないときに処理実行 Else 'フォルダが存在するときに処理実行 End If End Sub |
ファイルの存在チェック
1 2 3 4 5 6 7 8 9 10 11 |
Sub CheckFileExist() Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject Dim path As String: path = "D:----" 'ファイルパスを入力 If fs.FileExists(path) = False Then 'ファイルが存在しないときに処理実行 Else 'ファイルが存在するときに処理実行 End If End Sub |
FileSystemobjectで更新日時
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub GetUpdateDate() Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject Dim path As String path = "D:----" 'フルパスを入力 'フォルダ作成日時 fs.GetFolder(path).DateCreated 'フォルダ更新日時 fs.GetFolder(path).DateLastModified 'フォルダアクセス日時 fs.GetFolder(path).DateLastAccessed End Sub |
フォルダに関する日時の取得は上記のとおりです。
FileSystemobjectでファイル選択
FileSystemobjectでファイル操作する事例はこちらです。
FSOでエクセルファイルを開く
FileSystemObjectでエクセルファイルを開く事例はこちらです。