LoginSignup
0
2

複数のExcelファイルの全シートをCSVに一括変換する

Last updated at Posted at 2023-02-24

概要

excel2csv.vbsにExcelファイル(.xls*)をドロップすると、ドロップされた全ファイルの全シートがcsvとして保存されます。

  • Windows環境でExcelがインストールされている必要があります。
  • ドロップされたファイルがExcelファイルかどうかの判定はしていません。

ソースコード

ソースコード内のmakeSubFolder visibleOnlyの値によって挙動が変わります。

makeSubFolder 処理内容 例としてsheet1,sheet2シートを含むbook.xlsxの場合
True サブフォルダbook.xlsx_csvを作成しその中に
 sheet1.csv
 sheet2.csv
の名前で保存
False book.xlsxと同じフォルダ内に
 book.xlsx_sheet1.csv
 book.xlsx_sheet2.csv
の名前で保存
visibleOnly 処理内容
True 非表示シートはcsvにしません
False 非表示シート含めてcsvにします
excel2csv.vbs
'vbsファイルにD&DされたすべてのExcelブックの全シートをcsvとして保存する
Option Explicit
On Error Resume Next

'-------------------------------------------------------
'設定
'-------------------------------------------------------
'ここがTrueの場合 :ファイルごとにフォルダを作成してその中にcsvファイルを保存
'ここがFalseの場合:ファイルと同じフォルダにcsvファイルを保存
Dim makeSubFolder
makeSubFolder = False

'ここがTrueの場合 :非表示シートはcsvにしない
'ここがFalseの場合:非表示シート含めてcsvにする
Dim visibleOnly
visibleOnly = False

'-------------------------------------------------------
'main処理
'-------------------------------------------------------
Dim pathadd
If makeSubFolder Then
	pathadd = "_csv\"
Else
	pathadd = "_"
End If

'Excelを使用する
Dim xlApp
Dim xlCSV
Set xlApp = CreateObject("Excel.Application")
xlCSV = 6

'Excelがないと思われる場合は終了
If Err.Number <> 0 Then
	MsgBox "Excel does not exist."
	Set xlApp = Nothing
	WScript.Quit
End If

'ファイルシステムへのアクセス用
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")

'全てのファイルに対して処理
Dim i
For i = 0 to WScript.Arguments.Count - 1
	'Excelブックをcsvに変換する
	ConvertToCsv(WScript.Arguments(i))
Next

'Excelを終了させる
xlApp.Quit

'解放
Set objFSO = Nothing
Set xlApp = Nothing

MsgBox "Completed"

'-------------------------------------------------------
'Excelブックをcsvに変換する
'-------------------------------------------------------
Sub ConvertToCsv(xlBookPath) 'C:\work\book1.xls

	Dim xlBook, xlSheet, xlSheetCount, xlBookExt
	Dim CsvPath

	'拡張子がxls*の場合のみ処理
	xlBookExt = LCase(objFSO.GetExtensionName(xlBookPath)) 'xls
	If Len(xlBookExt) >= 3 And Left(xlBookExt,3) = "xls" Then
		'サブフォルダを作成してその中に保存する場合はフォルダを作成
		If makeSubFolder Then
			If objFSO.FolderExists(xlBookPath & pathadd) Then
				'すでにフォルダがある場合は処理済みとみなす
				Exit Sub
			Else
				'フォルダがない場合は作成
				objFSO.CreateFolder(xlBookPath & pathadd)
			End If
		End If

		'ブックを開く
		Set xlBook = xlApp.Workbooks.Open(xlBookPath)

		'シートの数
		xlSheetCount = xlBook.Worksheets.Count

		'全てのシートに対して処理
		For Each xlSheet In xlBook.Worksheets

			'シートが非表示でない場合 または 非表示関係なく変換する場合
			If xlSheet.Visible = True Or visibleOnly = False Then
				'出力ファイル名作成
				CsvPath = MakeCsvPath(xlBookPath, xlSheet.name, xlSheetCount)

				'シートをcsv保存
				xlSheet.SaveAs CsvPath, xlCSV
			End If
		Next

		'ブックを閉じる
		xlBook.Close False

		'解放
		Set xlBook = Nothing
	End If

End Sub

'-------------------------------------------------------
'出力ファイル名作成
'-------------------------------------------------------
Function MakeCsvPath(filepath ,sheetname, count)

	'C:\work\book1.xls
	'makeSubFolder = False C:\work\book1.xls_sheetname.csv
	'makeSubFolder = True  C:\work\book1.xls_csv\sheetname.csv

	'同一ファイル名がある場合は名前に番号を追加
	Dim j
	For j = 0 To count
		If j = 0 Then
			MakeCsvPath = filepath & pathadd & String2Filename(sheetname) & ".csv"
		Else
			MakeCsvPath = filepath & pathadd & String2Filename(sheetname) & Cstr(j) & ".csv"
		End If
		
		If Not objFSO.FileExists(MakeCsvPath) Then Exit For
	Next

End Function

'-------------------------------------------------------
'シート名をファイル名とするので
'シート名文字列内のファイル名に使えない文字を_に置換
'-------------------------------------------------------
Function String2Filename(str)

	String2Filename = str

	If Instr(String2Filename,"""") > 0 Then
		String2Filename = Replace(String2Filename, """", "_")
	End If

	If Instr(String2Filename,"<") > 0 Then
		String2Filename = Replace(String2Filename, "<", "_")
	End If

	If Instr(String2Filename,">") > 0 Then
		String2Filename = Replace(String2Filename, ">", "_")
	End If

	If Instr(String2Filename,"|") > 0 Then
		String2Filename = Replace(String2Filename, "|", "_")
	End If

End Function

参考文献

CreateObject 関数 (Visual Basic for Applications) | Microsoft Learn
FileSystemObject オブジェクト | Microsoft Learn
Workbooks.Open メソッド (Excel) | Microsoft Learn
Worksheet.SaveAs メソッド (Excel) | Microsoft Learn
Workbook.Close メソッド (Excel) | Microsoft LearnApplication.Quit メソッド (Excel) | Microsoft Learn
VBScript でのエラー処理 | Microsoft Learn
VBScript のエラー処理 - IBM Documentation
VBScript のコード記述規則 | Microsoft Learn

0
2
0

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
0
2