【VBA】テキストファイルを開く・読み込む・書き込む・閉じる

Excel・VBA

Open ステートメントを使用してテキストファイルを開く方法を紹介します。

テキストファイルを開く

Openステートメント書式

Open ステートメント の構文と指定する引数は次の通りです。

【書式】
 Open pathname For mode [ access ] [ lock ] As # ] filenumber [Len = reclength ]

引数 省略可否 説明
pathname 省略不可 ファイル名をフルパスで指定する。
mode
省略可能
テキストファイルを開くモードを指定する。
Input ファイルの先頭から読み込み
Output ファイルの先頭から書き込み(上書き)
Append 追記
Binary バイナリ―モード
Random ランダムアクセス
access
省略可能
テキストファイルに対する操作を指定する。
Read  読み込み
Write  書き込み
Read Write 
 読み書き
lock
省略可能
他のプロセスからの操作の制限を指定する。
Shared 他のプロセスからの読み書きを許可
Lock Read 他のプロセスからの読み込みを禁止
Lock Write 他のプロセスからの書き込みを禁止
Lock Read Write 他のプロセスからの読み書きを禁止
filenumber 省略不可 1~511の間で任意のファイル番号を指定する。
FreeFile関数を使用すると使用可能な番号を取得可能。
reclength 省略可能 32,767バイト以下の数値を指定する。
ランダムアクセスファイルの場合はレコード長となり、シーケンシャルファイルの場合はバッファーされる文字数となる。

ファイルが存在しない状態でAppendBinaryOutput、または Random モードでファイルを開くと、そのファイルが新たに作成されます。

BinaryInput、およびRandomでは、同一のファイルを異なるfilenumberで開くことが可能(重複してで開くことが可能)ですがAppend および Outputモードでは、重複してファイルを開くことができないので注意。

サンプルコード(テキストファイルを開く)

ディレクトリ構造が以下のような場合において、ファイルを読み込むサンプルコードです。

サンプルコードのディレクトリ構造
サンプルテキストの中身
《テキストファイルを開く》
 Sub Openfile() 
  Dim cdir As String
 Dim tdir As String
 Dim tfi As String
 Dim filenum As Integer

 cdir = ThisWorkbook.Path
 tfi = "sample.txt"
 tdir = cdir & "\" & tfi 
 filenum = FreeFile 

 Open tdir For Input As #filenum 

 End Sub 

サンプルコードの説明は以下の通りです。

サンプルコードの説明

テキストファイルの読み込み・書き込み

テキストファイルを開く際に指定するmodeとaccessの値で読み込みと書き込みの制御をします。

テキストファイルを読み込む

ファイルを読み込むには、テキストファイルを開く際に引数”mode”の値に”Input“を指定します。また、一行ずつ読み込み場合は次のように行います。

【テキストファイルを一行読み込む】
 Line Input #filenumber , 読み込み先の変数

テキストファイルを読み込む際の注意点としては、テキストファイルの改行コードによっては、テキストファイルの内容すべてが一行分のデータとして読み込まれてしまうことです。そのため、改行コードに応じて読み込み方法を工夫する必要があります。

《参考:改行コードの種類》
・CRLF形式:Windowsの改行コード
・LF形式  :Unix系の改行コード
・CR形式 : Mac OS(バージョン9まで)の改行コード

サンプルコード(一行ずつデータを読み込む)

一行ずつテキストファイルのデータを読み込み、エクセルファイルへ書き込んでいくサンプルです。

《テキストファイルを読み込む》
Sub Readfile()
 Dim cdir As String
 Dim cfi As String
 Dim tdir As String
 Dim tfi As String
 Dim lin As String
 Dim filenum As Integer
 Dim col As Integer

 cdir = ThisWorkbook.Path
 cfi = ThisWorkbook.Name
 tfi = "sample.txt"
 tdir = cdir & "\" & tfi
 filenum = FreeFile
 col=1

 Open tdir For Input As #filenum

 Do Until EOF(filenum)
  Line Input #filenum, lin
 Workbooks(cfi).Worksheets("Sheet1").Cells(col, 1) = lin
 col = col + 1
 Loop

 Close #filenum

End Sub
サンプルコードの説明

サンプルコード(データを一行で読み込む場合《改行コードが無視される場合》)

テキストファイルがMacやLinux系OSで作成され、改行コードが無視される場合には次のように対処します。

ポイントは、以下の通りです。

データを一度変数へ取り込み、Split関数で分割
改行コードがLFの場合はvbLf、CRの場合はvbCrで区切る
区切ったデータを格納する変数は、Variant型
(データ出力時の対応)読み込んだテキストファイルの最後に
  改行コードがある場合 → For i=1 to Ubound-1
(データ出力時の対応)読み込んだテキストファイルの最後に
  改行コードがない場合 → For i=1 to Ubound

データ読み込み時の対応でForループの範囲が異なっているのは、読み込んだテキストファイルの最後に改行コードがある場合は、最後の要素が空になる為です。

《改行コードがLF形式のテキストファイルを読み込む》
Sub Readfile2()
 Dim cdir As String
 Dim cfi As String
 Dim tdir As String
 Dim tfi As String
 Dim lin As String
 Dim splin As Variant
 Dim filenum As Integer
 Dim col As Integer

 cdir = ThisWorkbook.Path
 cfi = ThisWorkbook.Name
 tfi = "sample_LF.txt"
 tdir = cdir & "\" & tfi
 filenum = FreeFile
 col = 1
  
 Open tdir For Input As #filenum
  Line Input #filenum, lin
 Close #filenut

 splin = Split(lin, vbLf)

 For i = 0 To UBound(splin)
  Workbooks(cfi).Worksheets("Sheet2").Cells(col, 1) = splin(i)
  col = col + 1
 Next

End Sub

※sample_LFはsampleテキストの改行コードを”LF”に書き換えたものです。

説明サンプルコードの説明

※画像中でデータ読み込み時に Input #filenum, linとなっている部分ですが、正しくはLine Input #filenum, linです。時間のある時に修正します。

テキストファイルへ書き込む

テキストファイルへ書き込むには、テキストファイルを開く際に引数”mode”の値に”Output“もしくは” Append “を指定します。新規ファイルの場合はOutput、既存ファイルへの追記はAppendを指定します。

ファイルを開いた後は、次のようにしてファイルを一行ずつ書き込みます。

【テキストファイルへ書き込む】
 Print #filenumber , 書き込むデータ

なお、テキストファイルへの書き込みは”Print”以外に”Write”でも可能です。

サンプルコード(テキストファイルへ書き込む)

次のサンプルコードは配列内のデータを新規ファイルへ書き込むコードです。追記で書き込みたい場合は、書き込み対象のファイルを既存のファイル名へ変更し、追記モードでファイルを開いてください。

《テキストファイルへ書き込む》
Sub Printfile()
 Dim cdir As String
 Dim cfi As String
 Dim tdir As String
 Dim tfi As String
 Dim lin(1 To 5, 1 To 1) As String
 Dim filenum As Integer
  
 cdir = ThisWorkbook.Path
 cfi = ThisWorkbook.Name
 tfi = "sample_Outfile.txt"
 tdir = cdir & "\" & tfi
 filenum = FreeFile
  
 For i = 1 To 5
  lin(i, 1) = i & "番目"
 Next
  
 Open tdir For Output As #filenum
  
 For i = 1 To 5
  Print #filenum, lin(i, 1)
 Next
  
 Close #filenum

End Sub
サンプルコードの説明

テキストファイルを閉じる

テキストファイルを閉じるには、closeステートメントを使用します。閉じる場合は簡単で以下のように指定します。

【ファイルを閉じる】
 Close #filenumber

ファイルを開いたらきちんと閉じましょう。

コメント

タイトルとURLをコピーしました