CSVファイルに出力

ファイル

CSVファイルに出力

 最も簡単なのは、拡張子をCSVにして保存する事です。
この方法では、現在のブックのアクティブシートをCSVファイルとして保存します。
名前を変更して保存しているので、大元のExcelファイルは残る事になります。

Sub OutputCSVTest01()
    Dim myPath As String
    
    myPath = ThisWorkbook.Path
    
    ThisWorkbook.SaveAs myPath & "\test.csv", FileFormat:=xlCSV
    ThisWorkbook.Close
      
End Sub

 CSVファイルへの出力というよりは、CSVファイルで保存している格好なので不便な点もいくつかあります。これらに対処していきましょう。

1:自身が書き換わるため更新が反映されない

 SaveAsを使うので、現在の.xlsmファイル自身がCSVファイルになってしまいます。
 それまでの.xlsmファイルでの更新があっても反映されないことになります。
 解決策としては、一旦自身を.xlsmの状態で保存し、その後CSVファイルで保存すれば良いでしょう。
 また、元の.xlsmを開いておきたいのであれば、元のファイル名を保持しておき再度SaveAsで上書きすれば良いでしょう。
 この時アラートが出ますので、Application.DisplayAlerts = False で出ないようにします。

Sub OutputCSVTest02()
    Dim myPath As String
    Dim myBookName As String
    
    myPath = ThisWorkbook.Path
    myBookName = ThisWorkbook.Name
    
    Application.DisplayAlerts = False
    
    ThisWorkbook.SaveAs myPath & "\test.csv", FileFormat:=xlCSV
    ThisWorkbook.SaveAs myPath & "\" & myBookName, _ 
                     FileFormat:=xlOpenXMLWorkbookMacroEnabled

    Application.DisplayAlerts = True
End Sub

2:アクティブなシートしかCSVファイルにならない

 これは仕様なので仕方がないのですが、CSVファイルにしたいシートをアクティブにしてから保存すれば済みます。
 また、複数のCSVファイルを出力したい場合は前述の方法でClose、Openを繰り返すことでそれらしく振舞うことができます。

Sub OutputCSVTest03()

    Dim myPath As String
    Dim myBookName As String
    
    myPath = ThisWorkbook.Path
    myBookName = ThisWorkbook.Name
    
    Worksheets("Sheet1").Select
    
    Application.DisplayAlerts = False
    
    ThisWorkbook.SaveAs myPath & "\test.csv", FileFormat:=xlCSV
    ThisWorkbook.SaveAs myPath & "\" & myBookName, _ 
                      FileFormat:=xlOpenXMLWorkbookMacroEnabled

    Application.DisplayAlerts = True
      
End Sub

3:必要な範囲指定ができない

 前述の通り、アクティブなシートしかCSV出力できませんので、新しいシートにデータをコピーしそれを出力対象とすればOKでしょう。

Sub OutputCSVTest04()

    Dim myPath As String
    Dim myBookName As String
    
    myPath = ThisWorkbook.Path
    myBookName = ThisWorkbook.Name
    
    '新しいシートを最後に追加
    Worksheets.Add after:=Worksheets(Worksheets.Count)
    
    '必要な領域を新しいシートにコピー
    Worksheets("Sheet1").Range("A1:E5").Copy _
        Destination:=Worksheets(Worksheets.Count).Range("A1")
    
    '新しいシートを選択してCSVファイルの対象に
    Worksheets(Worksheets.Count).Select
    
    'アラートをOFF
    Application.DisplayAlerts = False
    
    'CSVファイルで上書き
    ThisWorkbook.SaveAs myPath & "\test.csv", FileFormat:=xlCSV
    
    '新しいシートを削除
    Worksheets(Worksheets.Count).Delete
    
    '元の名前で上書き
    ThisWorkbook.SaveAs myPath & "\" & myBookName, _
                    FileFormat:=xlOpenXMLWorkbookMacroEnabled

    'アラートを戻す
    Application.DisplayAlerts = True
      
End Sub

4:日付型、数値の桁区切りカンマ

 表示による不具合は、個別に対処する必要があるでしょう。新しいシートにデータをコピーする際に書式変換することで解決できるでしょう。

Sub OutputCSVTest05()

    Dim myPath As String
    Dim myBookName As String
    
    myPath = ThisWorkbook.Path
    myBookName = ThisWorkbook.Name
    
    Worksheets.Add after:=Worksheets(Worksheets.Count)
    
    '必要な領域を新しいシートにコピー
    With Worksheets("Sheet1")
    
    Dim i As Long, j As Long
    For i = 1 To 5
        For j = 1 To 6
            If i = 1 Or i = 3 Or i = 4 Then
                Worksheets(Worksheets.Count).Cells(j, i) = .Cells(j, i)
            ElseIf i = 2 Then
                Worksheets(Worksheets.Count).Cells(j, i) _ 
                                  = Format(.Cells(j, i), "'yyyy/mm/dd")
            ElseIf i = 5 Then
                Worksheets(Worksheets.Count).Cells(j, i) = .Cells(j, i) & "様"
            End If
        Next j
    Next i
    
    End With
    
    Worksheets(Worksheets.Count).Select
    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs myPath & "\test.csv", FileFormat:=xlCSV
    Worksheets(Worksheets.Count).Delete
    ThisWorkbook.SaveAs myPath & "\" & myBookName, _ 
                        FileFormat:=xlOpenXMLWorkbookMacroEnabled
    Application.DisplayAlerts = True
      
End Sub

日付型

日付の変換に関しては、Format関数の所で、”‘yyyy/mm/dd” と指定しています。少々わかりずらいかもしれませんが、’(アポストロフィ)を付けて強制的にセル内で文字列にしています。これをしないと、2022/12/10 などとはならず、12/10/2022 という表示になってしまいます。
 それを防ぐために一旦文字列の形でCSVファイルに出力します。Excelで開いた時には、自動変換されてちゃんと日付型になります。

数値の桁区切り

 桁区切りされた数値では、そのままですと文字列として出力されます。新しいシートにコピーする際に標準の数値としてコピーしています。また、金額なども単純な数値として出力した方が扱いやすくなると思います。

文字列加工

 文字列に関してはコピーの際、加工する事も可能です。今回は名前の後に”様”を付けました。

最後に

 今回はSaveAsを使った方法でゴリ押してみました。少々トリッキーな方法ですが、CSVの変換に関しては見通しが良いのではないかと思います。

コメント

タイトルとURLをコピーしました