この記事では、ExcelVBAでFileSystemObjectを利用してテキストファイルを読み込みする方法について説明しています。
FileSystemObjectは、ファイルの読み込みやフォルダの操作をしたい時に使える便利なライブラリです。
FileSystemObjectが持っている「OpenTextFile関数」を使うと、指定したテキストファイルを開くことができます。
「OpenTextFile関数」でテキストファイルを開くと、「TextStream」オブジェクトを返します。
この「TextStream」を利用すると、ファイルの読み書きなどのファイルの内容の操作ができます。
「TextStream」では、以下の3つの方法でファイルの読み込みが可能です。
- テキストファイルの全てのデータをまとめて一気に読み込む
- テキストファイルデータを1行ずつ読み込む
- テキストファイルデータを1文字ずつ読み込む
それでは、3つの方法でテキストファイルを読み込む方法について、説明していきます。
もくじ
FileSystemObjectで読み込みするテキストファイルを準備する
それでは、読み込みするテキストファイルを用意しましょう。
以下のように、文字を入力したテキストファイルを適当なフォルダに名前をつけて保存します。
今回はサンプルとして、2行分の文字を入力したテキストファイルを準備しました。
1行目に「ABCDE」、2行目に「FGHIJ」と入力しています。
ファイルパスや読み込んだデータを表示させるシートを準備する
次に、読み込むテキストファイルパスを指定したり、読み込んだテキストファイルデータを表示させるシートを用意します。
- 「ファイル読み込み」という名前のシートを作成します。
- A1セルに「読み込むファイルパス」のタイトル行を作成します。
- A2セルに「読み込みファイルパス」の入力欄を作成します。
- A4セルに「ファイルの全てのデータを読み込む」のタイトル行を作成します。
- A7セルに「ファイルのデータを1行ずつ読み込む」のタイトル行を作成します。
- A11セルに「ファイルのデータを1文字ずつ読み込む」のタイトル行を作成します。
それでは、テキストファイルを読み込む方法を1つずつ説明していきます。
「テキストファイルの全てのデータをまとめて一気に読み込む」機能の作り方
FileSystemObjectを利用して、テキストファイルを読み込む方法の1つ目の「まとめて一気に読み込む」機能を作成します。
「まとめて一気に読み込む」機能は、読み込みテキストファイルのデータが少ない時に使うのが良いです。
1つの変数に読み込んだデータ全てを格納して利用することになります。
開発タブの「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 |
'ファイルオープンモード Enum enmIoMode ForReading = 1 '読み取りモード ForWriting = 2 '書き込みモード ForAppending = 8 '追記モード End Enum Public Sub FileReadAll() Dim sht As Worksheet Dim fso As Object Dim ts As Object Dim filePath As String Dim IoMode As Integer Dim readData As String Dim nowRow As Integer '①利用するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル読み込み") '②FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") '③ファイルパスを変数に格納する filePath = sht.Cells(2, 1) '④ファイルパスとオープンモードを指定してファイルを開き、ファイル操作オブジェクトを取得する Set ts = fso.opentextFile(filePath, enmIoMode.ForReading) '⑤ファイルの全てのデータを読み込む nowRow = 5 readData = ts.ReadAll sht.Cells(nowRow, 1) = readData '⑥開いたファイルを閉じる ts.Close '⑦メモリを開放する Set ts = Nothing Set fso = Nothing MsgBox "END" End Sub |
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
「テキストファイルの全てのデータをまとめて一気に読み込む」機能の使い方
それでは、データをまとめて一気に読み込む機能の使い方を説明します。
A2セルに読み込むファイルパスを入力します。
次に、開発タブの「マクロ」をクリックします。
「FileReadAll」を選択して、「実行」ボタンをクリックします。
A5セルにテキストファイルのデータが表示されます。
2行のデータが1つのセルに表示されます。
「テキストファイルの全てのデータをまとめて一気に読み込む」機能のVBAプログラム(FileReadAll)の説明
まず、共通で利用するファイルオープンモードを指定する変数を作成しておきます。
ファイルオープンモードを指定する値を作成する
1 2 3 4 5 6 |
'ファイルオープンモード Enum enmIoMode ForReading = 1 '読み取りモード ForWriting = 2 '書き込みモード ForAppending = 8 '追記モード End Enum |
ファイルを開く方法は、以下の3つがあります。
- 読み取りモード
- 書き込みモード
- 追記モード
このあとで説明する「全てのデータをまとめて一気に読み込む」機能、「データを1行ずつ読み込む」機能、「データを1文字ずつ読み込む」機能で、ファイルオープンモードは利用します。
それでは、VBAプログラム(FileReadAll)を説明します。
①利用するシートを変数に格納する
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 |
'④ファイルパスとオープンモードを指定してファイルを開き、ファイル操作オブジェクトを取得する Set ts = fso.opentextFile(filePath, enmIoMode.ForReading) |
「OpenTextFile」関数は、テキストファイルを操作可能な「TextStream」オブジェクトを返しますので、変数「ts」に格納しています。。
また、「OpenTextFile」関数にファイルパス(filePath)とオープンモード(読み取りモード)を渡しています。
⑤ファイルの全てのデータを読み込む
1 2 3 4 |
'⑤ファイルの全てのデータを読み込む nowRow = 5 readData = ts.ReadAll sht.Cells(nowRow, 1) = readData |
そして、読み込んだデータを「ファイル読み込み」シートのセルA5にセットしています。
⑥開いたファイルを閉じる
1 2 |
'⑥開いたファイルを閉じる ts.Close |
つまり、開いたテキストファイルを閉じています。
使い終わったテキストファイルは、閉じるようにしましょう。
なぜなら、開いたままにしているとそのテキストファイルに書き込むことができないからです。
⑦メモリを開放する
1 2 3 |
'⑦メモリを開放する Set ts = Nothing Set fso = Nothing |
「テキストファイルデータを1行ずつ読み込む」機能の作り方
続いて、FileSystemObjectを利用して、テキストファイルを読み込む方法の2つ目の「データを1行ずつ読み込む」機能を作成します。
「データを1行ずつ読み込む」機能は、1行ずつ異なった処理を行いたい時に使います。
今回の例で言えば、1行ずつ表示させるセルを変えています。
「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。
データを1行ずつ読み込む機能を作成する
以下のソースを書きます。
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 |
Public Sub FileReadLine() Dim sht As Worksheet Dim fso As Object Dim ts As Object Dim filePath As String Dim IoMode As Integer Dim readData As String Dim nowRow As Integer '①利用するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル読み込み") '②FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") '③ファイルパスを変数に格納する filePath = sht.Cells(2, 1) '④ファイルパスとオープンモードを指定してファイルを開き、ファイル操作オブジェクトを取得する Set ts = fso.opentextFile(filePath, enmIoMode.ForReading) '⑤ファイルのデータを1行ずつ読み込む nowRow = 8 Do Until ts.AtEndOfStream readData = ts.readLine sht.Cells(nowRow, 1) = readData nowRow = nowRow + 1 Loop '⑥開いたファイルを閉じる ts.Close '⑦メモリを開放する Set ts = Nothing Set fso = Nothing MsgBox "END" End Sub |
「テキストファイルのデータを1行ずつ読み込む」機能の使い方
それでは、データを1行ずつ読み込む機能の使い方を説明します。
A2セルに読み込むファイルパスを入力します。
次に、開発タブの「マクロ」をクリックします。
「FileReadLine」を選択して、「実行」ボタンをクリックします。
A8、A9セルにテキストファイルのデータが表示されます。
1行ずつ別々のセルにデータが表示されます。
「テキストファイルのデータを1行ずつ読み込む」機能のVBAプログラム(FileReadLine)の説明
先程の「テキストファイルの全てのデータをまとめて一気に読み込む」機能のVBAプログラム(FileReadAll)と異なる部分だけ説明します。
具体的には、⑤の「ファイルからデータを読み込む部分」だけが「FileReadAll」と違います。
それ以外については、同じです。
⑤ファイルのデータを1行ずつ読み込む
1 2 3 4 5 6 7 |
'⑤ファイルのデータを1行ずつ読み込む nowRow = 8 Do Until ts.AtEndOfStream readData = ts.readLine sht.Cells(nowRow, 1) = readData nowRow = nowRow + 1 Loop |
具体的には、「AtEndOfStream」プロパティがTRUEを返すまでデータを読み込んでいます。
「AtEndOfStream」プロパティがTRUEを返すときは、テキストファイルの最後に到達したときです。
つまり、「もうそれ以上データはないという状態」まで処理を繰り返しています。
「TextStream」オブジェクトの「readLine」プロパティで1行分のデータを読み込み、変数「readData」に格納しています。
変数「readData」に格納した1行分のデータを、A8セルから1行ずつ下にセットしています。
具体的には、テキストファイルの1行目のデータをA8セルにセットし、2行目のデータをA9セルにセットし、1行ずつ異なるセルにデータをセットします。
「テキストファイルデータを1文字ずつ読み込む」機能の作り方
続いて、FileSystemObjectを利用して、テキストファイルを読み込む方法の3つ目の「データを1文字ずつ読み込む」機能を作成します。
「データを1文字ずつ読み込む」機能は、1文字ずつ異なった処理を行いたい時に使います。
今回の例で言えば、1文字ずつ表示させるセルを変えています。
「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 |
Public Sub FileReadOneMoji() Dim sht As Worksheet Dim fso As Object Dim ts As Object Dim filePath As String Dim IoMode As Integer Dim readData As String Dim nowRow As Integer '①利用するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル読み込み") '②FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") '③ファイルパスを変数に格納する filePath = sht.Cells(2, 1) '④ファイルパスとオープンモードを指定してファイルを開き、ファイル操作オブジェクトを取得する Set ts = fso.opentextFile(filePath, enmIoMode.ForReading) '⑤ファイルのデータを1文字ずつ読み込む nowRow = 12 Do Until ts.AtEndOfStream readData = ts.Read(1) sht.Cells(nowRow, 1) = readData sht.Cells(nowRow, 2) = Asc(readData) '文字コードを取得する nowRow = nowRow + 1 Loop '⑥開いたファイルを閉じる ts.Close '⑦メモリを開放する Set ts = Nothing Set fso = Nothing MsgBox "END" End Sub |
「テキストファイルのデータを1文字ずつ読み込む」機能の使い方
それでは、データを1文字ずつ読み込む機能の使い方を説明します。
A2セルに読み込むファイルパスを入力します。
次に、開発タブの「マクロ」をクリックします。
「FileReadOneMoji」を選択して、「実行」ボタンをクリックします。
A12セルからA23セルにテキストファイルのデータが表示されます。
1文字ずつ別々のセルにデータが表示されます。
また、B12セルからB23セルに数字が表示されます。
この数字は、文字コードを表しています。
例えば「A」の文字コードは、65です。
しかし、A17セル、A18セルはなにも表示されていませんが、B17セル、B18セルに数字が表示されています。
文字コード「13」は、CR(キャリッジ・リターン)です。
文字コード「10」は、LF(ラインフィード)
つまり、テキストファイルの1行目の最後に改行コード(CRLF)が存在するからです。
「テキストファイルのデータを1文字ずつ読み込む」機能のVBAプログラム(FileReadOneMoji)の説明
先程の「テキストファイルの全てのデータをまとめて一気に読み込む」機能のVBAプログラム(FileReadAll)と異なる部分だけ説明します。
具体的には、⑤の「ファイルからデータを読み込む部分」だけが「FileReadAll」と違います。
それ以外については、同じです。
⑤ファイルのデータを1文字ずつ読み込む
1 2 3 4 5 6 7 8 |
'⑤ファイルのデータを1文字ずつ読み込む nowRow = 12 Do Until ts.AtEndOfStream readData = ts.Read(1) sht.Cells(nowRow, 1) = readData sht.Cells(nowRow, 2) = Asc(readData) '文字コードを取得する nowRow = nowRow + 1 Loop |
具体的には、「AtEndOfStream」プロパティがTRUEを返すまでデータを読み込んでいます。
「TextStream」オブジェクトの「read」プロパティに1を指定して、1文字分のデータを読み込み、変数「readData」に格納しています。
変数「readData」に格納した1文字分のデータを、A12セルから1行ずつ下にセットしています。
また、B12セルから1行ずつ下に、変数「readData」に格納されている文字の文字コードをセットしています。
具体的には、テキストファイルの1文字目のデータをA12セルにセットし、2文字目のデータをA13セルにセットし、1行ずつ異なるセルにデータをセットします。
FileSystemObjectを利用してテキストファイルのデータを読み込む方法を説明しました。
また、データの読み込み方法を3つ(一気に読み込む、1行ずつ読み込む、1文字ずつ読み込む)説明しましたが、やりたい処理によって使い分けるようにしましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。