テキストファイルの新規書き込み方法

テキストファイルを新規作成したり、既存ファイルの内容を上書きしたい場合は Open ステートメントに Output モードを指定します。

データを書き込むステートメントには Print # と Write # の2つあります。Print # ステートメントはデータがそのまま出力されるのに対して、Write # ステートメントは文字列がダブルクォーテーションで括られるなどの違いがあります。Write # ステートメントで出力したデータはInput # ステートメントで正しく読み込むことができます。

スポンサーリンク

使用方法

Openステートメント(Outputモード)

ファイルを開くときに使用するステートメントです。FileNumber は、予め FreeFile 関数を使用して次に使用可能なファイル番号を取得しておく必要があります。

構文
Open PathName For Output [Lock] As #FileNumber
引数名 省略 説明
PathName × 文字列式にはファイル名を指定します。 フォルダ名、またはドライブ名も含めて指定できます。
Lock 開くファイルに対する、他のプロセスからのアクセスを制御する、次のいずれかのキーワードを指定します。

Shared
Lock Read
Lock Write
Lock Read Write
FileNumber × 1 ~ 511 の範囲で任意のファイル番号を指定します。 予め FreeFile 関数 を使用して次に使用可能なファイル番号を取得しておいてください。

Print # ステートメント

ファイルを書き込むときに使用するステートメントです。

構文
Print #FileNumber, [OutputList]
引数名 省略 説明
FileNumber × ファイルをオープンする際に指定したファイル番号を指定します。
OutputList ファイルに出力する式や文字列式を指定します。 セミコロン (;) で区切ることで、複数のデータ項目を続けて出力することができます。 スペースを追加する Spc(n) 関数や、タブを追加する Tab(n) 関数を使用することができます。

Write # ステートメント

ファイルを書き込むときに使用するステートメントです。

構文
Write #FileNumber, [OutputList]
引数名 省略 説明
FileNumber × ファイルをオープンする際に指定したファイル番号を指定します。
OutputList ファイルに出力するデータをカンマで区切って指定します。 セミコロン (;) で区切ることで、複数のデータ項目を続けて出力することができます。

Close ステートメント

ファイルを閉じるときに使用するステートメントです。

構文
Close [#FileNumber1] [, #FileNumber2 …]
引数名 省略 説明
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ステートメント

入力となるワークシートのデータです。

アクティブシートのデータ表
アクティブシートのデータ表

マクロを実行すると下図のテキストファイルが新規作成されます。

sample_eb093_01実行結果
sample_eb093_01実行結果

テキストファイル(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#ステートメントを使用して出力すると、文字列の場合にはダブルクォーテーション、日付やブール値は#で自動的に括られるようです。

sample_eb093_02実行結果
sample_eb093_02実行結果

 入力ファイルの数値を2倍して出力ファイルへ書き出す

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