【超簡単】ワンタッチでエクセルからCSV出力するVBAプログラム
VBAでCSVファイルを出力するための「汎用CSV出力マクロ」を作りました。
単にCSVファイルを作りたいだけならVBAの知識は不要です。
また、CSVファイルの出力方法を変えたいという場合でも、多くの場合関数の呼び出し時の引数を指定するだけで済むので、とても簡単に使うことができます。
このページで公開しているマクロでは、下記のような処理に対応しています。
- シート全体ではなくシートの一部だけCSV出力したい
- 一部の列について、表示形式を適用したい(適用したくない)
- 一部の列について、「"」でデータを囲みたい
- カンマ区切りではなく「TAB区切り」で出力したい
- 改行コードを「LF」にしたい
- CSVファイルの文字コードをUTF-8にしたい
他のホームページで公開されているマクロとは違い、かなり汎用性が高いプログラムだと思いますので、ぜひ、試してみてください。
この記事の目次
ダウンロードして、試しに使ってみる
- ここからエクセルブックをダウンロードし、手元のPCに保存してください。
- ダウンロードしたエクセルブックを開きます
- Ctrl+Shift+Zを押すと、エクセルブックと「同じフォルダ」に「同じ名前で」CSVファイルが出力されます
- Ctrl+Shift+Yを押すと、少しレイアウトが変わった形で「同じ名前で」CSVファイルが出力されます
CSV出力マクロの使い方
初心者向き:シートの内容を書き換える
単にCSV出力をしたいだけであれば、マクロを一切修正する必要はありません。
先ほどダウンロードしたエクセルブックのエクセルシートにCSV化したいデータを記入してください。
上記のように(Sheet1に入力されている)既存のサンプルデータを書き換えてもらえばOKです。
あるいは、別途シートを追加し、既存シートを削除しても構いません。
データ入力後、Ctrl+Shift+Zを押せば、開いているシートの内容がCSVファイルとして出力されます。
CSV出力ボタンの追加
下記の記事で解説しているように、
- 「ボタン」を追加して
- 「CSV出力_通常」または「CSV_詳細指定」を起動
するように設定すると、ショートカットキーではなくボタンでCSV出力ができるようになります。
詳細はこちら→マクロ実行・別シート移動のエクセル「ボタン」の超簡単な作り方
もちろん、VBAの修正は不要です。
中級者向き:マクロを書き換える
Visual Basic Editorを開き、標準モジュール「Module1」を修正することで、マクロの動作を微調整できます。
ベースになるマクロは「CSV出力_通常」「CSV出力_詳細設定」の2種類あります(それぞれCtrl+Shift+Z、Ctrl+Shift+Yで起動できるように設定されています)。
Const EXT As String = ".csv"
Sub CSV出力_通常()
Dim Filename As String
Filename = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, ".") - 1) & EXT
Dim Filepath As String
Filepath = ActiveWorkbook.Path & "¥" & Filename
Call csv.Output(ActiveSheet, Filepath)
MsgBox Filepath & "にCSVファイルを出力しました"
End Sub
Sub CSV出力_詳細指定()
Dim Filename As String
Filename = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, ".") - 1) & EXT
Dim Filepath As String
Filepath = ActiveWorkbook.Path & "¥" & Filename
Call csv.Output(TargetSheet:=ActiveSheet, Filepath:=Filepath, _
StartRow:=2, StartCol:=2, _
WithFormatCols:="3", WithQuoteCols:="1,2", _
Charset:="utf-8")
MsgBox Filepath & "にCSVファイルを、文字コード「UTF-8」で出力しました。" & Chr(13) _
& "2行目から下、2列目から右のみ出力しています。" & Chr(13) _
& "また、出力データの3列目は書式付、1列目、2列目は「""」で囲んで出力しています。"
End Sub
2つのマクロを比較すると、csv出力_詳細指定のほうがcsv出力処理時に「詳細な指定」をしている以外、違いはありません。
要件に合わせて、どちらかのマクロに必要な修正を入れてください。
たとえば、次のような修正程度であれば、マクロを数行追加・変更するだけで対応できます。
上級者向き:既存のブックにCSV出力マクロを組み込む
- すでに、別ファイルでデータ・マクロを入力済みで
- 今回配布するエクセルブックに、それらのデータをコピーするのが面倒
という場合には、今回のCSV出力マクロを、既存ブックに組み込むこともできます。
今回のCSV出力プログラムは、標準モジュール「csv」の中に作られています。
ですから、標準モジュール「csv」の内容を、別ブックにコピーしてください。
その後、標準モジュール名を「csv」に変更しておいてください。
csv.Outputの使い方
詳細な引数指定が不要な場合
詳細な引数指定が不要な場合には、次のような形で呼び出します。
Call csv.Output(ActiveSheet, "C:¥test.csv")
以下の点に注意してください。
- 「csv」の後は「.」(ピリオド)。その後に「Output」と入れる
- 1つめの引数にはCSV出力したいワークシートを指す「Worksheetオブジェクト」を入れる
- 2つめの引数にはCSV出力したいファイルパスを文字列で入れる
これで、次のようにCSVファイルが出力されます。
今回のように、シート、ファイル名だけを指定して、csv.Outputを呼び出すと、
- 日付データは「YYYY/M/D」形式
- 日付以外のデータは、表示形式が適用されない素の状態
で出力されます。
たとえば、時刻データはCSV出力時に、表示形式が適用されない状態の「小数」で出力されてしまいます。
詳細な引数を指定する場合
今回のプログラムでは、さまざまな引数を指定して、動作を変えることができます。
引数を細かく指定したい場合には、次のように「:=」を使った形で、引数を指定することをおすすめします。
Call csv.Output(TargetSheet:=ActiveSheet, Filepath:="C:¥test.csv", StartRow:=2, StartCol:=2, WithFormatCols:="3", WithQuoteCols:="1,2", Charset:="utf-8")
この呼び出しは、次のような意味になります。
CSV出力するワークシート | 現在開いているシート(ActiveSheet) |
出力先ファイルパス | C:¥test.csv |
CSV出力開始行 | 2行目 |
CSV出力開始列 | 2列目 |
(強制的に)書式付きで出力する列 | (CSV出力対象範囲の)3列目 |
(強制的に)「"」で囲んで出力する列 | (CSV出力対象範囲の)1列目と2列目 |
文字コード | UTF-8(BOMあり) |
実際に、CSVファイルを出力してみると、次のようになります。
マクロ修正例
ファイル名を都度入力できるようにする
シート全体から(通常の)CSVファイルを作ればいいだけであれば「CSV出力_通常」のマクロを修正するのが簡単です。
たとえば、CSVファイルのファイル名を都度選択するようにしたいときには、先ほどのマクロの4行目~8行目を修正します。
Dim Filename As String
Filename = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, ".") - 1) & EXT
Dim Filepath As String
Filepath = ActiveWorkbook.Path & "¥" & Filename
↓
Dim Filepath As String
Filepath = Application.GetSaveAsFilename(, "CSVファイル(*.csv),*.csv")
If Filepath = "False" Then
End
End If
Ctrl+Shift+Zで実行すると、次のように、ファイルダイアログが表示されます。
ファイル名を指定すれば、そのファイル名でCSVファイルが保存されます。
念のため、上記の修正を入れた後の「CSV出力_通常」のマクロ全体を掲載しておきます。
Sub CSV出力_通常()
Dim Filepath As String
Filepath = Application.GetSaveAsFilename(, "CSVファイル(*.csv),*.csv")
If Filepath = "False" Then
End
End If
Call csv.Output(ActiveSheet, Filepath)
MsgBox Filepath & "にCSVファイルを出力しました"
End Sub
CSVファイルの作成範囲・出力内容を調整したいとき
先ほどのマクロの22行目~24行目の、指定する引数(ひきすう)を変えることで、細かくCSVファイルの作成範囲・出力内容の調整をすることができます。
たとえば、
- 2行目~5行目までCSVファイルを出力したいとき
- 1列目~4列目について表示形式を適用
- 3列目について引用符で囲った状態
でCSVデータを出力したいというときは、次のように指定します。
Call csv.Output(TargetSheet:=ActiveSheet, Filepath:=Filepath, _
StartRow:=2, StartCol:=2, _
WithFormatCols:="3", WithQuoteCols:="1,2")
↓
Call csv.Output(TargetSheet:=ActiveSheet, Filepath:=Filepath, _
StartRow:=2, EndRow:=5, _
WithFormatCols:="1,2,3,4", WithQuoteCols:="3")
このように、マクロを変更すると、次のようなCSVファイルができあがります。
すべてのシートを(それぞれ別の)CSVファイルに出力する
※もりさんのブログ
エクセルブックの全シートを一括でCSV(テキスト)ファイルにするマクロ
に触発されて、この項を追加しました。
for~nextループを使って、すべてのシートについて「csv.Output」を呼び出します。
すると、すべてのシートを、それぞれ別のCSVファイルに出力することができます。
たとえば、先ほどのマクロの3行目~13行目(「CSV出力_通常」)を、次のように修正します。
Sub CSV出力_通常()
Dim Filename As String
Filename = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, ".") - 1) & EXT
Dim Filepath As String
Filepath = ActiveWorkbook.Path & "¥" & Filename
Call csv.Output(ActiveSheet, Filepath)
MsgBox Filepath & "にCSVファイルを出力しました"
End Sub
↓
Sub CSV出力_通常()
Dim i As Long
Dim FilenameBase As String
FilenameBase = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, ".") - 1)
Dim FilepathBase As String
FilepathBase = ActiveWorkbook.Path & "¥" & FilenameBase
Dim Filepath As String
For i = 1 To ActiveWorkbook.Worksheets.Count
Filepath = FilepathBase & "_" & ActiveWorkbook.Worksheets(i).Name & EXT
Call csv.Output(ActiveWorkbook.Worksheets(i), Filepath)
Next
MsgBox ActiveWorkbook.Path & "以下にCSVファイルを出力しました"
End Sub
Ctrl+Shift+Zで実行すると、次のように各シートごとのCSVファイルができあがります。
引数一覧
csv.Outputでは、次の引数を指定することができます。
(必須項目) | |||
---|---|---|---|
引数名 | 型 | 詳細 | |
TargetSheet | Worksheet | CSV出力したいシートのWorksheetオブジェクトを指定する (例)ActiveSheet |
|
Filepath | String | CSV出力先のファイルパスを指定する (例)C:¥test.csv |
|
(任意項目) | |||
引数名 | 型 | 詳細 | 省略時 |
StartRow | Long | CSV出力をしたい先頭「行」を指定します (例)2 |
1行目 |
EndRow | Long | CSV出力をしたい最終「行」を指定します (例)2 |
最終行 |
StartCol | Long | CSV出力をしたい先頭「列」を指定します (例)2 |
1列目 |
EndCol | Long | CSV出力をしたい最終「列」を指定します (例)2 |
最終列 |
WithFormatCols | String | 書式付きで出力したい「列」(※3)を指定します。複数の列を指定したいときは「,」で区切ります。 (例1)"1" → 1列目を書式付きで出力 (例2)"1,3" → 1列目と3列目を書式付きで出力 |
※1 |
WithoutFormatCols | String | 書式付きで出力したくない「列」(※3)を指定します。複数の列を指定したいときは「,」で区切ります。 (例1)"1" → 1列目を書式を無視して出力 (例2)"1,3" → 1列目と3列目を書式を無視して出力 |
※1 |
WithQuoteCols | String | 前後を「引用符」で囲んで出力したい「列」(※3)を指定します。複数の列を指定したいときは「,」で区切ります。 (例1)"1" → 1列目を「引用符」で囲んで出力 (例2)"1,3" → 1列目と3列目を「引用符」で囲んで出力 |
※2 |
WithoutQuoteCols | String | 前後を「引用符」で囲んで出力したくない「列」(※3)を指定します。複数の列を指定したいときは「,」で区切ります。 (例1)"1" → 1列目を「引用符」で囲まずに出力 (例2)"1,3" → 1列目と3列目を「引用符」で囲まずに出力 |
※2 |
Delimitar | String | 区切り文字を指定します (例)vbTab →タブで区切られます |
「,」 |
LineEndingCode | String | 文末の改行コードを指定します (例)vbLF → 改行コードを「LF」にします |
「CR+LF」 |
QuoteChar | String | 「引用符」を指定します (例)"'" → 引用符を「'」にします |
「"」 |
CharReplaceQuote | String | 元々の文字列に「引用符」が出てきたときに、どの文字に置き換えるかを指定します (例)"¥""" → 「"」を「¥"」に置き換えます |
「""」 |
Charset ※Ver0_2で追加 |
String | 出力するCSVファイルの文字コードを指定します (例1)"utf-8" → UTF-8(BOM付き) (例2)"utf-8n" → UTF-8(BOMなし) |
shift_jis |
※1 | WithFormatCols、WithoutFormatColsのどちらも指定されていない列については、書式は適用されません。なお、日付データについては「YYYY/M/D」形式で出力されます。 |
※2 | WithQuoteCols、WithoutQuoteColsのどちらも指定されていない列については、出力データに「区切り文字」「引用符」「改行コード」のいずれかが含まれている場合のみ「引用符」で囲んで出力されます。 |
※3 | これらの引数の「列」は、出力対象となった列の中で「何列目にあたるか」を指定することに注意してください。具体例は詳細な引数を指定する場合をご覧ください |
エクセルブック ダウンロード
下記からダウンロードできます。
→CSVファイル出力マクロ
なお、ご使用は自己責任でお願いいたします。
不具合などがあった場合も、損害について補償は一切できませんので、あらかじめご了承ください。
なお、不具合についてご連絡頂ければ、可能な限り対応いたします。
お問い合わせフォームより、ご連絡ください。
変更履歴
- 2018/6/20 19:35 Ver0_2
-
文字コード指定可能バージョン
- 2018/6/20 20:10 Ver0_3
-
日付データの仕様を変更
- 2018/6/21 8:10 Ver0_4
-
参照設定なしでも動作するよう変更
- 2018/6/22 8:45 Ver0_5
-
(Module1について、すべてのThisworkbookをActiveworkbookに変更
- 2018/9/13 11:19 Ver0_6
-
- 最終行、最終列をUsedRangeを使うだけでなくさらに実際に値が入っているセルを走査するように変更
- CSV出力時の結合回数を減らすために行単位でいったん配列に入れる仕様に変更