VBA CSV,タブ(Tab)区切りファイルを作成する方法 - Excel VBA
VBAでExcelファイルからCSVやタブ(Tab)区切りファイルを作成する方法です。
実務では、Excel で管理されているデータが多数あります。そのデータをシステムにインポートしたいなどの要望があった場合、Excel のままでもインポート可能ですが、既存の仕組みを使ってインポートしたい場合など、CSVやタブ区切りのテキストファイルを利用したりします。
今回はマクロを実行することで、CSVやタブ(Tab)区切りのテキストファイルを作成します。
それでは、サンプルソースを見ながら解説していきます。
目次
対象データ
セル A1 から C11 まで、セルに値を入力しています。
サンプルソース
サンプルソースはこちらです。標準モジュールを追加してご利用ください。
Option Explicit
'
' 処理 :タブ区切りファイルへの保存
' 作成日:2014/03/03
' 作成者:saka-en, https://www.saka-en.com
'
Public Sub Run()
Dim FileName As String
FileName = WriteTsvFile(Worksheets("サンプル"))
If FileName <> "" Then
MsgBox "タブ区切りテキストファイルが作成されました。" & vbCrLf & "[PATH]" & vbCrLf & FileName, vbInformation, "タブ区切りテキストファイル作成完了"
End If
End Sub
'
' 処理 :タブ区切りファイル作成
' 引数 :対象シート
' 戻り値:ファイル名
' 作成日:2014/03/03
' 作成者:saka-en, https://www.saka-en.com
'
Private Function WriteTsvFile(TargetSheet As Worksheet) As String
On Error GoTo WriteTabTxtFileErr
Dim FileName As String
Dim LastRow As Long
Dim LastCol As Long
' ファイル名を作成
FileName = Application.ThisWorkbook.Path & "" & Format(Now, "yyyymmdd-hhnnss") & "_" & TargetSheet.Name & ".txt"
' 最終行と最終列の取得
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
' 範囲を指定してコピー
Range(TargetSheet.Cells(1, 1), TargetSheet.Cells(LastRow, LastCol)).Copy
' 新規BOOKの作成
Workbooks.Add
' 貼り付け
ActiveSheet.Paste
' アラートOFF
Application.DisplayAlerts = False
' Tab区切りText形式で保存
ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlText, Local:=True
' CSV形式で保存
'ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlCSV, Local:=True
' 新規BOOKを閉じる
ActiveWindow.Close savechanges:=False
' アラートON
Application.DisplayAlerts = True
WriteTsvFile = FileName
Exit Function
WriteTabTxtFileErr:
MsgBox "[WriteTabTxtFile]" & vbCrLf & TargetSheet.Name & vbCrLf & Err.Description, vbCritical, "Exception"
WriteTsvFile = ""
Exit Function
End Function
処理の流れ
処理の流れを説明していきます。
ファイル名を作成
FileName = Application.ThisWorkbook.Path & "" & Format(Now, "yyyymmdd-hhnnss") & "_" & TargetSheet.Name & ".txt"
まず、作成されるファイル名を構築します。こちらは任意で変更できますが、今回は、Excel ファイルと同じ場所に日付(YYYYMMDD) + 時刻(HHMMSS) + シート名のテキストファイルを作成することにします。
最終行と最終列の取得
最終データがある行と列の取得方法は様々ですが、今回はこの方法を利用します。
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Rows.Count
にて、行数を取得し、そこからEnd(xlUp)
にて最終行を探します。Excel 操作で、最終行(65535)から CTRL + 上ボタンを押下するイメージですね。
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
こちらも同様でColumns.Count
にて列数を取得し、そこからEnd(xlToLeft)
にて、最終列を探します。xcel 操作で、最終列(IV)から CTRL + ← を押下するイメージです。
範囲を指定してコピー
Range(TargetSheet.Cells(1, 1), TargetSheet.Cells(LastRow, LastCol)).Copy
最終行と最終列を選択状態にしてコピーします。CTRL + C ボタンを押下するイメージです。
新規BOOKの作成
Workbooks.Add
一時的に別の Workbook を作成します。Workbook は作成されても非表示状態ですので、目で見ることはできません。したがってユーザの目には、新しい Workbook が作成されたようには見えませんので、画面がチラチラしてストレスになることもありません。
貼り付け
ActiveSheet.Paste
新しい Workbook のシートに貼り付けます。CTRL + P ボタンを押下するイメージです。
アラートOFF
Application.DisplayAlerts = False
ここで重要なのが、アラートを OFF にすることです。これをやらないと、保存するか否かなどのメッセージが表示され、ユーザの手を煩わせることになり、自動化できません。
Tab区切りText形式で保存
ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlText, Local:=True
貼り付けたデータをファイルに保存します。FileFormat:=xlText
がタブ(Tab)区切り保存を意味しています。「名前を付けて保存」のイメージですね。
Local:=True
を設定すると、コントロールパネルで設定された日付形式で保存されます。この引数を忘れると日付形式が “yyyy/m/d” から “m/d/yy” 型に変更されてしまいますのでご注意ください。
詳しくは「VBA SaveAs テキストファイル保存 日付や通貨の書式が変更される問題の解決方法」を参照ください。
VBA SaveAs テキストファイル保存 日付や通貨の書式が変更される問題の解決方法CSV形式で保存
ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlCSV, Local:=True
FileFormat:=xlCSV
が、CSV形式での保存を意味しています。
新規BOOKを閉じる
ActiveWindow.Close savechanges:=False
一時的に別の Workbook を利用したので、ここはきちんと閉じる必要があります。これをしないと、実行するたびにプロセスがどんどん増え、メモリを多用し、PCへかかる負荷が増大します。リソースは限りがありますので、使いっぱなしはいけません。
アラートON
Application.DisplayAlerts = True
ここも重要です。アラートを OFF にしたので、ON に戻してやらないと、次からの操作でメッセージが表示されなくなるなどのトラブルが発生し、ユーザが困惑します。
メッセージの表示
MsgBox "タブ区切りテキストファイルが作成されました。" & vbCrLf & "[PATH]" & vbCrLf & FileName, vbInformation, "タブ区切りテキストファイル作成完了"
ファイルが正常に保存されたことをユーザに教えてあげましょう。
実行結果
ふむふむ、いいかんじです^^
まとめ
VBAでCSV,タブ(Tab)区切りファイルを作成する方法を紹介しました。
いかがでしたでしょうか?
今回は、テキスト出力したいセルにデータが全て埋まっている状態でしたが、実務では、行や列によってセルに値があったりなかったりすることが多々あると思います。その際には、最終行と最終列の取得方法には注意が必要です。この方法だと、正常に取得できない可能性もあります。行数や列数が決まっている場合には問題ないのでしょうが、決まっていない場合などは、十分な検証が必要です。
おつかれさまでした。