← コード一覧へ戻る
実務ファイル

元ブックを保って指定シートをUTF-8 CSVへ保存する

指定シートを一時ブックへコピーし、xlCSVUTF8で別のCSVへ保存します。保存先の選択、キャンセル、同名ファイルでの停止を図と表で確認できます。

実行前に確認

  • xlCSVUTF8に対応するWindows版デスクトップExcel向けです。Web版ではVBAを実行できません。Excel実機での実行は未検証です。まず機密情報のない値だけの練習表で試してください。
  • 出力用シートは表示状態で用意します。CSVには書式・図・複数シート・マクロは保存されません。通常は数式の計算結果が出力されますが、数式表示モードなどでも内容が変わるため、この例は値だけの表で試します。元ブックを保存・閉じる処理はありません。
  • 既存名の確認と保存は同時ではありません。他の処理が同名ファイルを作り、上書きの警告が出たら必ずキャンセルしてください。警告は無効にしません。共有フォルダーの同時実行には使わないでください。
  • Local:=Trueのため区切り文字や日付・数値の表現は環境の影響を受けます。受取側が要求する区切り文字・BOMの有無・先頭ゼロの扱いは出力後に確認してください。カンマ区切りやBOMなしを保証する例ではありません。
  • シートのイベントコードもコピーされ得るため、コピー・保存中だけイベントを止め、元の設定へ戻します。エラー時は一時ブックを閉じる処理を試みます。Excel自体の強制終了や後処理の失敗では、一時ブックやファイルが残る場合があります。

1サンプルコード

Option Explicit

Sub ExportSheetUtf8Csv()
    Dim sourceSheet As Worksheet, exportBook As Workbook
    Dim fileSystem As Object, selectedPath As Variant, outputPath As String
    Dim oldEvents As Boolean, settingsChanged As Boolean
    Dim errorText As String, saved As Boolean

    On Error GoTo Failed
    If Not Application.DisplayAlerts Then
        MsgBox "警告が無効になっています。他の処理を終えてから試してください。"
        Exit Sub
    End If
    Set sourceSheet = ThisWorkbook.Worksheets("出力用")
    selectedPath = Application.GetSaveAsFilename( _
        InitialFileName:="export_utf8.csv", _
        FileFilter:="CSV (*.csv),*.csv", Title:="新しいCSVの保存先")
    If VarType(selectedPath) = vbBoolean Then Exit Sub
    outputPath = CStr(selectedPath)
    If LCase$(Right$(outputPath, 4)) <> ".csv" Then
        MsgBox "拡張子を.csvにしてください。": Exit Sub
    End If
    Set fileSystem = CreateObject("Scripting.FileSystemObject")
    If fileSystem.FileExists(outputPath) Or fileSystem.FolderExists(outputPath) Then
        MsgBox "同じ名前が既にあります。別の名前を選んでください。"
        Exit Sub
    End If

    oldEvents = Application.EnableEvents
    settingsChanged = True
    Application.EnableEvents = False
    sourceSheet.Copy
    Set exportBook = ActiveWorkbook
    'コピーした1枚だけを保存。元ブックにはSaveAsしません。
    exportBook.SaveAs Filename:=outputPath, FileFormat:=xlCSVUTF8, Local:=True
    saved = True
    exportBook.Close SaveChanges:=False
    Set exportBook = Nothing
    Application.EnableEvents = oldEvents
    settingsChanged = False
    MsgBox "CSVを保存しました。内容を確認してください: " & outputPath
    Exit Sub

Failed:
    errorText = Err.Description
    On Error Resume Next
    If Not exportBook Is Nothing Then exportBook.Close SaveChanges:=False
    If settingsChanged Then Application.EnableEvents = oldEvents
    On Error GoTo 0
    If saved Then
        MsgBox "CSV保存後の後処理で停止しました: " & errorText & vbCrLf & _
            "保存先と、残った一時ブックを確認してください。", vbExclamation
    Else
        MsgBox "保存を完了できませんでした: " & errorText & vbCrLf & _
            "再実行前に保存先と、残った一時ブックを確認してください。", vbExclamation
    End If
End Sub
表で見る処理のイメージ実行前・実行後のセルを見比べる

入力する表と、保存成功後も変わらない元シートです。別ファイルに出る内容は下の図で確認します。

A・B・Cは列、1・2・3は行です。例えば「B2」はB列の2行目のセルです。この表は説明用のサンプルです。

実行前

元の.xlsm:出力用シート

実行前のサンプル。列記号と行番号でセルの位置を確認できます。
AB
1商品名数量
2りんご2
3みかん3

実行後

元の.xlsm:セルはそのまま

実行後のサンプル。列記号と行番号でセルの位置を確認できます。
AB
1商品名数量
2りんご2
3みかん3

色付きは注目する場所です。「—」は未入力、「(空文字)」は数式などが返す空の文字列を表します。

説明用サンプルです。元の表をCSV形式へ置き換える操作ではありません。CSVは別のファイルとして保存します。

図で見る1枚だけを別のCSVにする流れ

イメージ図

概念図:元ブックを残し、コピーした一時ブックだけを保存します。

  1. 元の.xlsm

    出力用シート 商品名|数量 りんご|2 みかん|3 ほかのシートも元のまま

  2. 保存先の分岐

    キャンセル・同名あり → 終了 新しい.csvの名前 → 次へ

  3. 一時ブック

    出力用の1枚だけコピー SaveAsでUTF-8 CSVへ保存 一時ブックだけ閉じる

  4. 別ファイルができる

    export_utf8.csv 商品名,数量 りんご,2 みかん,3

右端はカンマ区切り環境での内容例です。Local:=Trueでは区切り文字などが環境により変わります。CSVは文字のファイルで、セルの色や罫線は含みません。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する7つの手順で、コードの使い方を確認できます
  1. 1

    Windows版デスクトップExcelで練習用の.xlsmを作り、シート名を「出力用」にします。A1:B3へ下の表と同じ商品名・数量を入力します。この例は値だけの表で練習します。

  2. 2

    Alt+F11→[挿入]→[標準モジュール]へコード全体を貼り付けます。ThisWorkbookはこのコードを入れたブックです。PERSONAL.XLSBに入れると対象が変わるので、練習用.xlsmへ入れてください。

  3. 3

    ExportSheetUtf8Csvを実行し、最初は保存先ダイアログでキャンセルします。一時ブックもCSVも作らず終了する分岐です。シート名が違う場合は保存先選択前にエラーになります。

  4. 4

    再度実行し、書き込み可能な練習用フォルダーで、まだ存在しないexport_utf8.csvを選びます。同じ名前のファイル・フォルダーがあれば停止します。拡張子が.csvでなければ停止します。

  5. 5

    Worksheet.CopyのBefore・Afterを省略すると1枚だけの新規ブックができます。直後にActiveWorkbookをexportBookへ保持し、そのブックだけをSaveAsします。保存後は一時ブックだけを閉じます。

  6. 6

    CSVをテキストエディターでUTF-8として開き、商品名・数量と2件のデータを確認します。元の.xlsmの名前・形式・シート数が変わっていないことも別々に確認します。CSVをExcelで再読込する場合は関連記事を参照してください。

  7. 7

    同名CSVを選んで再実行し、停止メッセージと元のCSVが変わっていないことを確認します。保存失敗・キャンセルを成功と扱わず、再実行前に出力先を確認します。失敗後のCSVは自動削除しません。

使っている機能の公式ドキュメント(Microsoft Learn)