Excelで加工したデータを社内システムや他部署に共有するとき、CSVファイルで保存・書き出す処理は必須です。毎回「名前を付けて保存」から手作業でCSVを選ぶのは面倒ですが、VBAを使えば一瞬で自動化できます。
この記事では「vba csv 保存 書き出す」をテーマに、以下を順を追って解説します。
✅ CSV保存の基本構文(SaveAs)
✅ 文字コード指定(Shift-JIS / UTF-8)の違いと対応方法
✅ ファイル名を自動生成して保存する方法
✅ 複数シートや選択範囲をCSVに書き出す方法
✅ 実務で役立つサンプルコード集
✅ エラー対策・注意点(文字化け・既存ファイル上書きなど)
目次
✅ 基本のCSV保存構文
最もシンプルにCSV保存するには SaveAs メソッドを使います。
Sub SaveCSV()
ThisWorkbook.SaveAs Filename:="C:\Users\UserName\Documents\sample.csv", FileFormat:=xlCSV
End Sub
・ポイント
FileFormat:=xlCSVを指定するとCSV形式で保存されます。- 元のExcelファイルも上書きされるので、マクロ用ブックで使うときはコピー保存を推奨です。
参考:Excel VBAでファイルを効率的に保存:SaveAsメソッドの使い方
✅ 指定シートだけCSVとして保存する
Excelブックには複数のシートがありますが、CSV保存はアクティブシートのみが対象です。
Sub SaveActiveSheetCSV()
Dim ws As Worksheet
Dim filePath As String
filePath = "C:\Users\UserName\Documents\export.csv"
Set ws = ThisWorkbook.Sheets("出力シート")
ws.Copy
ActiveWorkbook.SaveAs Filename:=filePath, FileFormat:=xlCSV
ActiveWorkbook.Close SaveChanges:=False
End Sub
✅ ファイル名を自動生成して保存する
日付や時刻をファイル名に組み込めば、履歴を残す運用が可能です。
Sub SaveCSVWithDate()
Dim filePath As String
filePath = "C:\Users\UserName\Documents\Export_" & Format(Now, "yyyymmdd_HHMMSS") & ".csv"
ActiveSheet.Copy
ActiveWorkbook.SaveAs Filename:=filePath, FileFormat:=xlCSV
ActiveWorkbook.Close SaveChanges:=False
End Sub
これで Export_20250827_153000.csv のような形式で保存されます。
✅ UTF-8形式で保存する方法(文字化け対策)
Excelの標準 SaveAs はShift-JIS保存になるため、システム連携ではUTF-8が必要なことが多いです。
UTF-8で書き出す場合は CreateObject("ADODB.Stream") を利用します。
参考:【Excel】既定の文字コードを変更する方法(上級者向け)|UTF-8対応でCSV文字化けを防ぐ
Sub SaveAsUTF8()
Dim ws As Worksheet
Dim rng As Range
Dim rowData As String
Dim i As Long, j As Long
Dim stream As Object
Set ws = ThisWorkbook.Sheets("出力シート")
Set rng = ws.UsedRange
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2
stream.Charset = "UTF-8"
stream.Open
For i = 1 To rng.Rows.Count
rowData = ""
For j = 1 To rng.Columns.Count
rowData = rowData & rng.Cells(i, j).Value
If j < rng.Columns.Count Then rowData = rowData & ","
Next j
stream.WriteText rowData & vbCrLf
Next i
stream.SaveToFile "C:\Users\UserName\Documents\utf8.csv", 2
stream.Close
End Sub
✅ 選択範囲だけCSVに出力する
データの一部だけを書き出したい場合もよくあります。
Sub ExportSelectionToCSV()
Dim rng As Range
Dim stream As Object
Dim r As Range, c As Range
Dim lineData As String
Set rng = Selection
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2
stream.Charset = "Shift-JIS"
stream.Open
For Each r In rng.Rows
lineData = ""
For Each c In r.Cells
lineData = lineData & c.Value & ","
Next c
lineData = Left(lineData, Len(lineData) - 1)
stream.WriteText lineData & vbCrLf
Next
stream.SaveToFile "C:\Users\UserName\Documents\selection.csv", 2
stream.Close
End Sub
✅ 複数シートを個別CSVに書き出す
業務では「各シートを別CSVに保存する」ケースも多いです。
Sub ExportSheetsToCSV()
Dim ws As Worksheet
Dim filePath As String
For Each ws In ThisWorkbook.Sheets
ws.Copy
filePath = "C:\Users\UserName\Documents\" & ws.Name & ".csv"
ActiveWorkbook.SaveAs Filename:=filePath, FileFormat:=xlCSV
ActiveWorkbook.Close SaveChanges:=False
Next ws
End Sub
✅ エラー対策と注意点
- 既存ファイル上書き
→ 上書き防止したい場合はDir(filePath)で存在確認してから保存。
参考:【VBA】ファイルを読み取り専用で開く方法|上書き防止に便利なテクニック - 文字化け問題
→ 標準のCSVはShift-JIS。システム要件に応じてUTF-8書き出しを実装。 - 改行やカンマを含むデータ
→ ダブルクォーテーションで囲む処理を追加する必要あり。 - 閉じ忘れ防止
→ActiveWorkbook.Close SaveChanges:=Falseを適切に入れる。
■ まとめ
ExcelVBAでCSVを書き出す方法は大きく分けて3種類です。
- 標準のSaveAs(Shift-JIS)
- ADODB.Streamを使ったUTF-8対応
- 選択範囲・複数シート対応のカスタム処理
実務では「日本語の文字コード」「ファイル名自動生成」「範囲指定」などが組み合わさるケースが多いため、上記のサンプルを組み合わせて使うのが効果的です。
CSVの保存を自動化できれば、日次・週次のレポート作成やシステム連携作業が大幅に効率化できます。