標準モジュールを外部ファイルで管理

はじめに

Excel VBA のマクロを、複数のブックから利用するには下記の方法があります。

(1) 違うブックのプロシージャを実行する方法

実行するファイル(aaa.xlsm)

モジュール:Module1

Sub call_hoge()
  Workbooks.Open Filename:="D:\bbb.xlsm", ReadOnly:=True
  Application.Run "'bbb.xlsm'!Module1.hoge"
  Windows("bbb.xlsm").Close
End Sub

Sub call_hello()
  Workbooks.Open Filename:="D:\bbb.xlsm", ReadOnly:=True
  MsgBox Application.Run("'bbb.xlsm'!Module1.hello", "World")
  Windows("bbb.xlsm").Close
End Sub

実行されるファイル(bbb.xlsm)

モジュール:Module1

Sub hoge()
  MsgBox "hoge"
End Sub

Function hello(x)
  hello = "Hello, " & x & "!"
End Function

(2) モジュールをテキストファイルからロードして実行する方法

実行するファイル(aaa.xlsm)

ThisWorkBook

' ワークブックを開く時のイベント
Private Sub Workbook_Open()
   
   ' txtに書いてある外部ライブラリを読み込み
   load_from_conf ".\libdef.txt"
End Sub



' -------------------- モジュール読み込みに関する関数 --------------------



' 設定ファイルに書いてある外部ライブラリを読み込みます。
Sub load_from_conf(conf_path)
   
   ' 全モジュールを削除
   clear_modules
   
   ' 絶対パスに変換
   conf_path = abs_path(conf_path)
   If Dir(conf_path) = "" Then
       MsgBox "外部ライブラリ定義" & conf_path & "が存在しません。"
       Exit Sub
   End If
   
   ' 読み取り
   fp = FreeFile
   Open conf_path For Input As #fp
   Do Until EOF(fp)
       ' 1行ずつ
       Line Input #fp, temp_str
       If Len(temp_str) > 0 Then
           module_path = abs_path(temp_str)
           If Dir(module_path) = "" Then
               ' エラー
               MsgBox "モジュール" & module_path & "は存在しません。"
               Exit Do
           Else
               ' モジュールとして取り込み
               include module_path
           End If
       End If
   Loop
   Close #fp
   
   ThisWorkbook.Save
   
End Sub
   
   
' あるモジュールを外部から読み込みます。
' パスが.で始まる場合は,相対パスと解釈されます。
Sub include(file_path)
   ' 絶対パスに変換
   file_path = abs_path(file_path)
   
   ' 標準モジュールとして登録
   ThisWorkbook.VBProject.VBComponents.Import file_path
End Sub
   
   
' 全モジュールを初期化します。
Private Sub clear_modules()
   For Each component In ThisWorkbook.VBProject.VBComponents
       If component.Type = 1 Then
           ' この標準モジュールを削除
           ThisWorkbook.VBProject.VBComponents.Remove component
       End If
   Next component
End Sub
   
   
' ファイルパスを絶対パスに変換します。
Function abs_path(file_path)
   
   ' 絶対パスに変換
   If Left(file_path, 1) = "." Then
       file_path = ThisWorkbook.Path & Mid(file_path, 2, Len(file_path) - 1)
   End If
   
   abs_path = file_path
   
End Function

読み込みファイルA(libdef.txt)

.\HogeModule.bas
.\FugaModule.bas

読み込みファイルB(HogeModule.bas)

' hogeのためのモジュール。
Attribute VB_Name = "HogeModule"

Sub hoge()
  MsgBox "hoge"
End Sub

Function hello(x)
  hello = "Hello, " & x & "!"
End Function

読み込みファイルC(FugaModule.bas)

' fugaのためのモジュール。
Attribute VB_Name = "FugaModule"

Sub fuga()
  MsgBox "fuga"
End Sub

メモ

セキュリティの関係で事前に下記の設定が必要

下記の設定をしないと「プログラミングによるVisual Basicプロジェクトへのアクセスは信頼性に欠けます」というエラーメッセージが出て処理ができません。

  • Excel2003の場合
    ツール>マクロ>セキュリティ>信頼できる発行元>Visual Basic プロジェクトへのアクセスを信頼する をオン
  • Excel2007の場合
    リボンの「開発」タブ>マクロのセキュリティ>VBAプロジェクトオブジェクトモデルへのアクセスを信頼する
    http://support.microsoft.com/kb/282830/ja