
動画でExcel シートをタブ区切りのテキストにして保存する
動画版「マクロ講座」です。
今回はシートをタブ区切りのテキスト形式で保存するというマクロを作成します。
なぜわざわざ、テキスト形式で保存するのでしょうか?
それはExcelを開かなくても手軽に開くことができ、また編集もできるからです。
タブ区切りやコンマ区切りなどのテキスト形式で保存すると、Excel以外のアプリで編集できるようになります。
また今回はユーザにつけた名前を取得するために、ユーザーに
名前を付けて保存ダイアログボックスを表示させて、その名前を VBA で取得して使います。
メソッドは GetSaveAsFilenameメソッドといいます。
タブ区切りやコンマ区切りなどのテキスト形式で保存すると、Excel以外のアプリで編集できるようになるので、内容を手っ取り早く確認したい場合などは、テキスト形式で添付してほしいなどという要望があるわけです。またタブ区切りでは改行などの文字が正しく解釈されます。
Excel はセルの区切りをタブ文字で表していますから、 受け取ったテキストをコピーして、直接Excelに張り付けたりする場合に便利です。そのときにユーザーが自分で名前をつけることができたら便利です。そこでユーザーからファイル名を取得するために名前を付けて保存ダイアログボックスを表示します。この時使うメソッドは GetSaveAsFilenameメソッドといいます。

余計な情報が入っていない分、データの容量が軽いということや、様々なソフトやツールで開くことができます。
Excelで[名前を付けて保存] ダイアログ ボックスで、ファイルの種類をテキスト (タブ区切り)に設定して保存すると作成できます。
テキストの名前は、[ファイル名] ボックスに表示されているブック名をそのまま使うか、新しいブック名を入力します。

作成したテキストをメモ帳で開きました。データの確認等には、十分です。この操作をマクロで自動化します。

サンプルでは、ワークブックのアクティブシートをコピーして、そしてそのコピーしたブックをワークブックのパスと同じところに 保存しろというコードです。
変数として、Dim fname As String、 fname は、シート名を入れておき使うための変数です。
Application.ScreenUpdating = Falseを最初に書いているのは、VBAでの操作を画面で表示するのを止めておくためです。
Falseで画面更新停止、Trueで画面更新再開することができます。
Application.ScreenUpdating = False
Dim fname As String
fname = ThisWorkbook.ActiveSheet.Name
ThisWorkbook.ActiveSheet.Copy
アクティブシートを空の新規ブックにコピーしています。
Dim wb As Workbook: Set wb = ActiveWorkbook
は、新規ワークブックを扱いやすように、wbという変数に入れています。
それをwb.SaveAs と、SaveAsメソッドを使って、名前をつけて保存しています。
引数FileFormat:=xlTextにてテキストで保存することにより、タブ区切りテキストにします。
fnameというのはシート名ですから、fname & ".txt"で保存されます。
また新規ブックは不要なので保存しないで閉じています。

'アクティブシートを空の新規ブックにコピーすると新規ブックができる
ThisWorkbook.ActiveSheet.Copy
'その新規ブックをテキスト形式で保存
Dim wb As Workbook: Set wb = ActiveWorkbook
wb.SaveAs _
FileName:=ThisWorkbook.Path & "\" & fname & ".txt", _
FileFormat:=xlText
まとめたコードがこちらです。
Sub タブ区切りテキストをシート名で保存()
Application.ScreenUpdating = False
Dim fname As String
fname = ThisWorkbook.ActiveSheet.Name
'アクティブシートを空の新規ブックにコピーすると新規ブックができる
ThisWorkbook.ActiveSheet.Copy
'その新規ブックをテキスト形式で保存
Dim wb As Workbook: Set wb = ActiveWorkbook
' & ".txt", FileFormat:=xlText とするだけ
wb.SaveAs _
FileName:=ThisWorkbook.Path & "\" & fname & ".txt", _
FileFormat:=xlText
'新規ブックは不要なので保存しないで閉じる
wb.Close SaveChanges:=False
Application.ScreenUpdating = True
End Sub
2つ目のコードです。今度は、シートを保存するときに、シート名を使うのではなく、その時に名前をユーザーがつけるというものです。
Application.GetSaveAsFilenameメソッドを使います。
構文は次のようになります。
Application.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)

GetSaveAsFilenameメソッドは、[名前を付けて保存] ダイアログボックスを表示しユーザーにフォルダとファイル名を指定してもらいます。
コードでは引数イニシャルファイルネームに"sample.csv"、
そしてフィルファイルフィルターには "CSVファイルもしくはTXTファイル,*.csv;*.txt" を指定しています。
実行すると、シートが新規ブックとして作成されます。そして名前をつけて保存ダイアログが表示されて、ユーザーが名前をつけて保存することができます。
コードの全体はこちらです。
注意すべきなのは、 fname を Stringではなく、 Variant型にしている点です。
これは If fname <> False Then というようにFalseかTrueかを問うためには、Variant型にする必要があるからです。
Sub タブ区切りで名前をつけてテキスト保存()
ThisWorkbook.ActiveSheet.Copy
Dim wb As Workbook: Set wb = ActiveWorkbook
Dim fname As Variant
fname = Application.GetSaveAsFilename("sample.csv", _
"CSVファイルもしくはTXTファイル,*.csv;*.txt")
If fname <> False Then
ActiveSheet.SaveAs fname
End If
wb.Close SaveChanges:=False
End Sub