- Excel VBAでFileSystemObject(FSO)を使用する
- FileSystemObject を作成する
- ‘Exists’ メソッドの使用
- 「取得」メソッドの使用
- GetAbsolutePathname
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- 「作成」メソッドを使用する
- CreateFolder
- CreateTextFile
- 「コピー」メソッドの使用
- CopyFile
- CopyFolder
- 「移動」メソッドを使用する
- MoveFile
- MoveFolder
- DeleteFile
- DeleteFolder
- FSO の他のメソッド
- OpenAsTextStream.
- OpenTextFile
- Name
- Path
- Size
- Type
Excel VBAでFileSystemObject(FSO)を使用する
FileSystemObject(FSO)によりコンピューターのファイルシステムにアクセスする一連の関数にアクセスすることができます。 このオブジェクトを使用すると、ファイル、フォルダー、およびドライブに簡単にアクセスでき、また、ファイルの読み取りと書き込みもできます。
FSO 関数の多くは、従来の VBA でも記述できましたが、より多くのコーディングを必要とし、新しく加わった開発者が維持および理解するのはより困難でしょう。 FSO は、試行錯誤された API (Application Programming Interface) であり、独自のコードよりも信頼性が高いです。 使いやすく、すぐに利用できます。
FSO は、国際標準と、ユーザーがコンピューターに持つ設定に合わせて動作します。 Excel アプリケーションをグローバルに配布する場合、FSO を使用することにより、独自のコードでは困難な、国による設定の違いに対処することができます。
FileSystemObject を作成する
FileSytemObject は Excel VBA の一部ではありません。 VBA でオブジェクトを作成(レイトバインディング)することでFSO を使用できます。
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
あるいは、FSO ライブラリへの参照を VBA に追加することもできます。 これは早期バインディングと呼ばれ、コードの実行時にオブジェクトを作成する必要がないため、後期バインディングよりも高速です。
参照を追加するには、Alt-F11 を押して Visual Basic Editor (VBE) に入り、VBE メニューから「ツール |参照」を使用する必要があります。 これにより、関連する参照を選択するためのポップアップ ウィンドウが表示されます (以下を参照)。
利用可能な参照のリストを「Microsoft Scripting Runtime」が表示されるまでスクロールダウンします。 チェックボックスをオンにして、[OK] をクリックすると、ライブラリがアプリケーションの一部になります。
アプリケーションを他の同僚や場所に配布する場合、彼らのコンピュータの正しい場所にこのファイルがあることが重要で、そうでなければあなたのコードはエラーになります。
参照が追加されたら、次のコードを使用して FSO を作成できます。
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
この記事のすべての例では、FSO を作成するためにこの方法を使用します。
‘Exists’ メソッドの使用
FSO メソッドを使用して、ドライブ、フォルダー、またはファイルが存在するかどうかを確認することができます。 これらのメソッドは使いやすく、1 つのパラメーターしか必要としません。
Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub
これらのステートメントは、コンピューターに C: ドライブ、その中の ‘Temp’ というフォルダー、および Temp フォルダー内の ‘testfile.txt’ というファイルがあると仮定するとすべて ‘True’ と返されます。 また、URL (Uniform Resource Locator) を使用して、フォルダーやファイルの場所を記述することもできません。 FSOは、純粋にWindowsオペレーティングシステムとその上のファイルシステム上で動作します。 外部サーバーの場所については、まずこれにドライブをマッピングし、次にドライブ パス自体を使用する必要があります。
「取得」メソッドの使用
FSO には、パスとファイルを分割したり、作成日や変更日などのファイルまたはフォルダー情報を取得する多数のメソッドが用意されています。
GetAbsolutePathname
これは、指定されたドライブのルートからの完全なパスを提供します。
構文は次のとおりです。
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
これは文字列 ‘C:\UsersRichard㈳Documents’を返します。 これは、パスがC:の後にドットが3つ続くように指定されているためです。
GetBaseName
指定されたファイルまたはフォルダの名前を返します。
構文は次のとおりです。 このメソッドは、パス名の最後のセクションを返します。
GetDrive
指定されたドライブ文字に基づいて、ドライブ情報にアクセスするコードを使用することができます。
Syntax is:
GetDrive (drivespec)
Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Set Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceEnd Sub
このメソッドは、指定したドライブに基づいたドライブ・オブジェクトを返します。 このオブジェクトを使用して、使用可能な空き領域など、ドライブに関する情報にアクセスできます。
GetDriveName
このメソッドは、パス/ファイル名文字列からドライブ名を切り分けます。
Syntax is:
GetDriveName (path)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
これは ‘C:’
GetExtensionName
これは指定したパスのファイルのサフィックスを返します。
構文は次のとおりです。
GetExtensionName (path)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
これは ‘txt’ を返します。
ファイルが指定されていない場合、空の文字列が返されます。
GetFile
このメソッドは、ファイル自体に関するさまざまな情報を保持するファイル オブジェクトを返します。
構文は次のとおりです。
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
これは「testfile.txt」を返します。
GetFolder
指定したパスにあるベースフォルダーのフォルダーオブジェクトを作成します。 パスはフォルダー名のみを含む必要があります。
Syntax is:
GetFolder (folderspec)
Sub FolderInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedEnd Sub
フォルダ・オブジェクトは、アクセス可能なさまざまな情報を持っています。 この場合、フォルダーが作成された日付を返します。
また、このメソッドを使用して、指定したフォルダー内のすべてのファイル名を取得できます。
構文は次のとおりです。
GetParentFolderName (path)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
これは、フォルダ ‘richard’ の「親」であるため ‘Users’ と返されます。
「作成」メソッドを使用する
FSOでは、新しいフォルダとパスを作成し、テキストファイルを作成できます。
CreateFolder
作成する新しいフォルダのパス名を指定することができます。 この場合の危険は、そのフォルダがすでに存在する場合、エラーが発生することです。
CreateFolder (foldername)
Sub CreateNewFolder()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"If MyFSO.FolderExists(Pth) = False Then MyFSO.CreateFolder (Pth)End IfEnd Sub
このコードは既存のパス ‘C:\temp’ の下に ‘MyFolder’ という新しいフォルダを作成するものです。
CreateTextFile
簡単なテキストファイルを作成し、そこに直接書き込むことができるメソッドです。
Syntax is:
CreateTextFile (filename, ])
Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Set Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Add my own text here" & vbLf & "This is the second line"Fn.CloseEnd Sub
このコードでは ‘C:’ ドライブの ‘Temp’ フォルダに ‘Myfile.txt’ というテキスト ファイルを作成し、それに 2 行のテキストを書き込んでいます。
書き込む文字列には改行文字が含まれます。
書き込むパスが存在しない場合、エラーが発生します。
必要であれば、既存のファイルを上書きするためのオプションのパラメーターがあります。
「コピー」メソッドの使用
これらのメソッドを使用して、ファイルまたはフォルダーを別の場所にコピーできます。
CopyFile
このメソッドは、あるフォルダー位置から別のフォルダー位置にファイルをコピーします。
CopyFile source, destination,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
このコードは、「C:³³」にあるすべてのテキスト(txt)ファイルを「C:³³」にコピーし、必要に応じてファイルを上書きするコードです。 Overwriteの初期設定はTrueです。
ファイル名にはアスタリスク(*)のワイルドカードを使用できますが、1文字を表すクエスチョンマーク(?)のワイルドカードを使用することはできません。
CopyFolder
このメソッドを使用して、ある場所から別の場所にフォルダ全体をコピーできます。
Syntax is:
CopyFolder source, destination,
Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub
このコードでは ‘C:\temp’ 以下のすべてのフォルダとファイルが ‘C:\usershard’ にコピーされます。
この方法を使用した場合、4つの結果が考えられます。
- コピー先が存在しない場合、コピー元のフォルダーと内容がコピーされます。
- コピー先がすでに存在する場合、エラーが発生します。
- コピー先がフォルダーの場合、コピー元のフォルダーとその内容がコピーされます。 OverwriteがFalseに設定され、宛先にすでにファイルのコピーがある場合、エラーが発生します。
- 宛先が読み取り専用に設定されている場合、上書きがFalseに設定されているとエラーが発生します。
この方法は、最初に遭遇したエラーで停止します。
「移動」メソッドを使用する
これらのメソッドは、ファイルまたはフォルダーを他の場所に移動するために使用することができます。 これは、ある場所から切り取り、別の場所に貼り付けるのと同じです。
MoveFile
このメソッドは、特定のファイルを別の場所に移動するために使用されます。
構文:
MoveFile source, destination
Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub
このコードは、「C:³³」にあるすべてのファイルを「C:³³³」に移動します。
移動先フォルダは自動的に作成されないので、移動元フォルダと移動先フォルダが存在する必要があります。
MoveFolder
このメソッドは、特定のフォルダーをある場所から別の場所に移動します。
MoveFolder (source, destination)
Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub
このコードはフォルダー ‘myfolder’ とコンテンツをフォルダー ‘mydestination’ へ移動させます。 myfolder’は事実上削除され、’mydestination’が’myfolder’の内容と一緒に作成されます。
移動先のフォルダがすでに存在する場合は、エラーが発生します。
DeleteFile
個々のファイルまたはワイルドカードを使用したファイルのグループを削除します。
Syntax is:
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
このコードは、フォルダ ‘C:\temp’
内のすべてのファイルを削除します。 Trueを指定した場合、読み取り専用のファイルは削除されます。
DeleteFolder
このメソッドは、指定したフォルダとその内容を削除します。
Syntax is:
DeleteFolder folderspec,
Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub
このコードはフォルダ ‘MyDestination’ およびそのフォルダ内のすべてのファイルを削除します。 フォルダ ‘temp’ は残ります。
Force パラメータはオプションで、True または False に設定されます。 Trueに設定すると、読み取り専用のフォルダーが削除されます。 デフォルトは False です。
パスの最後のコンポーネントでワイルドカードを使用することができます。
このメソッドは、最初に発生したエラーで停止します。
FSO の他のメソッド
OpenAsTextStream.
このメソッドは指定したファイルを Text Stream オブジェクトとして開き、読み取りまたは書き込みができるようにします。 このメソッドの利点は、あらゆるファイル タイプを開き、利用可能なテキストを抽出できることです。
Syntax is:
OpenAsTextStream (])
パラメータ ‘iomode’ は読み取り専用 (1) 、読み取り/書き込み (2) 、追加 (8) を許可しています。 read/writeパラメータはファイルを上書きします。
「format」パラメータは、システムのデフォルトでは-2、Unicodeとしてファイルを開く場合は-1、ASCII(情報交換用の米国標準コード)としてファイルを開く場合は0に設定します。
Sub TextStream()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")Set ts = f.OpenAsTextStream(2)ts.Write "My new text"ts.CloseSet ts = f.OpenAsTextStream(1)s = ts.ReadLineMsgBox sts.CloseEnd Sub
このコードは既存のテキストファイルを取得して「GetFile」メソッドを使用してオブジェクトとして生成しています。 そして、read / write (2)としてテキストストリームを開き、テキストを1行書き込む。
読み取った行は、メッセージ ボックスに表示する前に変数に配置されなければならないことに注意してください。
構文:
BuildPath (path, name)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
この場合、「C: \tempáneewFolder」と表示されます。
OpenTextFile
このメソッドでは、設定したパラメータに従ってファイルを開いて読み書きを行うことができます。
構文は次のとおりです:
OpenTextFile (filename, ]])
パラメーター ‘iomode’ は ForReading、ForWriting、ForAppending を許可しています。 ForWritingパラメータはファイルを上書きします。
‘create’パラメータはブール値です。 Trueは指定されたファイル名が存在しない場合、新しいファイルを作成することを意味します。 Falseは指定されたファイル名が存在しない場合、ファイルを作成しないことを意味します。
‘format’ パラメータは、ファイルが ASCII か Unicode かによって TristateFalse、TristateMixed、TristateTrue、TristateUseDefault に設定できます。
Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub
このコードはテキストファイル ‘myfile.txt’ から1行読み込みます。
OpenTextFile メソッドが OpenAsTextStreamMethod に対して持つ利点は、パラメーターにドロップダウンがあり、さまざまなパラメーター オプションに適切な数値を記憶するよりも有意義であることです。
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
このコードは、コンピュータ上で利用可能な各ドライブ文字を返します。
Name
指定したファイルまたはフォルダの名前を返します。
Sub NameExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
このコードは、ファイルの名前と Driveプロパティを使用してその情報を与えます。
Path
このプロパティによりファイル指定からパスを分離することができます。
Sub PathExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
この例は、ファイルのパスを提供することを除いて、Name の例と同じように動作します。
Size
Sizeプロパティは、フォルダまたはファイルのサイズを提供します。
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
このコードでは、フォルダ「C:³³」のサイズを返します。
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
このコードでは、ファイル「myfile.
Type
タイププロパティは、ファイルまたはフォルダのタイプのテキストを返します。
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
このコードは、テキスト ‘ファイル フォルダ’ を返します。
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
このコードは、テキスト ‘文書’ を返します。