和風スパゲティのレシピ

日本語でコーディングするExcelVBA

汎用関数モジュールを選択ブックにコピーするマクロ

すべてのマクロブックで共有するような自作の汎用関数(ライブラリ)を、
モジュールごとワンタッチで選択中のブックにコピーするマクロを紹介します。


実行型の便利マクロですので、
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

解説

モジュールを操作するコード群はいちいち書くと大変なので、
汎用関数にラップしてあります。

今回使用するものだけに絞って乗せてありますが、
もしよろしければ以下の記事より全関数を持って行ってください。

www.limecode.jp


マクロの仕様としては単純で、

  • 対象のモジュールが既に存在すれば削除
  • その上でオリジナルのモジュールをコピー

というステップで実行しています。


記事タイトルは「選択ブックにコピー」としましたが、
「既存ブックのライブラリを最新に更新」も兼ねているマクロですね。



このマクロの便利ポイントとして、
Scripting Runtimeの参照設定も自動で実行しています。

これがなかなか便利な仕様で、
FileSystemObjectやDictionaryを使った関数をそのまま動かせますし、
それらを使ったマクロをすぐに書き始めることもできます。


その他の組込ライブラリも使用している方は、
ここで必要な参照をすべて設定してしまうのがおすすめです。