LoginSignup
3
3

More than 5 years have passed since last update.

Excelファイルをまとめてcsvに変換したい!

Last updated at Posted at 2019-04-02

Excelシートをcsvファイルに出力する。

・大量のシートを含むExcelファイルを大量にcsvにしなければならない!
 
...となったときに自動で処理できるVBAのコードを書いてみました。:relaxed:

使用したのは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に使用できる機能等は以下のようなページを参照しました。

3
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3