シートの内容をファイル出力するには
シートの内容をテキストファイルに出力するには、大きく2つの処理が必要になります。
1つはシートのセルのデータの取得で、もう1つはファイルへの出力処理です。
データの取得はUsedRangeプロパティで入力されている全てセル範囲とします。UsedRangeプロパティで取得できる範囲については「VBAで入力済みセル範囲を判定する(UsedRange)」をご参照ください。
ファイル出力はFileSystemObjectクラスを利用します。
事前準備
FileSystemObjectを利用するためには参照設定が必要です。
VBA画面のツールメニュー→参照設定で、Microsoft Scripting Runtimeにチェックを付けます。
ソースコード
シートの内容をファイル出力するコードです。
アクティブシートの入力内容をブックと同じフォルダにテキストファイルを出力します。
ファイル名はアクティブシートのシート名+.txtです。
行は改行、列はタブ文字で区切っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Sub SheetToFile() Dim rUsed As Range '// UsedRange Dim r As Range '// Cell Dim fs As New FileSystemObject '// FileSystemObject Dim ts As TextStream '// TextStream Dim sFilePath '// 出力ファイルパス Dim iRow '// 現在行 Dim s '// 出力文字列 '// ファイルパス=ブックと同じフォルダ+シート名+.txt sFilePath = ActiveWorkbook.Path & "\" & ActiveSheet.Name & ".txt" '// FileSystemObjectで新規ファイル作成 Set ts = fs.CreateTextFile(sFilePath, True, False) '// シートの入力範囲の全セルを取得 Set rUsed = ActiveSheet.UsedRange iRow = 0 '// 1セルずつループ For Each r In rUsed If iRow <> r.Row Then '// ループ初回時ではない場合 If r.Row <> rUsed.Row Or r.Column <> rUsed.Column Then '// 行が変わったため改行コードを付与 s = s & vbCrLf End If '// 行の先頭値を連結 s = s & r.Text Else '// タブ文字区切りで連結 s = s & vbTab & r.Text End If '// 現在行取得 iRow = r.Row Next '// セルの文字列が存在する場合 If s <> "" Then Call ts.WriteLine(s) ' Call ts.Write(s) ' Call ts.Write(vbCrLf) End If '// ファイルClose Call ts.Close End Sub |
使い方
ファイル化したいシートを開いた状態にして上の関数を実行します。
44行目と45行目のコメントですが、これはテキストファイルの改行コードを変更したい場合に使います。
43行目のWriteLineメソッドは文字列に改行コードを付与してファイルに出力しますが、改行コードはCRLFになります。
改行コードをLFにしたい場合などはWriteLineメソッドではなくWriteメソッドでvbLfなどの改行コードを個別に設定します。その際には27行目のvbCrLfも同じように対応します。
実行前のシート
A列と1行目にはデータが未設定になっています。
UsedRangeプロパティはB2セルからE10セルがデータ取得範囲になります。
実行後に出力されたファイル
シートに入力されている表示形式のままテキストファイルに出力されています。
CSVファイルに出力したい場合
CSVファイルに出力したい場合は上のコードの2か所を修正します。
1つ目は拡張子です。11行目のファイル名の拡張子を変更します。
変更前
10 11 |
'// ファイルパス=ブックと同じフォルダ+シート名+.txt sFilePath = ActiveWorkbook.Path & "\" & ActiveSheet.Name & ".txt" |
変更後
10 11 |
'// ファイルパス=ブックと同じフォルダ+シート名+.csv sFilePath = ActiveWorkbook.Path & "\" & ActiveSheet.Name & ".csv" |
2つ目はタブ文字をカンマに変更すればOKです。
具体的には34行目を以下のように変更してください。
変更前
33 34 |
'// タブ文字区切りで連結 s = s & vbTab & r.Text |
変更後
33 34 |
'// カンマ文字区切りで連結 s = s & "," & r.Text |
セルに表示された内容ではなくデータを出力したい場合
上のコードは各セルのTextプロパティを使っているため、見たままの内容がテキストファイルに出力しています。
そうではなく、セルに設定されている値を出力したい場合はTextプロパティではなくValueプロパティを使います。
変更前
30 31 32 33 34 35 |
'// 行の先頭値を連結 s = s & r.Text Else '// タブ文字区切りで連結 s = s & vbTab & r.Text End If |
変更後
30 31 32 33 34 35 |
'// 行の先頭値を連結 s = s & r.Value Else '// タブ文字区切りで連結 s = s & vbTab & r.Value End If |
.Textを.Valueに変更した場合に、先のワークシートを出力した場合は以下のように出力されます。