VBAサンプル集
CSVの出力(書き出し)方法

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2020-07-02

CSVの出力(書き出し)方法


シート内容をCSV出力(書き出し)する方法です。


CSVの読込は、
VBAでのCSVの扱い方まとめ
マクロVBAでCSVの読み書きする方法はいくつもあり、当サイトでも複数のページでそれぞれVBAコードを掲載しています。順次記事を掲載しているので、それぞれどのような特徴があるかが良く分からなくなってしまっているようです。そこで、CSVに関するページをまとめておきました。
こちらを参照して下さい。

以下では、2通りの方法を紹介します。

エクセルの機能をそのまま利用します

Sub CSV出力(ByVal sht As Worksheet, Optional ByVal rngStart As Range = Nothing)
  Dim varFile As Variant
  
  varFile = Application.GetSaveAsFilename(InitialFileName:=sht.Name & ".csv", _
                      FileFilter:="CSVファイル(*.csv),*.csv", _
                      FilterIndex:=1, _
                      Title:="保存ファイルの指定")
  If varFile = False Then
    Exit Sub
  End If
    
  sht.Select
  sht.Copy
  


  '不要な先頭の行列を削除します。
  If Not rngStart Is Nothing Then
    If rngStart.Row > 1 Then
      Range(Rows(1), Rows(rngStart.Row - 1)).Delete
    End If
    If rngStart.Column > 1 Then
      Range(Columns(1), Columns(rngStart.Column - 1)).Delete
    End If
  End If
  
  ActiveWorkbook.SaveAs Filename:=varFile, FileFormat:=xlCSV, CreateBackup:=False
  ActiveWindow.Close
  
  MsgBox ("CSV出力しました。" & vbLf & vbLf & varFile)
End Sub


※csv出力時日付がm/d/yyyyになってしまう場合の対処
日付がm/d/yyyyになってしまう場合に、yyyy/m/dにする場合には、
SaveAsの引数に、Local:=Trueを追加
表示形式は「*2012/3/14」のような*付き以外書式を選択
 「*2012/3/14」になっているとm/d/yyyyになってしまいます。
引数で、ワークシートと開始セルを指定できるようにしています。
これにより、どのシートからも使えるようになります。

Application.GetSaveAsFilename

保存ファイルを選択するダイアログを表示します。
シート名+「.csv」を初期のファイル名にしています。
拡張子は、csvのみ指定しています。
開始セルより上の行、左の列は削除して、CSVに出力されないようにしています。
処理の流れは、

保存ファイルの選択

シートの新規ブックへのコピー

不要な行列の削除

名前を付けて保存

これは簡単です。

しかし、これでは、いろいろ不都合な場合があります。
他システム、特にDB等へアップロードする場合には、このままでは出来ない事があるのです。
例えば、日付は、表示形式のままの文字列で出力されてしまいます。
また数値もカンマ付の場合は、"12,345"のように、文字列として出力されます。
CSV出力前に、当該シートの書式を全て直してから行えばよいのですが、
書式の変更も面倒なら、また元に戻す必要があり、何かと不都合です。

このような場合は、直接CSVを出力するようにします。

直接CSVを出力

Sub CSV出力(ByVal sht As Worksheet, Optional ByVal rngStart As Range = Nothing)
  Dim varFile As Variant
  Dim FSO As New FileSystemObject
  Dim TS As TextStream
  Dim lngRowMin As Long, lngRowMax As Long
  Dim lngColMin As Long, lngColMax As Long
  Dim i As Long

  
  varFile = Application.GetSaveAsFilename(InitialFileName:=sht.Name & ".csv", _
                      FileFilter:="CSVファイル(*.csv),*.csv", _
                      FilterIndex:=1, _
                      Title:="保存ファイルの指定")
  If varFile = False Then
    Exit Sub
  End If
    
  '開始行列、終了行列を取得
  If rngStart Is Nothing Then
    lngRowMin = 1
    lngColMin = 1
  Else
    lngRowMin = rngStart.Row
    lngColMin = rngStart.Column
  End If
  lngRowMax = 最終行取得(sht)
  lngColMax = 最終列取得(sht)
  
  Set TS = FSO.CreateTextFile(Filename:=varFile, Overwrite:=True)
  
  For i = lngRowMin To lngRowMax
    TS.WriteLine CSV_EditRec(sht, i, lngColMin, lngColMax)
  Next
  
  TS.Close
  Set TS = Nothing
  Set FSO = Nothing

  MsgBox ("CSV出力しました。" & vbLf & vbLf & varFile)
End Sub

Private Function CSV_EditRec(ByVal sht As Worksheet, _
                i As Long, _
                lngColMin As Long, _
                lngColMax As Long) As String
  Dim strRec As String
  Dim strCol As String
  Dim j As Long

  strRec = ""
  For j = lngColMin To lngColMax
    Select Case True
      Case IsNumeric(sht.Cells(i, j))
        strCol = CStr(CDbl(sht.Cells(i, j)))
      Case IsDate(sht.Cells(i, j))
        If InStr(sht.Cells(i, j), "-") Then
          strCol = sht.Cells(i, j)
        Else
          strCol = Format(sht.Cells(i, j), "yyyy/mm/dd")
        End If
      Case InStr(sht.Cells(i, j), ","), InStr(sht.Cells(i, j), """")
        strCol = """" & sht.Cells(i, j) & """"
      Case Else
        strCol = sht.Cells(i, j)
    End Select
    If strRec = "" Then
      strRec = strCol
    Else
      strRec = strRec & "," & strCol
    End If
  Next
  CSV_EditRec = strRec
End Function

Function 最終行取得(ByVal sht As Worksheet) As Long
  Dim ary As Variant
  Dim i As Long, j As Long
  ary = sht.Range(sht.Cells(1, 1), sht.Cells.SpecialCells(xlLastCell))
  Do
    For i = UBound(ary, 1) To LBound(ary, 1) Step -1
      j = 1
      For j = LBound(ary, 2) To UBound(ary, 2)
        If ary(i, j) <> "" Then
          最終行取得 = i
          Exit Function
        End If
      Next j
    Next i
  Loop
End Function

Function 最終列取得(ByVal sht As Worksheet) As Long
  Dim ary As Variant
  Dim i As Long, j As Long
  ary = sht.Range(sht.Cells(1, 1), sht.Cells.SpecialCells(xlLastCell))
  Do
    For i = UBound(ary, 2) To LBound(ary, 2) Step -1
      j = 1
      For j = LBound(ary, 1) To UBound(ary, 1)
        If ary(j, i) <> "" Then
          最終列取得 = i
          Exit Function
        End If
      Next j
    Next i
  Loop
End Function

かなり長いですが、
「最終行取得」、「最終列取得」は以前に作成済のモジュールです。
行列がでこぼこに入力されている場合でも、正しく最終判定をする為に使用しています。
通常の一覧なら、End(xlUp)等の以下の方法で和いものです。
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
エクセルの表をVBAで扱う時は、データ部分の先頭から最終行までの、開始列から最終列まで処理する事が多いでしょう。開始行や開始列は、ほとんどの場合、見出し行や見出し列の次からになります。単純な話として、1行目に見出しがあれば、2行目から 1列目に見出しがあれば、2列目から では、ここで、最終行や最終列は、

FileSystemObjectを使用していますが、昔からある、
Open ファイル For Output As #1
こちらでも良いです。
処理内容は単純です。
要は、

Function CSV_EditRec

この内容だけでしょう。
セルの値を判定し、データ内容によって、編集処理を分けています。
ここでは、数値、日付、「"」や「,」を含む文字列、その他、の4通りです。

日付の場合は、「-」の入った電話番号が日付判定される場合があるので、除外しています。
「CSV_EditRec」での編集は、CSVの使い道により、変更を加える必要があります。
例えば、日付は、「#2011/05/17#」のようにする必要がある場合もでてくるでしょう。

いずれにせよ、上記モジュールはかなり汎用的に作成してありますので、
コピペで、いろいろ使い回しが可能です。

本サイトにあるCSV関連記事一覧

VBAでのCSVの扱い方まとめ
マクロVBAでCSVの読み書きする方法はいくつもあり、当サイトでも複数のページでそれぞれVBAコードを掲載しています。順次記事を掲載しているので、それぞれどのような特徴があるかが良く分からなくなってしまっているようです。そこで、CSVに関するページをまとめておきました。
CSVの読込方法
エクセルのVBAでのCSVの読込方法としては。・テキストファイルとして読み込む ・ワークブックとして読み込む ・クエリーテーブルを使う ・ADOを使う ・PowerQueryを使う 大別するとこのようになります。この記事を書いた当初は、エクセルのVBAでCSVの読み込みについてネットで検索したところ、
CSVの読み込み方法(改)
実施したいこと ・ファイル名を指定し、形式をカンマ区切り、文字列で開く、その際、改行コードLF、CRLF、CRいずれにも対応、セル内の","や改行についてはカラムで区切らない。掲示板で上記のリクエストを頂きました。ということで、対応ロジックを書いてみました。
CSVの読み込み方法(改の改)
CSVのVBAでの読込方法については複数の記事を掲載しており、人気記事として多くのアクセスがあります。掲載しているVBAコードは汎用的に書いてあり、ほぼそのまま使用できるものです。しかし、CSVは多くの形式(区切り文字、文字コード等)があり、今まで掲載したコードでは解決出来ないものがあります。
CSVの読み込み方法(ジャグ配列)
CSVのマクロVBAでの読込方法についての記事は、人気記事として多くのアクセスがあります。当初作成して以来、ご要望をいただいたり自身で使っている中で、対応できないCSVが出てくるたびに改良を重ねています。今回のVBAは、一旦ジャグ配列を使用したCSV読み込み方法になります。
CSVの読み込み方法(ジャグ配列)(改)
CSVのマクロVBAでの読込方法についての記事は、人気記事として多くのアクセスがあります。順次改定していくつかのバージョンが存在します。最新のジャグ配列(配列の配列)で読み込むVBAについて、UTF-8Nの文字コード判別の課題が残っていました。
CSVの出力(書き出し)方法
シート内容をCSV出力(書き出し)する方法です。CSVの読込は、VBAでのCSVの扱い方まとめ こちらを参照して下さい。以下では、2通りの方法を紹介します。エクセルの機能をそのまま利用します ※csv出力時日付がm/d/yyyyになってしまう場合の対処 日付がm/d/yyyyになってしまう場合に、yyyy/m/dにする場合には、
UTF-8でCSVの読み書き(ADODB.Stream)
VBAでUTF-8を扱う為には、ADODB.Streamを使う必要があります。以下のコードを使用するには、参照設定で、「MicrosoftActiveXDataObjects2.8Library」にチェックを付けて下さい。または、DimadoStAsNewADODB.Stream ここを DimadoStAsObject SetadoSt=CreateO…
ADOでCSVの読み込み(SQL)
VBAでADOを使用し、CSVデータを読み込みます。ADOではSQL文が必要になりますが、ここではSQL文の詳細については説明を省略します。ADO以外の方法については、「CSVの読み込み方法」を参考にして下さい。

※ほとんどの記事でUTF-8に対応しています。



同じテーマ「マクロVBAサンプル集」の記事

VBAでのCSVの扱い方まとめ
CSVの読み込み方法
CSVの読み込み方法(改)
CSVの読み込み方法(改の改)
CSVの読み込み方法(ジャグ配列)
CSVの読み込み方法(ジャグ配列)(改)
CSVの出力(書き出し)方法
UTF-8でCSVの読み書き(ADODB.Stream)
ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)


新着記事NEW ・・・新着記事一覧を見る

import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)
入力規則への貼り付けを禁止する|VBA技術解説(9月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ