CSVで保存
「シートや範囲をCSVに出力したい」を最短で。先頭ゼロ、日付変換、文字コード、カンマや改行の扱いまで、初心者向けに安全テンプレートで整理します。
基本:アクティブシートをCSVで保存(最短)
Sub SaveCsv_Basic()
Application.DisplayAlerts = False '上書き確認を抑止
ActiveWorkbook.SaveAs _
Filename:="C:\Data\export.csv", _
FileFormat:=xlCSV 'Shift-JISのCSV(Windows標準)
Application.DisplayAlerts = True
End Sub
VB- ポイント:
- FileFormat指定: 一番手軽。アクティブシートのみがCSV化されます(他のシートは無視)。
- 上書き確認: 業務で自動保存するなら DisplayAlerts を一時的に False に。
UTF-8で保存(日本語の文字化け対策)
Sub SaveCsv_UTF8()
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs _
Filename:="C:\Data\export_utf8.csv", _
FileFormat:=xlCSVUTF8 'UTF-8のCSV(新しめのExcelで利用可)
Application.DisplayAlerts = True
End Sub
VB- ポイント:
- UTF-8: システムやWeb連携で求められることが多い。環境によっては xlCSVUTF8 が使えない場合があるため、その際は下記の「自前書き出し」を使用。
範囲だけをCSVに出力(自前で安全書き出し)
Sub SaveCsv_RangeToFile()
Dim rg As Range
Set rg = Range("A1").CurrentRegion '出力範囲(必要に応じて明示指定に変更)
Dim fn As Integer, path As String
path = ThisWorkbook.Path & "\export_range.csv"
fn = FreeFile
Open path For Output As #fn 'テキスト書き出し(Shift-JIS)
Dim r As Long, c As Long
For r = 1 To rg.Rows.Count
Dim line As String: line = ""
For c = 1 To rg.Columns.Count
Dim s As String: s = CStr(rg.Cells(r, c).Value)
'ダブルクォートと改行・カンマ対策:RFC風にトークンをクォート
s = Replace(s, """", """""")
If InStr(s, ",") > 0 Or InStr(s, vbCr) > 0 Or InStr(s, vbLf) > 0 Then
s = """" & s & """"
End If
If c > 1 Then line = line & ","
line = line & s
Next c
Print #fn, line
Next r
Close #fn
End Sub
VB- ポイント:
- 安全なCSV: カンマ・改行・ダブルクォートを正しくエスケープ。
- 範囲限定: 必要なセルだけ出力でき、シート構造に依存しない。
UTF-8で自前書き出し(ADODB.Stream)
Sub SaveCsv_UTF8_Stream()
Dim rg As Range: Set rg = Range("A1").CurrentRegion
'CSV文字列を組み立て
Dim r As Long, c As Long, sb As String
For r = 1 To rg.Rows.Count
Dim parts() As String
ReDim parts(1 To rg.Columns.Count)
For c = 1 To rg.Columns.Count
Dim s As String: s = CStr(rg.Cells(r, c).Value)
s = Replace(s, """", """""")
If InStr(s, ",") > 0 Or InStr(s, vbCr) > 0 Or InStr(s, vbLf) > 0 Then
s = """" & s & """"
End If
parts(c) = s
Next
sb = sb & Join(parts, ",") & vbCrLf
Next
'UTF-8で書き出し(BOMなし)
Dim st As Object: Set st = CreateObject("ADODB.Stream")
st.Type = 2 'adTypeText
st.Charset = "UTF-8"
st.Open
st.WriteText sb
st.SaveToFile ThisWorkbook.Path & "\export_utf8.csv", 2 'adSaveCreateOverWrite
st.Close
End Sub
VB- ポイント:
- 文字コード指定: UTF-8で確実に保存。BOMが必要なら、先にバイナリで BOM を書いてからテキスト追記する方法もあります。
複数シートをそれぞれCSVで保存(業務定番)
Sub SaveCsv_MultiSheets()
Dim sh As Worksheet
Application.DisplayAlerts = False
For Each sh In ThisWorkbook.Worksheets
sh.Copy 'シートを新規ブックへ
With ActiveWorkbook
.SaveAs _
Filename:=ThisWorkbook.Path & "\" & sh.Name & ".csv", _
FileFormat:=xlCSV
.Close SaveChanges:=False '都度閉じる
End With
Next
Application.DisplayAlerts = True
End Sub
VB- ポイント:
- 1シートずつ: CSVは「シート単位」。コピー→保存→閉じるの流れが安定。
- 名前衝突対策: シート名に不正文字がある場合はファイル名を調整。
区切り文字を変えたい(セミコロンなど)
Sub SaveCsv_Semicolon()
Dim rg As Range: Set rg = Range("A1").CurrentRegion
Dim fn As Integer: fn = FreeFile
Open ThisWorkbook.Path & "\export_semicolon.csv" For Output As #fn
Dim r As Long, c As Long, line As String
For r = 1 To rg.Rows.Count
line = ""
For c = 1 To rg.Columns.Count
Dim s As String: s = CStr(rg.Cells(r, c).Value)
s = Replace(s, """", """""")
If InStr(s, ";") > 0 Or InStr(s, vbCr) > 0 Or InStr(s, vbLf) > 0 Then
s = """" & s & """"
End If
If c > 1 Then line = line & ";"
line = line & s
Next
Print #fn, line
Next
Close #fn
End Sub
VB- ポイント:
- ロケール依存回避: 受け側システムがセミコロン区切りを要求する場合に。
例題で練習
'例題1:相対パスに「当日名」でUTF-8保存
Sub Example_SaveToday_UTF8()
Dim fname As String
fname = ThisWorkbook.Path & "\out_" & Format(Date, "yyyymmdd") & ".csv"
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSVUTF8
Application.DisplayAlerts = True
End Sub
'例題2:選択範囲だけを厳密CSV(カンマ・改行・クォート対応)
Sub Example_SaveSelection_CSV()
If TypeName(Selection) <> "Range" Then Exit Sub
Dim rg As Range: Set rg = Selection
Dim fn As Integer: fn = FreeFile
Open ThisWorkbook.Path & "\selection.csv" For Output As #fn
Dim r As Long, c As Long
For r = 1 To rg.Rows.Count
Dim parts() As String
ReDim parts(1 To rg.Columns.Count)
For c = 1 To rg.Columns.Count
Dim s As String: s = CStr(rg.Cells(r, c).Value)
s = Replace(s, """", """""")
If InStr(s, ",") > 0 Or InStr(s, vbCr) > 0 Or InStr(s, vbLf) > 0 Then s = """" & s & """"
parts(c) = s
Next
Print #fn, Join(parts, ",")
Next
Close #fn
End Sub
'例題3:複数シートを個別CSV(シート名で保存)
Sub Example_SaveEachSheet()
Dim w As Worksheet
Application.DisplayAlerts = False
For Each w In ThisWorkbook.Worksheets
w.Copy
ActiveWorkbook.SaveAs _
Filename:=ThisWorkbook.Path & "\" & w.Name & ".csv", _
FileFormat:=xlCSV
ActiveWorkbook.Close False
Next
Application.DisplayAlerts = True
End Sub
VB実務の落とし穴と対策
- 先頭ゼロと日付変換:
- 対策: 取り込み側で「文字列扱い」にするか、出力前に必要な列を文字列化(例:=”00123″ 形式)を検討。
- 文字コードのズレ:
- 対策: 受け側がUTF-8なら xlCSVUTF8(非対応環境はADODB.StreamでUTF-8書き出し)。Windows系レガシーなら xlCSV(Shift-JIS)。
- 改行・カンマ・ダブルクォート:
- 対策: フィールド内にそれらが含まれる場合は、ダブルクォートで囲み、内部のダブルクォートは2つにエスケープ。
- 複数シートの扱い:
- 対策: CSVは1シートのみ。複数は「コピー→保存→閉じる」をループ。
- 保存確認ダイアログ:
- 対策: 自動化では DisplayAlerts を一時的に False。終了時に必ず True に戻す。
- ファイル名の禁止文字:
- 対策: /:*?”<>| をファイル名から除去してから保存。
