【VBA入門】FileSystemObjectを使ってテキストファイルを読み込む

【VBA入門】FileSystemObjectを使ってファイルの読み込み

この記事では、ExcelVBAでFileSystemObjectを利用してテキストファイルを読み込みする方法について説明しています。

 

FileSystemObjectは、ファイルの読み込みやフォルダの操作をしたい時に使える便利なライブラリです。

 

FileSystemObjectが持っている「OpenTextFile関数」を使うと、指定したテキストファイルを開くことができます。

 

OpenTextFile関数」でテキストファイルを開くと、「TextStream」オブジェクトを返します。

 

 

この「TextStream」を利用すると、ファイルの読み書きなどのファイルの内容の操作ができます。

 

TextStream」では、以下の3つの方法でファイルの読み込みが可能です。

  1. テキストファイルの全てのデータをまとめて一気に読み込む
  2. テキストファイルデータを1行ずつ読み込む
  3. テキストファイルデータを1文字ずつ読み込む

 

それでは、3つの方法でテキストファイルを読み込む方法について、説明していきます。

 

もくじ

FileSystemObjectで読み込みするテキストファイルを準備する

それでは、読み込みするテキストファイルを用意しましょう。

 

以下のように、文字を入力したテキストファイルを適当なフォルダに名前をつけて保存します。

読み込みするテキストファイル

読み込みするテキストファイル

 

今回はサンプルとして、2行分の文字を入力したテキストファイルを準備しました。

1行目に「ABCDE」、2行目に「FGHIJ」と入力しています。

 

ファイルパスや読み込んだデータを表示させるシートを準備する

次に、読み込むテキストファイルパスを指定したり、読み込んだテキストファイルデータを表示させるシートを用意します。

ファイル読み込みシートを作成する

ファイル読み込みシートを作成する

 

  1. 「ファイル読み込み」という名前のシートを作成します。
  2. A1セルに「読み込むファイルパス」のタイトル行を作成します。
  3. A2セルに「読み込みファイルパス」の入力欄を作成します。
  4. A4セルに「ファイルの全てのデータを読み込む」のタイトル行を作成します。
  5. A7セルに「ファイルのデータを1行ずつ読み込む」のタイトル行を作成します。
  6. A11セルに「ファイルのデータを1文字ずつ読み込む」のタイトル行を作成します。

 

それでは、テキストファイルを読み込む方法を1つずつ説明していきます。

「テキストファイルの全てのデータをまとめて一気に読み込む」機能の作り方

FileSystemObjectを利用して、テキストファイルを読み込む方法の1つ目の「まとめて一気に読み込む」機能を作成します。

「まとめて一気に読み込む」機能は、読み込みテキストファイルのデータが少ない時に使うのが良いです。

1つの変数に読み込んだデータ全てを格納して利用することになります。

 

開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。

Microsoft Visual Basic for Applicationsを起動する

Microsoft Visual Basic for Applicationsを起動する

 

「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。

一気にテキストファイルデータを読み込む機能を作成する

一気にテキストファイルデータを読み込む機能を作成する

標準モジュールを追加して、以下のソースを書きます。

'ファイルオープンモード
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」を選択して、「実行」ボタンをクリックします。

FileReadAllを実行する

FileReadAllを実行する

 

A5セルにテキストファイルのデータが表示されます。

2行のデータが1つのセルに表示されます。

全てのデータが読み込まれる

全てのデータが読み込まれる

 

「テキストファイルの全てのデータをまとめて一気に読み込む」機能のVBAプログラム(FileReadAll)の説明

まず、共通で利用するファイルオープンモードを指定する変数を作成しておきます。

ファイルオープンモードを指定する値を作成する

'ファイルオープンモード
Enum enmIoMode
    ForReading = 1   '読み取りモード
    ForWriting = 2   '書き込みモード
    ForAppending = 8 '追記モード
End Enum

まずは、ファイルを開く方法を指定する列挙型変数(Enum)を作ります。

ファイルを開く方法は、以下の3つがあります。

  • 読み取りモード
  • 書き込みモード
  • 追記モード

 

このあとで説明する「全てのデータをまとめて一気に読み込む」機能、「データを1行ずつ読み込む」機能、「データを1文字ずつ読み込む」機能で、ファイルオープンモードは利用します。

 

それでは、VBAプログラム(FileReadAll)を説明します。

①利用するシートを変数に格納する

'①利用するシートを変数に格納する
Set sht = ThisWorkbook.Sheets("ファイル読み込み")

ここでは、このあとの処理で何度も使う「ファイル読み込み」シートを変数に格納しています。

そうすることにより、入力するプログラムを短くすることができるからです。

何度も「ThisWorkbook.Sheets(“ファイル読み込み”)」と入力するより、「sht」と入力するほうがコードが少なくてよいからです。

 

②FileSystemObjectを変数に格納する

'②FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")

ここでは、ファイル操作に必要な「FileSystemObject」を変数に格納しています。

 

③ファイルパスを変数に格納する

'③ファイルパスを変数に格納する
filePath = sht.Cells(2, 1)

ここでは、読み込むテキストファイルパスを変数に格納しています。

 

④ファイルパスとオープンモードを指定してファイルを開き、ファイル操作オブジェクトを取得する

'④ファイルパスとオープンモードを指定してファイルを開き、ファイル操作オブジェクトを取得する
Set ts = fso.opentextFile(filePath, enmIoMode.ForReading)

ここでは、「FileSystemObject」が持っている「OpenTextFile」関数でテキストファイルを開いています。

「OpenTextFile」関数は、テキストファイルを操作可能な「TextStream」オブジェクトを返しますので、変数「ts」に格納しています。。

また、「OpenTextFile」関数にファイルパス(filePath)とオープンモード(読み取りモード)を渡しています。

 

⑤ファイルの全てのデータを読み込む

'⑤ファイルの全てのデータを読み込む
nowRow = 5
readData = ts.ReadAll
sht.Cells(nowRow, 1) = readData

ここでは、「TextStream」オブジェクトを利用してテキストファイルのデータ全てを変数「readData」に格納しています。

そして、読み込んだデータを「ファイル読み込み」シートのセルA5にセットしています。

 

⑥開いたファイルを閉じる

'⑥開いたファイルを閉じる
ts.Close

ここでは、「TextStream」オブジェクトを閉じています。

つまり、開いたテキストファイルを閉じています。

使い終わったテキストファイルは、閉じるようにしましょう。

なぜなら、開いたままにしているとそのテキストファイルに書き込むことができないからです。

 

⑦メモリを開放する

'⑦メモリを開放する
Set ts = Nothing
Set fso = Nothing

ここでは、使い終わったメモリを開放しています。

 

「テキストファイルデータを1行ずつ読み込む」機能の作り方

続いて、FileSystemObjectを利用して、テキストファイルを読み込む方法の2つ目の「データを1行ずつ読み込む」機能を作成します。

「データを1行ずつ読み込む」機能は、1行ずつ異なった処理を行いたい時に使います。

今回の例で言えば、1行ずつ表示させるセルを変えています。

 

「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。

データを1行ずつ読み込む機能を作成する

データを1行ずつ読み込む機能を作成する

 

以下のソースを書きます。

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セルに読み込むファイルパスを入力します。

1行ずつデータを読み込む準備

1行ずつデータを読み込む準備

 

次に、開発タブの「マクロ」をクリックします。

マクロボタンを押す

マクロボタンを押す

 

「FileReadLine」を選択して、「実行」ボタンをクリックします。

FileReadLineを実行する

FileReadLineを実行する

 

A8、A9セルにテキストファイルのデータが表示されます。

1行ずつ別々のセルにデータが表示されます。

1行ずつ別のセルに表示される

1行ずつ別のセルに表示される

 

「テキストファイルのデータを1行ずつ読み込む」機能のVBAプログラム(FileReadLine)の説明

先程の「テキストファイルの全てのデータをまとめて一気に読み込む」機能のVBAプログラム(FileReadAll)と異なる部分だけ説明します。

具体的には、⑤の「ファイルからデータを読み込む部分」だけが「FileReadAll」と違います。

それ以外については、同じです。

⑤ファイルのデータを1行ずつ読み込む

'⑤ファイルのデータを1行ずつ読み込む
nowRow = 8
Do Until ts.AtEndOfStream
    readData = ts.readLine
    sht.Cells(nowRow, 1) = readData
    nowRow = nowRow + 1
Loop

ここでは、「TextStream」オブジェクトの「AtEndOfStream」プロパティを利用して、テキストファイルの最後かを判定しながら繰り返しデータを読み込んでいます。

具体的には、「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文字ずつ読み込む機能を作成する

データを1文字ずつ読み込む機能を作成する

 

以下のソースを書きます。

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セルに読み込むファイルパスを入力します。

データを1文字ずつ読み込む準備

データを1文字ずつ読み込む準備

 

次に、開発タブの「マクロ」をクリックします。

マクロボタンを押す

マクロボタンを押す

 

「FileReadOneMoji」を選択して、「実行」ボタンをクリックします。

「FileReadOneMoji」を実行する

「FileReadOneMoji」を実行する

 

A12セルからA23セルにテキストファイルのデータが表示されます。

1文字ずつ別々のセルにデータが表示されます。

1文字ずつ別のセルに表示される

1文字ずつ別のセルに表示される

 

また、B12セルからB23セルに数字が表示されます。

この数字は、文字コードを表しています。

例えば「A」の文字コードは、65です。

 

しかし、A17セル、A18セルはなにも表示されていませんが、B17セル、B18セルに数字が表示されています。

文字コード「13」は、CR(キャリッジ・リターン)です。

文字コード「10」は、LF(ラインフィード)

つまり、テキストファイルの1行目の最後に改行コード(CRLF)が存在するからです。

 

「テキストファイルのデータを1文字ずつ読み込む」機能のVBAプログラム(FileReadOneMoji)の説明

先程の「テキストファイルの全てのデータをまとめて一気に読み込む」機能のVBAプログラム(FileReadAll)と異なる部分だけ説明します。

具体的には、⑤の「ファイルからデータを読み込む部分」だけが「FileReadAll」と違います。

それ以外については、同じです。

⑤ファイルのデータを1文字ずつ読み込む

'⑤ファイルのデータを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

ここでは、「TextStream」オブジェクトの「AtEndOfStream」プロパティを利用して、テキストファイルの最後かを判定しながら繰り返しデータを読み込んでいます。

具体的には、「AtEndOfStream」プロパティがTRUEを返すまでデータを読み込んでいます。

 

「TextStream」オブジェクトの「read」プロパティに1を指定して、1文字分のデータを読み込み、変数「readData」に格納しています。

変数「readData」に格納した1文字分のデータを、A12セルから1行ずつ下にセットしています。

また、B12セルから1行ずつ下に、変数「readData」に格納されている文字の文字コードをセットしています。

 

具体的には、テキストファイルの1文字目のデータをA12セルにセットし、2文字目のデータをA13セルにセットし、1行ずつ異なるセルにデータをセットします。

 


 

FileSystemObjectを利用してテキストファイルのデータを読み込む方法を説明しました。

また、データの読み込み方法を3つ(一気に読み込む、1行ずつ読み込む、1文字ずつ読み込む)説明しましたが、やりたい処理によって使い分けるようにしましょう。

 

以上です。

 

📘 Noteで完全ガイドを公開中

テキストファイルの読み書きを全パターンまとめた完全ガイドをNoteで公開しています。

  • 読み込み・書き込み・追記・文字コード対応など全パターン網羅
  • 実務でそのまま使えるコピペコード付き
  • よくあるエラーと対処法まとめ

VBAでテキストファイルの読み書き完全ガイド(500円)

最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です