【VBScript】WordをExcelに一括変換する
WordをExcelに変換するには一旦HTML形式に変換保存後、HTMLファイルをExcelで保存します。 非常に手間がかかるので多量のファイルを変換するのは大変です。 ネット上にはWordからHTML、ExcelからHTMLはよく見つかりますが、WordからExcelがなかったので 作りました。
'------------------------------------------------------------------------------------------------------------------ Option Explicit 'IE の宣言と初期化 Dim ie initializeIe() updateMsg "処理を開始します..." '--------------------------------------------------------------------------------------------------- 'ドラッグ&ドロップされたフォルダの処理 Dim Args Set Args = WScript.Arguments If Args.Count <> 1 Then '処理できるのは1フォルダのみ WScript.Echo "当スクリプトに対象となる1フォルダをドラッグ&ドロップして処理を実行してください。" WScript.Quit 'スクリプトを終了 End If 'フォルダ判別 With CreateObject("Scripting.FileSystemObject") '以下の処理はEnd WithまでScripting.FileSystemObjectを使用 If .FolderExists(Args(0)) = False Then 'ドラッグされたものを解析 WScript.Echo "フォルダが見つかりません。" & vbCrLf & "あるいはフォルダではありません。" closeIe() WScript.Quit End If End With 'Wordファイルの有無チェック「IsExistsParticularFile」に処理渡した結果下で処理 If (IsExistsParticularFile(Args(0), "doc") = False) And (IsExistsParticularFile(Args(0), "docx") = False) Then WScript.Echo "指定したフォルダ内にWordファイルが見つかりませんでした。" closeIe() WScript.Quit End If ' 処理… updateMsg "HTML変換処理を実行しています..." WScript.Sleep 5000 ' サンプル用・処理している風に少し止める ConvertWordToHtml Args(0) 'WordToHtmlへWScript.Argumentsを渡して呼び出し。フォルダパスとかファイル名とか。 updateMsg "Excel変換処理を実行しています..." WScript.Sleep 5000 ' サンプル用・処理している風に少し止める ConvertHtmlToExcel Args(0) 'WordToExcelへWScript.Argumentsを渡して呼び出し。フォルダパスとかファイル名とか。 ' 完了 updateMsg "スクリプト処理完了!" WScript.Echo "処理が終了しました。" ' IE を終了させスクリプトを閉じる closeIe() WScript.Quit '------------------------------------------------------------------------------------------------------------------ Private Sub ConvertWordToHtml(ByVal FolderPath) '指定したフォルダ内のWordファイルをHTMLファイルに変換 Dim wdApp, wdDoc Dim f Const wdFormatHTML = 8 '保存時に使用するフォーマット番号を「wdFormatHTML」に設定(標準 HTML 形式) Const wdDoNotSaveChanges = 0 '変更がない時に保留中の変更を保存しません。この2つは番号で記述すると何だこれとなるから定数設定する Set wdApp = CreateObject("Word.Application") 'Wordのオブジェクトを作成 wdApp.Visible = False 'Wordアプリを非表示 If Right(FolderPath, 1) <> ChrW(92) Then FolderPath = FolderPath & ChrW(92) 'FolderPath末尾¥をつける処理 ChrW(92)は「¥」Chr 【キャラクター】関数 With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(FolderPath).Files 'ファイルの数だけ繰り返し処理 Select Case LCase(.GetExtensionName(f)) 'ファイル形式が当てはまれば処理 'Wordファイルのみ処理 Case "doc", "docx" Set wdDoc = wdApp.Documents.Open(CStr(f)) 'Wordで対象ファイルを開く wdDoc.SaveAs FolderPath & .GetBaseName(f) & ".html", wdFormatHTML, , , False 'HTM形式で保存する wdDoc.Close wdDoNotSaveChanges '対象ファイル閉じる Set wdDoc = Nothing '変数の片付け End Select Next End With wdApp.Quit 'Wordアプリを終了 End Sub '------------------------------------------------------------------------------------------------------------------ Private Sub ConvertHtmlToExcel(ByVal FolderPath) 'htmlからExcelに変換 Dim objExcel, fso, folder, subfolder, Exbook Dim f Set objExcel = CreateObject("Excel.Application") 'Excelのオブジェクトを作成 objExcel.Visible = False 'Excelアプリを非表示 If Right(FolderPath, 1) <> ChrW(92) Then FolderPath = FolderPath & ChrW(92) 'FolderPath末尾¥をつける処理 ChrW(92)は「¥」Chr 【キャラクター】関数 With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(FolderPath).Files Select Case LCase(.GetExtensionName(f)) 'htmlファイルのみ処理 Case "html" Set Exbook = objExcel.Workbooks.Open(CStr(f)) 'ファイルを開く Exbook.SaveAs FolderPath & .GetBaseName(f) & ".xlsx",51 'ここは保存形式をxlsx形式の保存だが番号のままConstで定義しといてもよい Exbook.Close '対象ファイル閉じる f.Delete 'htmlファイルを削除 Set Exbook = Nothing End Select Next End With objExcel.Quit 'Excel終了 'HTMLに変換するときにできたフォルダを削除 Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(FolderPath) 'folderにドラッグ&ドロップしたFolderPathを格納 For Each subfolder In folder.subfolders 'folder.subfoldersサブフォルダの数だけ処理 subfolder.Delete (True) ' フォルダを削除 Next Set fso = Nothing '変数の片付け End Sub '------------------------------------------------------------------------------------------------------------------ Private Function IsExistsParticularFile(ByVal FolderPath, ByVal FileExtension) '指定したフォルダ内に特定の拡張子のファイルがあるかを調べる Dim ret Dim f ret = False '初期化 With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(FolderPath).Files Select Case LCase(.GetExtensionName(f)) Case LCase(FileExtension) ret = True Exit For End Select Next End With IsExistsParticularFile = ret End Function '------------------------------------------------------------------------------------------------------------------ ' IE の初期化 Sub initializeIe() Set ie = CreateObject("InternetExplorer.Application") With ie .Navigate("about:blank") .ToolBar = False .StatusBar = False ' 幅・高さの設定 .Width = 300 .Height = 200 ' 画面右上に配置する。"parentWindow.screen" はパスカルケースで書くと認識されない .Top = 0 .Left = .Document.parentWindow.screen.Width - 300 .Document.Charset = "UTF-8" .Visible = True .Document.Title = "スクリプト実行中" End With End Sub '------------------------------------------------------------------------------------------------------------------ ' メッセージを IE に追記する ' ' 引数のメッセージを IE の最終行に追記する。 ' 最終行が表示されるようにスクロール位置を最下部に設定する。 Sub updateMsg(value) With ie .Document.Body.innerHTML = .Document.Body.innerHTML & value & "<br>" .Document.Script.setTimeout "javascript:scrollTo(0," & .Document.Body.ScrollHeight & ");", 0 End With End Sub ' IE を終了する Sub closeIe() ie.Quit Set ie = Nothing End Sub