Excel VBA入門 | FileSystemObject-CreateTextFileメソッド(ファイルの作成)

Excel VBA入門

公開日:2017年6月4日 更新日:2017年6月6日

FileSystemObjectオブジェクトは、Windowsスクリプトテクノロジの1つであるScriptランタイムに属したオブジェクトです(Excel VBA上ではScriptingのメンバに位置づけされています)。

ここでは、ファイルを作成する方法としてFileSystemObjectオブジェクトのCreateTextFileメソッドを使用する方法を解説します。

1.基本形

FSO.CreateTextFile(FileName[, Overwrite[, Unicode]]) →オブジェクトの作成(TextStream型)

変数説明
FSOFileSystemオブジェクト変数。FileSystemオブジェクトとして宣言して格納した変数です。
引数説明
FileNameファイル名。相対パスまたは絶対パスで指定します。
Overwrite省略可能。上書きするかどうかをTrue/Falseで指定します。既定はTrueです。
Unicode省略可能。Unicodeファイルを作成するか、ASCIIファイルを作成するかをTrue/Falseで指定します。既定はTrue(Unicodeファイルを作成する)です。

正常に動作した場合には、TextStream型のオブジェクトを作成します。

2.使用例

次の例では、デスクトップ上に「Test.txt」という名前のテキストファイルを作成し、「12345」と記述した後に閉じます。

Sub テキストファイルの作成()

Dim FSO As New FileSystemObject  '(1)
Dim MyText As TextStream         '(2)
'変数名は自由に設定してください。

Set MyText = FSO.CreateTextFile("C:\Users\ユーザー名\Desktop\Test.txt") '(3)
'ユーザー名はあなたのPC環境に合わせて書き換えてください。

MyText.Write "12345"             '(4)
MyText.Close                     '(5)

End Sub

【解説】

(1)Dim FSO As New FileSystemObject
→FileSystemObjectオブジェクトを使用する際のおまじないです。FileSystemObjectオブジェクト変数FSOの宣言と変数FSOにFileSystemObjectオブジェクトの参照への代入を同時に1行で行っています。

おまじないには事前バインディングと実行時バインディングがありますが、ここでは事前バインディングを使用しています。

なお、FileSystemObjextオブジェクトを使用する場合には前もって、参照設定で「Microsoft Scripting Runtime」を有効にしておきます。

※FileSystemObjectオブジェクトの設定は「Excel VBA入門 | FileSystemObjectオブジェクト(概要)」を参照ください。

(2)Dim MyText As TextStream
→CreateTextfileで作成するファイルはFile型ではなく、TextStream型のオブジェクトです。

従って、変数MyTextに作成ファイルを代入する場合には、File型ではなく、TextStream型で宣言する必要があります。

もし、File型で宣言した場合には、(3)及び(4)でエラーが発生します(それぞれの解説を参照)。

(3)Set MyText = FSO.CreateTextFile("C:\Users\ユーザー名\Desktop\Test.txt")
→FileSystemオブジェクトのCreateTextfileメソッドを使用して、デスクトップ上にTest.txtファイルを作成しています。

いくつか理解するためのポイントがありますので、ポイント毎に分けて解説します。

【ポイント1:String型との違い】
作成したファイルはオブジェクト型(CreateTextfileメソッドで作成されるのは、オブジェクト型のうち、TextStream型)です。String型と間違えやすいので注意が必要です(セル自体の取得とセルの値の取得の違いと似ています)。

そこで、TextStream型のオブジェクト変数としてMyFileを(2)で宣言しました。一方で、ファイルを作成するのではなく、ファイル名を取得するのであれば、TextStream型ではなく、String型を宣言します。

【ポイント2:Setステートメント】
オブジェクト変数(今回はTextStream型)にオブジェクトを代入する場合には、Set ~ステートメントを使用して設定します。ファイル名であればString型の変数に代入するため、「Set~」ステートメントは使用しません(ただし、(2)でString型の変数として変数を宣言する必要があります)。

【ポイント3:TextStreamオブジェクト】
FileSystemオブジェクトのCreateTextfileメソッドで作成したファイルは上述の通り、TextStream型のオブジェクトになりますが、このTextStreamオブジェクトは、FileSystemオブジェクトやFileオブジェクト、Driveオブジェクト、Folderオブジェクトと同列に並ぶ扱いで、FileSystemオブジェクトの系統に属するオブジェクトになります(すなわち、Sprictingのメンバー)。

TextStreamオブジェクトには、テキストファイルを操作する様々なプロパティやメソッドが用意されています。後述(4)や(5)で使用しているWriteメソッドやCloseメソッドはTextStreamオブジェクトのメソッドになります。

一方でMyTextはTextStreamオブジェクトであるため、Fileオブジェクトのプロパティやメソッドを使用することはできません。この点、「ファイル」という文言や、Fileオブジェクトも同じくファイルを操作するオブジェクトであることから、TextStreamオブジェクトとFileオブジェクトを混同しやすいので注意が必要です。

例えば、(4)の代わりに「MsgBox MyText.Name」として、ファイル名を表示するプログラムを実行するとコンパイルエラーが発生します。なぜならばNameプロパティはTextStreamオブジェクトではなく、Fileオブジェクトのプロパティだからです。

Excel VBA CreateTextFile

【ポイント4:エラーが発生する場合】
例えば、(2)で「Dim MyText As File」とTextStream型ではなく、File型で変数MyTextを宣言した場合には、(3)で実行時エラーが発生します(実行時エラー13。ただし今回のサンプルでは、この実行時エラーが発生する前に(4)でコンパイルエラーが発生しますが)。

くどいようですが、CreateTextfileメソッドはTextStreamオブジェクトを作成するため、ファイルであってもFile型で宣言してはいけません。

Excel VBA CreateTextFile

それに対して(2)を「Dim MyText As Object」とMyTextをObject型で宣言した場合には、正常に動作します。なぜならば、Object型はTextStream型やFile型を包含する、より上位に位置するオブジェクトだからです。

(4)MyText.Write "12345"
→TextStreamオブジェクトのWriteメソッドを使用して作成したTest.txtに「12345」の文字列を書き込みます。

もし、(2)で「Dim MyText As File」とTextStream型ではなく、File型で変数MyTextを宣言した場合には、この(4)でコンパイルエラーが発生します。理由は上述(2)や(3)で解説している通り、データ型が異なる(TextStream型ではなく、File型で宣言してしまった)からです。

Excel VBA CreateTextFile

(5)MyText.Close
→TextStreamオブジェクトのCloseメソッドを使用して作成したTest.txtを閉じます。

【補足1】引数Overwriteの設定について

今回の例では引数Overwriteの設定を省略しています。既定ではTrueであるため、仮にこのプログラム実行前に既にTest.txtという名前のファイルがデスクトップ上に存在する場合には自動的に上書きされます。実行前には注意が必要です。

また、今回の例でOverwriteをFalse(上書きしない)に設定し、かつ、プログラム実行前に既にTest.txtという名前のファイルがデスクトップ上に存在する場合には、実行時エラーが発生します(実行時エラー58)。

Excel VBA CreateTextFile

【補足2】FolderオブジェクトとしてのCreateTextFileメソッド

今回はFileSystemオブジェクトのCreateTextFileメソッドとして解説していますが、FolderオブジェクトにもCreateTextfileメソッドが存在します。使い方(TextStreamオブジェクトを作成する点や引数設定など)も同様です。

例えば、「Dim MyFolder As Folder(名前は自由に設定ください)」と、Folder型オブジェクトとして変数MyFolderを宣言し、次に「Set MyFolder = FSO.GetFolder("C:\Users\ユーザー名\Desktop\Test")」と、GetFolderメソッドでデスクトップ上にTestフォルダ(Folderオブジェクト)を取得してMyFolderに代入→最後に「Set MyText = MyFolder.CreateTextFile("Test.txt")」と、MyFolderに代入したフォルダ内に「Test.txt」というファイルを作成する、といった使い方をすることができます(説明を省略していますが、FileSystemオブジェクトの宣言や変数FSOへの代入もコードに記述する必要があります)。

FileSystemオブジェクトのCreateTextfileメソッドと異なるのは、フォルダオブジェクト内にしかファイルを作成することができないという点です。また、ファイル名のパス指定も絶対パスではなく、フォルダオブジェクトをカレントパスとした前提で指定を行います。

【補足3】TextStreamオブジェクトの位置づけ

TextStreamオブジェクトはFileSystemObjectオブジェクトの系統に属すると記載しましたが、TextStreamオブジェクトはFileSystemObjectオブジェクトに属する訳ではありません。

この2つのオブジェクトはVBE上では同じSctiptingライブラリのメンバーになります(同列の扱い)。従って、FileSystemObjectオブジェクトとFolderオブジェクトにはそれぞれ別々のプロパティやメソッドが存在します。FileSystemObjectオブジェクトのプロパティやメソッドをTextStreamオブジェクトでは扱うことはできません。またその逆もしかりです。

この点、ややこしい話になるのは言葉の問題によるものです。「MSDN ライブラリ」を見ると分かりますが、FileSystemObjectオブジェクトやTextStreamオブジェクトをまとめて「FileSystemObjectオブジェクト」という用語で説明しています。

要するに「FileSystemObjectオブジェクト」を2つの意味で用いていることが、VBA上のFileSystemObjectオブジェクト系統の文法の理解を難しくしています。