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バイト以下の数値を指定する。 ランダムアクセスファイルの場合はレコード長となり、シーケンシャルファイルの場合はバッファーされる文字数となる。 |
ファイルが存在しない状態でAppend、Binary、Output、または Random モードでファイルを開くと、そのファイルが新たに作成されます。
Binary、Input、および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
ファイルを開いたらきちんと閉じましょう。
コメント