VBA CSV,タブ(Tab)区切りファイルを作成する方法 - Excel VBA

VBAでExcelファイルからCSVやタブ(Tab)区切りファイルを作成する方法です。

VBA CSV,タブ(Tab)区切りファイルを作成する方法 - Excel VBA

実務では、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)区切りファイルを作成する方法を紹介しました。

いかがでしたでしょうか?

今回は、テキスト出力したいセルにデータが全て埋まっている状態でしたが、実務では、行や列によってセルに値があったりなかったりすることが多々あると思います。その際には、最終行と最終列の取得方法には注意が必要です。この方法だと、正常に取得できない可能性もあります。行数や列数が決まっている場合には問題ないのでしょうが、決まっていない場合などは、十分な検証が必要です。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。