#Excelシートをcsvファイルに出力する。
・大量のシートを含むExcelファイルを大量にcsvにしなければならない!
...となったときに自動で処理できるVBAのコードを書いてみました。
使用したのはExcel2016です。Office365のExcelでも動作確認済です。
実現する要件は以下のように。
1. フォルダ内のすべての.xlsxファイルについて処理を行う。
2. .xlsxファイル内の全てのシート(非表示シートを含む)を "シート名".csv という名前で出力する。
3. csvの文字コードはUTF-8。
書いてみると以下のようになりました。
Sub exceltoCSVutf8()
Dim myfilepath As String
Dim myfilename As String
myfilepath = ActiveWorkbook.Path
myfilename = Dir(myfilepath & "\" & "*.xlsx")
Do Until myfilename = "" 'フォルダ内のExcelファイルについて処理
Workbooks.Open myfilepath & "\" & myfilename
Dim k As Long
For k = 1 To ActiveWorkbook.Worksheets.Count
Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets(k)
Dim csvfile As String
csvfile = ActiveWorkbook.Path & "\" & ActiveWorkbook.Worksheets(k).Name & ".csv" 'csvファイル名を定義
Dim adoSt As Object 'ADODB.Streamオブジェクトを生成
Set adoSt = CreateObject("ADODB.Stream")
Dim obob As String
Dim i As Long, j As Long
i = 1
With adoSt
.Charset = "UTF-8"
.LineSeparator = adCRLF
.Open
Do While ws.Cells(i, 1).Value <> ""
obob = ""
j = 1
Do While ws.Cells(i, j + 1).Value <> ""
obob = obob & ws.Cells(i, j).Value & ","
j = j + 1
Loop
obob = obob & ws.Cells(i, j).Value
.WriteText obob, adWriteLine
i = i + 1 'ExcelのセルA1から順番に取得、1行目が終わったら2行目へ...
Loop
.SaveToFile csvfile, adSaveCreateOverWrite
.Close
End With
Next
ActiveWorkbook.Close
myfilename = Dir()
Loop
MsgBox "究極のCSVを堪能した"
End Sub
標準の出力機能で出力すると、文字コードがShift-JISで固定となってしまいました。
.Charsetで"UTF-8"を指定すればヨユー!!
...とか思っていたのですが、思わぬ壁にぶち当たりました。(エラーが出て動きません)
この問題は、”ADODB.stream"というオブジェクト使用することで解決しました。
まずADODBオブジェクトにデータを流し込んで、そのあとCSVに出力するという流れです。
##必要な設定##
ADODB.streamを使うためには、Visual Basicの参照設定を調整する必要があります!
Visual basic → ツール → 参照設定 と進み、
Microsoft Active X Data Objects 6.1 Library
をオンにします。この設定をしないと実行できません。
##参考##
この記事を書いている人間はITに疎い初心者です。
同じような境遇の方に共有できることは共有したい!という思いを込めて以下に役に立つ(であろう)ことを書いておきます。
・フォルダ内のExcelファイルすべてに同様の処理をしたいとき
Dim myfilepath As String
Dim myfilename As String
myfilepath = ActiveWorkbook.Path
myfilename = Dir(myfilepath & "\" & "*.xlsx")
Do Until myfilename = "" 'フォルダ内のExcelファイルについて処理
Workbooks.Open myfilepath & "\" & myfilename
'(ここに処理を記述)
Loop
このように書けば、次々とフォルダ内のExcelファイルを取得し、アクティブなブックとして扱ってくれます。
(ほかにも追記予定)
長文になってしまいましたが、何かのご参考になれば幸いです。
ADODB.streamに使用できる機能等は以下のようなページを参照しました。