3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?