どこの現場に行っても、時々VBAのモジュールをテキストファイルにエクスポートしたいというタイミングがあるので、取り敢えずVBScriptで書き直したものを貼っておく。(どこの現場からも持ち出しはできないので、記憶などを頼りに適当に書き起こした)
ネットでググればたくさん出てくるけど、個人的には CreateObjectをWithで括る書き方が好きなのでそのように書いている。この書き方の良いところは、オブジェクトを保持するための変数宣言が不要でコードがスッキリするというのと、スコープを抜ければリソース破棄が行われるので気が楽というところ。
expvba.vbs とか適当な名前を付けて保存。そのアイコンにアイコンにエクスポートしたいExcelファイルをドロップするとモジュールファイルをテキストファイルとして吐いてくれる。
出力先はドロップしたファイル名に "_modules" を付けたディレクトリをファイルと同じフォルダ直下に作成 出力対応ファイルは以下の通り。
拡張子 | 種別 |
---|---|
bas | 標準モジュール |
ftm | フォームモジュール |
cls | クラスモジュール |
Option Explicit ' ============================================================================= ' Export VBA Modules to file ' ' Date : 2019/01/21 ' Auther: Kunihisa Abukawa (@kabukawa) ' ' Require: ' Microsoft Excel ' Microsoft Windows ' Usage: ' Drop Files on this if you want export VBA Modules to file. ' or ' cscript [Excel file names...] ' ============================================================================= ' Check Arguments(Excel File Path) is not set. ' ----------------------------------------------------------------------------- If WScript.Arguments.Count = 0 Then MsgBox "Drop Files on this if you want export VBA Modules to file.", _ vbOkOnly + vbInformation, "Information" WScript.Quit End If ' Export VBA Modules ' ----------------------------------------------------------------------------- With CreateObject("Excel.Application") Dim fileName For Each fileName In WScript.Arguments With .Workbooks.Open(fileName,0,True,,,,True) outPutModule fileName & "_modules", .VBProject .Close False End With Next End With MsgBox "All Excel VBA Modules exported to file.", _ vbOkOnly + vbInformation, "Information" WScript.Quit ' ============================================================================= ' Subroutines/Functions ' ============================================================================= ' Clean output folder ' ----------------------------------------------------------------------------- Sub CleanOutput(dirName) With CreateObject("Scripting.FileSystemObject") If .FolderExists(dirName) Then .DeleteFolder dirName, True End If .CreateFolder dirName End With End Sub ' Output VBA Modules to file. ' ----------------------------------------------------------------------------- Sub outPutModule(dirName, objProject) Dim objModule CleanOutput dirName If objProject.Protection = 0 Then For Each objModule In objProject.VBComponents objModule.Export BuildExpPath(dirName, objModule) Next End If End Sub ' Build export module file path. ' ----------------------------------------------------------------------------- Function BuildExpPath(dirName, objModule) BuildExpPath = dirName & "\" & objModule.Name & GetExt(objModule.Type) End Function ' Get file extention from module type. ' ----------------------------------------------------------------------------- Function GetExt(objType) Select Case objType Case 1 : GetExt = ".bas" Case 3 : GetExt = ".frm" Case Else : GetExt = ".cls" End Select End Function
この後はこれをベースに
を貼るかも。