テキストファイルを新規作成したり、既存ファイルの内容を上書きしたい場合は Open ステートメントに Output モードを指定します。
データを書き込むステートメントには Print # と Write # の2つあります。Print # ステートメントはデータがそのまま出力されるのに対して、Write # ステートメントは文字列がダブルクォーテーションで括られるなどの違いがあります。Write # ステートメントで出力したデータはInput # ステートメントで正しく読み込むことができます。
使用方法
Openステートメント(Outputモード)
ファイルを開くときに使用するステートメントです。FileNumber は、予め FreeFile 関数を使用して次に使用可能なファイル番号を取得しておく必要があります。
引数名 | 省略 | 説明 |
---|---|---|
PathName | × | 文字列式にはファイル名を指定します。 フォルダ名、またはドライブ名も含めて指定できます。 |
Lock | ○ | 開くファイルに対する、他のプロセスからのアクセスを制御する、次のいずれかのキーワードを指定します。
Shared Lock Read Lock Write Lock Read Write |
FileNumber | × | 1 ~ 511 の範囲で任意のファイル番号を指定します。 予め FreeFile 関数 を使用して次に使用可能なファイル番号を取得しておいてください。 |
Print # ステートメント
ファイルを書き込むときに使用するステートメントです。
引数名 | 省略 | 説明 |
---|---|---|
FileNumber | × | ファイルをオープンする際に指定したファイル番号を指定します。 |
OutputList | ○ | ファイルに出力する式や文字列式を指定します。 セミコロン (;) で区切ることで、複数のデータ項目を続けて出力することができます。 スペースを追加する Spc(n) 関数や、タブを追加する Tab(n) 関数を使用することができます。 |
Write # ステートメント
ファイルを書き込むときに使用するステートメントです。
引数名 | 省略 | 説明 |
---|---|---|
FileNumber | × | ファイルをオープンする際に指定したファイル番号を指定します。 |
OutputList | ○ | ファイルに出力するデータをカンマで区切って指定します。 セミコロン (;) で区切ることで、複数のデータ項目を続けて出力することができます。 |
Close ステートメント
ファイルを閉じるときに使用するステートメントです。
引数名 | 省略 | 説明 |
---|---|---|
FileNumber1… | ○ | ファイルをオープンする際に指定したファイル番号を指定します。 カンマで区切って複数指定することができます。 省略した場合は、Open ステートメントで開いたすべてのファイルが閉じられます。 |
使用例
テキストファイル(CSV形式)の新規作成(その1)
Print # ステートメントを使用し、データ表のタイトル行およびD列がTRUEの行をCSV形式で出力する例です。
Sub sample_eb093_01()
Dim myPath As String
Dim FileNumber As Integer
Dim outDats(1 To 5) As Variant
Dim myRow As Long
Dim i As Integer
Dim flg_out As Boolean
'このマクロが組み込まれたエクセルファイルと
'同じフォルダにある"test_output1.csv"を出力ファイルとします。
myPath = ThisWorkbook.Path & "¥test_output1.csv"
'空いているファイル番号を取得します。
FileNumber = FreeFile
'ファイルをOutputモードで開きます。
Open myPath For Output As #FileNumber
'アクティブシートの使用済み領域を出力範囲とします。
With ActiveSheet.UsedRange
For myRow = 1 To .Rows.Count
'出力対象のチェック
If myRow = 1 Then
flg_out = True 'タイトル行は出力
ElseIf CBool(.Cells(myRow, 5).Value) Then
flg_out = True '[対象]がTRUEの場合は出力
Else
flg_out = False '上記以外は出力しない
End If
If flg_out Then
'出力用の配列へデータをセットします。
For i = 1 To 5
outDats(i) = .Cells(myRow, i).Value
Next i
'配列の要素をカンマで結合して出力します。
Print #FileNumber, Join(outDats, ",")
End If
Next myRow
End With
'入力ファイルを閉じます。
Close #FileNumber
End Sub
ワークブックの名前とパス FreeFile関数
Join関数
データ型変換関数
配列の宣言
For…Next Withステートメント
入力となるワークシートのデータです。
マクロを実行すると下図のテキストファイルが新規作成されます。
テキストファイル(CSV形式)の新規作成(その2)
Write # ステートメントを使用し、前述サンプルと同様にデータ表のタイトル行およびD列がTRUEの行をCSV形式で出力する例です。
Sub sample_eb093_02()
Dim myPath As String
Dim FileNumber As Integer
Dim myRow As Long
Dim i As Integer
Dim flg_out As Boolean
'このマクロが組み込まれたエクセルファイルと
'同じフォルダにある"test_output2.csv"を出力ファイルとします。
myPath = ThisWorkbook.Path & "¥test_output2.csv"
'空いているファイル番号を取得します。
FileNumber = FreeFile
'ファイルをOutputモードで開きます。
Open myPath For Output As #FileNumber
'アクティブシートの使用済み領域を出力範囲とします。
With ActiveSheet.UsedRange
For myRow = 1 To .Rows.Count
'出力対象のチェック
If myRow = 1 Then
flg_out = True 'タイトル行は出力
ElseIf CBool(.Cells(myRow, 5).Value) Then
flg_out = True '[対象]がTRUEの場合は出力
Else
flg_out = False '上記以外は出力しない
End If
If flg_out Then
Write #FileNumber, _
.Cells(myRow, 1).Value, _
.Cells(myRow, 2).Value, _
.Cells(myRow, 3).Value, _
.Cells(myRow, 4).Value, _
.Cells(myRow, 5).Value
End If
Next myRow
End With
'入力ファイルを閉じます。
Close #FileNumber
End Sub
ワークブックの名前とパス FreeFile関数 データ型変換関数
For…Next Withステートメント
入力データは sample_eb093_01 で使用したものと同じです。
マクロを実行すると下図のテキストファイルが新規作成されます。Write#ステートメントを使用して出力すると、文字列の場合にはダブルクォーテーション、日付やブール値は#で自動的に括られるようです。