Excel VBA のコードをテキストに吐き出したりしたい場合があります。(バージョン管理に突っ込みたいときとか)
しかし毎度手で Export するのは面倒なので VBA にやらせたい場合、たとえば以下のように書くと Export できます。
Sub CodeExport()
' 任意の WorkBook を指定 (ActiveWorkBook なり Workbooks.Open なり…)
Dim w As Workbook
Set w = ThisWorkbook
' Export
Call w.VBProject.VBComponents("Module1").Export("C:Module1.bas")
End Sub
上記はファイル名を個別指定の例ですが、Book内のモジュールを一気に Export したい場合は、VBComponents を for each で回して Name で名前が取れるのであとは良しなに…
Sub CodeList()
' 任意の WorkBook を指定 (ActiveWorkBook なり Workbooks.Open なり…)
Dim w As Workbook
Set w = ThisWorkbook
' 列挙
For Each x In w.VBProject.VBComponents
Debug.Print x.Name
Next
End Sub
逆に import したい場合は以下のようにします。
import の場合、同名のモジュールがあると自動的にリネームされるので、先に削除してから import を行います。
Sub CodeReplace()
' 任意の WorkBook を指定 (ActiveWorkBook なり Workbooks.Open なり…)
Dim w As Workbook
Set w = ThisWorkbook
' 一旦削除
Call w.VBProject.VBComponents.Remove( _
w.VBProject.VBComponents("Module1"))
' その後 Import
Call w.VBProject.VBComponents.Import("C:Module1.bas")
End Sub
ただ、この方法は欠点があります。
Sheet や Workbook のマクロはクラスモジュールとして import されます。そのため、本来(Sheet や Workbook のマクロ)の位置 に直接 import できません。
これは Excel の仕様のようです。(手動での import でもそういう動作になります)
また、上記のコードを動かすためには、セキュリティの設定を変更する必要があります。
「ファイル」→「オプション」→「セキュリティ」→「セキュリティセンターの設定」とたどって、「VBA プロジェクト オブジェクト モデル へのアクセスを信頼する」にチェックを入れておきます。
