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の変換に関しては見通しが良いのではないかと思います。
コメント