この記事では、ExcelVBAでFileSystemObjectを利用してテキストファイルへ文字列を書き込みする方法について説明しています。
FileSystemObjectは、ファイルの書き込みやフォルダの操作をしたい時に使える便利なライブラリです。
FileSystemObjectが持っている「OpenTextFile関数」を使うと、指定したテキストファイルを開くことができます。
「OpenTextFile関数」では、以下の3つのモードでファイルを開くことができます。
- 読み込みモード(ファイルを読み取り専用として開き、書き込みすることはできません)
- 書き込みモード(ファイルを書き込み専用として開き、すでにファイルが存在する場合上書きします)
- 追記モード(ファイルを書き込み専用として開き、すでにファイルが存在する場合ファイルの末尾に追記します)
また、「OpenTextFile関数」でテキストファイルを開くと、「TextStream」オブジェクトを返します。
この「TextStream」を利用すると、ファイルの読み込みや書き込みなどのファイルの操作ができます。
「TextStream」では、以下の3種類の書き込み方法を利用することができます。
- テキストファイルに指定された文字列を書き込む(Write)
- テキストファイルに指定された文字列と改行を書き込む(WriteLine)
- テキストファイルデータを1文字ずつ読み込む(WriteBlankLines)
それでは、テキストファイルへ書き込みする方法について、説明していきます。
FileSystemObjectを利用してテキストファイルを読み込む方法については、以下を参照してください。
【VBA入門】FileSystemObjectを使ってテキストファイルを読み込む
もくじ
書き込むファイルパスや書き込む文字列を指定するシートを準備する
書き込むテキストファイルパス、書き込みたい文字列、書き込みモードを指定するシートを用意します。
- 「ファイル書き込み」という名前のシートを作成します。
- A1セルに「書き込むファイルパス」のタイトル行を作成します。
- A2セルに「書き込むファイルパス」の入力欄を作成します。
- A3セルに「書き込む文字列」のタイトル行を作成します。
- B3セルに「書き込みモード」のタイトル行を作成します。
- A4セル以降には、実際に書き込みたい文字列を入力する欄になります。
- B4セル以降には、A列に指定した文字列の書き込みモードを指定する欄になります。
それでは、テキストファイルへ書き込みする方法を1つずつ説明していきます。
「テキストファイルへ文字列を書き込む」機能の作り方
それでは、VBAプログラムでFileSystemObjectを利用して、テキストファイルへ書き込みする機能を作成します。
指定された文字列と書き込みモードに従って、テキストファイルに文字列を書き込みします。
開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。
「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。
標準モジュールを追加して、以下のソースを書きます。
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 55 56 57 |
'ファイルオープンモード Enum enmIoMode ForReading = 1 '読み取りモード ForWriting = 2 '書き込みモード ForAppending = 8 '追記モード End Enum Public Sub FileWrite() Dim sht As Worksheet Dim fso As Object Dim ts As Object Dim filePath As String Dim nowRow As Integer '①利用するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル書き込み") '②FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") '③ファイルパスを変数に格納する filePath = sht.Cells(2, 1) '④ファイルの存在有無により、オープンモードを切り替えて、ファイルを開く If fso.FileExists(filePath) Then 'ファイルが存在する場合、ファイルの末尾に追記するモードでファイルを開く Set ts = fso.opentextFile(filePath, enmIoMode.ForAppending, False) Else 'ファイルが存在しない場合、ファイルを新規作成して書き込むモードでファイルを開く Set ts = fso.opentextFile(filePath, enmIoMode.ForWriting, True) End If '⑤書き込む文字列が指定されている最終行まで繰り返す nowRow = 4 Do Until sht.Cells(nowRow, 1) = "" '⑥ファイルへ文字列を書き込む If sht.Cells(nowRow, 2) = "1" Then '書き込みモード=改行なしの場合 ts.Write (sht.Cells(nowRow, 1)) Else '書き込みモード=改行ありの場合 ts.WriteLine (sht.Cells(nowRow, 1)) End If nowRow = nowRow + 1 Loop '⑦開いたファイルを閉じる ts.Close '⑧メモリを開放する Set ts = Nothing Set fso = Nothing MsgBox "END" End Sub |
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
「テキストファイルに文字列を書き込む」機能の使い方
それでは、指定したテキストファイルに文字列を書き込む機能の使い方を説明します。
A2セルに書き込むファイルパスを入力します。
次に、書き込みたい文字列と書き込みモードを入力します。
次に、開発タブの「マクロ」をクリックします。
「FileWrite」を選択して、「実行」ボタンをクリックします。
A2セルに指定した「書き込むファイルパス」は、存在しないテキストファイルを指定しています。
「FileWrite」を実行すると、テキストファイルが作成されました。
作成されたテキストファイルの中身は、以下になります。
指定したテキストファイルは存在していませんでした。
ですから、テキストファイルを新規作成して、指定した文字列が書き込まれました。
また、指定した文字列と書き込みモードに従って、文字列がテキストファイルに書き込みされました。
ちなみに、すでにテキストファイルが存在する状態で、「FileWrite」を実行すると以下のようになります。
1回目で書き込まれた文字列のあとに、2回目の文字列が追記されています。
「テキストファイルに文字列を書き込む」機能のVBAプログラム(FileWrite)の説明
まず、共通で利用するファイルオープンモードを指定する変数を作成しておきます。
ファイルオープンモードを指定する値を作成する
1 2 3 4 5 6 |
'ファイルオープンモード Enum enmIoMode ForReading = 1 '読み取りモード ForWriting = 2 '書き込みモード ForAppending = 8 '追記モード End Enum |
ファイルを開く方法は、以下の3つがあります。
- 読み取りモード
- 書き込みモード
- 追記モード
このあとで説明する「テキストファイルに文字列を書き込む」機能で、ファイルオープンモードは利用します。
それでは、VBAプログラム(FileWrite)を説明します。
①利用するシートを変数に格納する
1 2 |
'①利用するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル書き込み") |
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“ファイル書き込み”)」と入力するより、「sht」と入力するほうがコードが少なくてよいからです。
②FileSystemObjectを変数に格納する
1 2 |
'②FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") |
③ファイルパスを変数に格納する
1 2 |
'③ファイルパスを変数に格納する filePath = sht.Cells(2, 1) |
④ファイルの存在有無により、オープンモードを切り替えて、ファイルを開く
1 2 3 4 5 6 7 8 |
'④ファイルの存在有無により、オープンモードを切り替えて、ファイルを開く If fso.FileExists(filePath) Then 'ファイルが存在する場合、ファイルの末尾に追記するモードでファイルを開く Set ts = fso.opentextFile(filePath, enmIoMode.ForAppending, False) Else 'ファイルが存在しない場合、ファイルを新規作成して書き込むモードでファイルを開く Set ts = fso.opentextFile(filePath, enmIoMode.ForWriting, True) End If |
ファイルがすでに存在する場合、追記モードでファイルを開いています。
ファイルが存在しない場合、書き込みモードでファイルを開いています。
「OpenTextFile」関数は、テキストファイルを操作可能な「TextStream」オブジェクトを返しますので、変数「ts」に格納しています。
また、「OpenTextFile」関数にファイルパス(filePath)とオープンモード(追記モードまたは書き込みモード)、最後にファイル作成有無(True:作成する、False:作成しない)を渡しています。
⑤書き込む文字列が指定されている最終行まで繰り返す
1 2 3 4 5 6 |
'⑤書き込む文字列が指定されている最終行まで繰り返す nowRow = 4 Do Until sht.Cells(nowRow, 1) = "" nowRow = nowRow + 1 Loop |
書き込む文字列が指定されている最終行まで、書き込みを続けます。
つまり、A列のセルが空の行まで繰り返しします。
⑥ファイルへ文字列を書き込む
1 2 3 4 5 6 7 8 |
'⑥ファイルへ文字列を書き込む If sht.Cells(nowRow, 2) = "1" Then '書き込みモード=改行なしの場合 ts.Write (sht.Cells(nowRow, 1)) Else '書き込みモード=改行ありの場合 ts.WriteLine (sht.Cells(nowRow, 1)) End If |
書き込みモード=2(改行あり)が指定されている場合、指定された文字列と改行をファイルに書き込みしています。
⑦開いたファイルを閉じる
1 2 |
'⑦開いたファイルを閉じる ts.Close |
つまり、開いたテキストファイルを閉じています。
使い終わったテキストファイルは、閉じるようにしましょう。
なぜなら、開いたままにしているとそのテキストファイルに書き込むことができないからです。
⑧メモリを開放する
1 2 3 |
'⑧メモリを開放する Set ts = Nothing Set fso = Nothing |
FileSystemObjectを利用してテキストファイルへ文字列を書き込みする方法を説明しました。
以下について、やりたいことや状況に応じて、テキストファイルへ文字列を書き込みする方法を切り替えましょう。
- ファイルが存在しない場合・存在する場合
- 追記する場合・新規で書き込みする場合
- 書き込みモードを改行あり・改行なし
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。