Excel VBA 複数のシートのデータを固定長のテキスト形式で書き出す

スポンサーリンク

複数のシートのデータを固定長のテキスト形式で書き出す方法

ブック内のすべてのシートのデータを固定長のテキストファイルに書き出す方法について解説します。Open【オープン】ステートメントでテキストファイルを開きPrint #【プリントハッシュ】ステートメントでファイルに書き出します。

複数のシートのデータを固定長のテキスト形式で書き出すコードと解説

Sub 固定長テキスト作成()
Dim フォルダ名 As String
Dim パス名 As String
Dim ファイル名 As String
Dim データ As Variant
Dim 行数 As Long
Dim 列数 As Long
Dim 空白 As Integer
Dim i As Long
Dim j As Long
Dim k As Long
 フォルダ名 = ActiveWorkbook.Name
 フォルダ名 = Left(フォルダ名, Len(フォルダ名) - 5)
 パス名 = ActiveWorkbook.Path & "¥" & フォルダ名
If Dir(パス名, vbDirectory) = "" Then
 MkDir パス名
End If
 ChDir パス名
 Application.ScreenUpdating = False
For i = 1 To Worksheets.Count
  Worksheets(i).Activate
  Range("A1").CurrentRegion.Select
  行数 = Selection.Rows.Count
  列数 = Selection.Columns.Count
  ファイル名 = ActiveSheet.Name & ". txt"
 Open ファイル名 For Output As #1
 For j = 1 To 行数
  For k = 1 To 列数 - 1
  空白 = 10 - Len(Cells(j, k).Value)
   データ = Selection.Cells(j, k).Value
    Print #1, データ; Spc(空白);
    Next k
  空白 = 10 - Len(Cells(j, 列数).Value)
  Print #1, Selection.Cells(j, 列数).Value; Spc(空白)
 Next j
Close #1
Next i
 Application.ScreenUpdating = True
 MsgBox ThisWorkbook.Path & フォルダ名 & " フォルダーにtxtファイルを出力しました。"
End Sub
2~11行目
各変数の変数宣言です。


12行目【 フォルダ名 = ActiveWorkbook.Name 】
Workbook【ワークブック】オブジェクトのName【ネーム】プロパティを使用して、このブックの名前を取得し、変数「フォルダ名」に代入します。


13行目【 フォルダ名 = Left(フォルダ名, Len(フォルダ名) – 5) 】
文字列の左端から引数に指定した数の文字列を取得するLeft【レフト】関数を使用して、変数「ファルダ名」に格納されているブック名の左端から、第ニ引数で指定された数分の文字列を取得して。変数「フォルダ名」に代入します。Left【レフト】関数に指定する取得する文字数を表す第ニ引数は、Len【レン】関数で変数「フォルダ名」に代入されているブック名の文字数を取得して、5を減算し、ブック名に含まれている拡張子(.xlsm)を削除します。


14行目【 パス名 = ActiveWorkbook.Path & “¥” & フォルダ名 】
Workbook【ワークブック】オブジェクトのPath【パス】プロパティを使用して、このブックのパス(保存場所)を取得し、変数「フォルダ名」に格納されている「拡張子の無いこのブック名」を文字列を連結するアンパサンド「&」で連結して、変数「パス名」に代入します。


15行目【 If Dir(パス名, vbDirectory) = “” Then 】
If【イフ】ステートメント(条件分岐)を使用して、条件式にファイルやフォルダーの存在を確認するDir【デレクトリ】関数で第二引数をフォルダーを表すvbDirectory【ブイビーデレクトリー】に指定して変数「パス名」に格納されている文字列と同じフォルダーが
存在しない場合(Dir関数の戻り値が長さ0文字の文字列「””」)を定義します。


16行目【 MkDir パス名 】
15行目の条件式が成立したら、すなわちパス名と同じ名前のフォルダがなかった場合にMKDir【メイクデレクトリ】関数で変数「パス名」に格納されている名前、つまり、このブック名でフォルダを作成します。


18行目【 ChDir パス名 】
現在のカレントフォルダーを指定した名前のフォルダに変更するChDir【チェンジデレクトリ】ステートメントを使用して、カレントフォルダーを変数「パス名」に格納されているフォルダー名のフォルダーに変更します。カレントフォルダーとは、現在作業対象になっているフォルダーのことです。


19行目【 Application.ScreenUpdating = False 】
Application【アプリケーション】オブジェクトのScreenUpdating【スクリーンアップディーティング】プロパティにFalseを設定して繰り返し処理の前に高速化のため画面の更新を抑止します。


20行目【 For i = 1 To Worksheets.Count 】
For【フォー】ステートメントを使用して、繰り返し処理の始まりです。条件式は、カウンター変数「i」に1から、Worksheets【ワークシーツ】コレクションのCount【カウント】プロパティで取得したワークシートの枚数分を順次代入し、シート枚数分の繰り返し処理になります。


21行目【 Worksheets(i).Activate 】
繰り返し処理の中で、Worksheets【ワークシーツ】プロパティの引数にカウンター変数「i」を設定して左のワークシートから順にアクティブにします。


22行目【 Range(“A1”).CurrentRegion.Select 】
アクティブにしたシートのA1セルから始まるデータ範囲をRange【レンジ】オブジェクトのCurrentRegion【カレントリージョン】プロパティで参照し、Range【レンジ】オブジェクトのSelect【セレクト】メソッドで選択します。


23行目【 行数 = Selection.Rows.Count 】
Application【アプリケーション】オブジェクトのSelection【セレクション】プロパティを使用して、選択しているセル範囲を参照し、
Range【レンジ】オブジェクトのRows【ロウズ】プロパティでその行を参照しCount【カウント】プロパティで選択セル範囲の行数を取得して変数「行数」に代入します。


24行目【 列数 = Selection.Columns.Count 】
Application【アプリケーション】オブジェクトのSelection【セレクション】プロパティを使用して、選択しているセル範囲を参照し、
Range【レンジ】オブジェクトのColumns【カラムズ】プロパティでその列を参照しCount【カウント】プロパティで選択セル範囲の列数を取得して変数「列数」に代入します。


25行目【 ファイル名 = ActiveSheet.Name & “.txt” 】
Worksheet【ワークシート】オブジェクトのName【ネーム】プロパティを使用して、アクティブシートのシート名を取得し、文字列を連結するアンパサンド「&」で拡張子になる文字列「.txt」を連結して、変数「ファイル名」に代入します。


26行目【 Open ファイル名 For Output As #1 】
Open【オープン】ステートメントを使用して変数「ファイル名」のテキストファイルを出力モードで、このファイル番号を「1」番に指定してこのファイルを開きます。


27行目【 For j = 1 To 行数 】

2回目(入れ子)のFor【フォー】ステートメントを使用し繰り返し処理の始まりです。カウンタ―変数のjに1~変数「行数」分を順に代入し変数「行数」回繰り返します。


28行目【 For k = 1 To 列数 – 1 】
3回目(更に入れ子)のFor【フォー】ステートメントを使用し繰り返し処理の始まりです。カウンタ―変数のkに1~変数「列数」-1分を順に代入します。列数-1にするわけは、最終列の一つ前までは改行しないようにして最後の列で改行する処理があるためです。


29行目【 空白 = 10 – Len(Cells(j, k).Value) 】
固定長の文字の長さを10に設定しています。セル内の一番長い文字列にあわせて、この数値を変更してください。
Len【レン】関数でセル内の文字の数を取得して、10から減算することで10文字に合わせるために必要な空白を算出して変数「空白」に代入します。
※変数「空白」が負の値になるとエラーになるので必ず固定長の長さは、セル内の一番長い文字列の長さより長い値を設定してください。


30行目【 データ = Selection.Cells(j, k).Value 】
まずは、データ範囲のj行目の最終列の手前までの値を変数「データ」に格納して、繰り返し処理の中で、次の行のデータ範囲の最終列の手前までの値を変数「データ」に代入します。


31行目【 Print #1, データ; Spc(空白); 】
Print #【プリントハッシュ】ステートメントを使用してOpen【オープン】ステートメントで開いた1のファイルにデータを書き出します。変数「データ」のあとにセミコロン「;」を記述して、改行しないで書き出し10文字になるように変数「空白」に代入されている数の空白をSpc【スペース】関数を使用して書き出します。


32行目【 Next k 】
ここまでが、カウンター変数Kの繰り返し処理で、まずは、行は固定で列のデータを最終列の一つ手前の列まで1ファイルに書き出します。


33行目【 空白 = 10 – Len(Cells(j, 列数).Value) 】
29行目の説明と同じで、最終列のデータに必要な空白を変数「空白」に代入しています。
※29行目で固定長の長さ10を変更した場合はこちらも同じ値に変更してください。


34行目【 Print #1, Selection.Cells(j, 列数).Value; Spc(空白) 】
Print #【プリントハッシュ】ステートメントで、最終列のデータを1ファイルに書き出しています。データの最後にセミコロンがないのでここで改行されます。ここまでで、1行分のデータが書き込まれ改行されたことになります。


35行目【 Next j 】
ここまで、26行目からの処理をデータの行数分の回数繰り返してシートのデータを1ファイルに書き込みます。


36行目【 Close #1 】
ここで、シートのデータが書き込まれた1ファイルを閉じてデータの書き込みを確定します。


37行目【 Next i 】
ここまでの処理をシートの枚数分の回数繰り返して、各シートのデータを各シート名をつけて1テキストファイルに書き出し処理をします。


38行目【 Application.ScreenUpdating = True 】
繰り返し処理が終了したので、高速化のため止めていた画面の更新を再開します。


39行目【 MsgBox ThisWorkbook.Path & フォルダ名 & ” フォルダーにtxtファイルを出力しました。”】
MsgBox【メッセージボックス】関数を使用してファイルの出力先を伝えます。

以上で、複数のシートのデータを固定長のテキスト形式で書き出す方法についての解説を終了します。ありがとうございました。

スポンサーリンク

関連記事・広告