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 プロジェクト オブジェクト モデル へのアクセスを信頼する」にチェックを入れておきます。