【超簡単】ワンタッチでエクセルからCSV出力するVBAプログラム

VBAでCSVファイルを出力するための「汎用CSV出力マクロ」を作りました。

単にCSVファイルを作りたいだけならVBAの知識は不要です。
また、CSVファイルの出力方法を変えたいという場合でも、多くの場合関数の呼び出し時の引数を指定するだけで済むので、とても簡単に使うことができます

このページで公開しているマクロでは、下記のような処理に対応しています。

  • シート全体ではなくシートの一部だけCSV出力したい
  • 一部の列について、表示形式を適用したい(適用したくない)
  • 一部の列について、「"」でデータを囲みたい
  • カンマ区切りではなく「TAB区切り」で出力したい
  • 改行コードを「LF」にしたい
  • CSVファイルの文字コードをUTF-8にしたい

他のホームページで公開されているマクロとは違い、かなり汎用性が高いプログラムだと思いますので、ぜひ、試してみてください。


ダウンロードして、試しに使ってみる

  1. ここからエクセルブックをダウンロードし、手元のPCに保存してください
  2. ダウンロードしたエクセルブックを開きます
  3. Ctrl+Shift+Zを押すと、エクセルブックと「同じフォルダ」に「同じ名前で」CSVファイルが出力されます
  4. 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出力時の結合回数を減らすために行単位でいったん配列に入れる仕様に変更

おすすめ記事

エクセル基礎講座 「無料」動画マニュアル

「経理事務のためのエクセル基礎講座(初級編)」(動画マニュアル 総収録時間162分)を無料プレゼント中です!

このマニュアルで解説していることを一通り学べば、経理事務を行う上で最低限必要となる知識が得られます。

ご登録者の方には、合わせて、公認会計士が実体験を通して身に付けたエクセルを使う技をメールにてお伝えしていきます!

無料動画講座 登録フォーム

※ご登録頂いたメールアドレスに、エクセルを使いこなすための情報を配信するメールセミナー「エクセル倍速講座」も合わせて配信させていただきます。