すべてのマクロブックで共有するような自作の汎用関数(ライブラリ)を、
モジュールごとワンタッチで選択中のブックにコピーするマクロを紹介します。
実行型の便利マクロですので、
Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。
ショートカットキーに登録したり、ツールバーやリボンにボタン配置すると便利です。
なお、VBAからVBEを操作するにはひとつセキュリティ設定を切る必要があり、
「開発」⇒「マクロのセキュリティ」⇒
「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」
にチェックを入れることで以下の関数群が使用可能になります。
セキュリティに関することなので、このセキュリティの詳しい説明と、
各汎用関数のご使用は、自己責任でお願いいたします。
ソースコード
' 汎用関数モジュールのコピー Sub 汎用関数モジュールをアクティブブックにコピーする() ' 汎用関数モジュール名 Dim コピーモジュール名 As String: コピーモジュール名 = "Ut_汎用関数" ' オリジナル保管ブック(本コードは個人用マクロブック) Dim wbコピー元 As Workbook On Error Resume Next Set wbコピー元 = Workbooks("PERSONAL.XLSB") On Error GoTo 0 ' コピー先ブック Dim wbコピー先 As Workbook Set wbコピー先 = ActiveWorkbook ' 既に汎用関数をコピーしている場合はモジュールを削除 If Isモジュールが存在する(コピーモジュール名, wbコピー先) Then Call モジュールを削除する(コピーモジュール名, wbコピー先) End If ' モジュールをコピー Call モジュールをコピーする(wbコピー先, wbコピー元, コピーモジュール名) ' Scripting Runtimeを参照設定 Call ScriptingRuntimeを参照設定する(wbコピー先) End Sub
' モジュールのコピー Sub モジュールをコピーする(wbコピー先ブック As Workbook, wbコピー元ブック As Workbook, モジュール名 As String) With wbコピー元ブック.VBProject.VBComponents(モジュール名) wbコピー先ブック.VBProject.VBComponents.Add(.Type).Name = モジュール名 Call wbコピー先ブック.VBProject.VBComponents(モジュール名).CodeModule.AddFromString _ (.CodeModule.Lines(3, .CodeModule.CountOfLines)) End With End Sub ' モジュールが存在するか判定 Function Isモジュールが存在する(判定モジュール名 As String, wb指定ブック As Workbook) As Boolean On Error Resume Next Isモジュールが存在する = wb指定ブック.VBProject.VBComponents(判定モジュール名).Name = 判定モジュール名 End Function ' モジュールの削除 Sub モジュールを削除する(削除モジュール名 As String, wb指定ブック As Workbook) With wb指定ブック.VBProject ' モジュールの解放はマクロ終了まで反映されない場合があるため、 ' 同名モジュールの再作成に影響が出ないよう、モジュール名を変更してから削除する Dim i As Long Do ' 重複の無いよう連番を付与 If Isモジュールが存在する("削除中モジュール" & i, wb指定ブック) = False Then .VBComponents(削除モジュール名).Name = "削除中モジュール" & i ' 解放されずに残る場合があるので、一応すべてコメントアウトしておく Call モジュールをコメントアウトする(wb指定ブック, "削除中モジュール" & i) Exit Do End If i = i + 1 Loop ' モジュールを開放 Call .VBComponents.Remove(.VBComponents("削除中モジュール" & i)) End With End Sub ' モジュールのコメントアウト Sub モジュールをコメントアウトする(wb指定ブック As Workbook, モジュール名 As String) With wb指定ブック.VBProject.VBComponents(モジュール名).CodeModule Dim i As Long For i = 1 To .CountOfLines Call .ReplaceLine(i, "'" & .Lines(i, 1)) Next End With End Sub ' Scripting Runtimeの参照設定 Sub ScriptingRuntimeを参照設定する(wb指定ブック As Workbook) On Error Resume Next wb指定ブック.VBProject.References.AddFromGuid _ GUID:="{420B2830-E718-11CF-893D-00A0C9054228}", _ Major:=1, Minor:=0 On Error GoTo 0 End Sub
解説
モジュールを操作するコード群はいちいち書くと大変なので、
汎用関数にラップしてあります。
今回使用するものだけに絞って乗せてありますが、
もしよろしければ以下の記事より全関数を持って行ってください。
マクロの仕様としては単純で、
- 対象のモジュールが既に存在すれば削除
- その上でオリジナルのモジュールをコピー
というステップで実行しています。
記事タイトルは「選択ブックにコピー」としましたが、
「既存ブックのライブラリを最新に更新」も兼ねているマクロですね。
このマクロの便利ポイントとして、
Scripting Runtimeの参照設定も自動で実行しています。
これがなかなか便利な仕様で、
FileSystemObjectやDictionaryを使った関数をそのまま動かせますし、
それらを使ったマクロをすぐに書き始めることもできます。
その他の組込ライブラリも使用している方は、
ここで必要な参照をすべて設定してしまうのがおすすめです。