遅くなりましたが、質問を読んで自分が思ったイメージをざっくり置いておきます。
ユーザーが直接操作するマクロ入りブックは「中間実行マクロ.xlsm」とします。
- ユーザーが「中間実行マクロ.xlsm」のマクロ(下記コードでは
EntryPoint
)を起動
- ダイアログでユーザーが対象のブックを指定(指定方法は別途検討)
- 「中間実行マクロ.xlsm」が、何らかの情報を元に適用する「修正パッチマクロ.xlsm」を特定(下記コードでは直書き)
- 「中間実行マクロ.xlsm」が 2. でユーザーが指定したファイルに「修正パッチマクロ.xlsm」を適用
vba
1'中間実行マクロ.xlsm の中の処理。
2
3Public Sub EntryPoint()
4'https://teratail.com/questions/276054
5
6 '対象のブックの選択(方法は要検討)。
7 Dim targetBookPath As Variant
8 targetBookPath = Application.GetOpenFilename("Excelファイル,*.xlsx")
9
10 If VBA.Information.VarType(targetBookPath) = vbBoolean Then Exit Sub
11
12 '「修正パッチマクロ」のフルパス(ここでは直書きしているけれど、別に管理した方がよい)。
13 Dim patchMacroPath As String
14 patchMacroPath = ThisWorkbook.Path & Application.PathSeparator & "修正パッチマクロ.xlsm"
15
16 '「修正パッチマクロ」の中の実行したい処理(モジュール名.プロシージャ名 ここでは直書きしているけれど、別に管理した方がよい)。
17 Dim macroName As String
18 macroName = "Module1.PatchA"
19
20 '対象のブックを開いて、パッチを適用する。
21 Dim targetBook As Excel.Workbook
22 Set targetBook = Workbooks.Open(targetBookPath)
23 Call ApplyPatch(targetBook, patchMacroPath, macroName, "あ", "い", "う")
24
25End Sub
26
27'inTargetBook :処理対象のブック(適用ファイル.xlsx)。
28'inPatchBookPath :修正パッチマクロ.xlsm のパス。
29'inPatchMacroName :修正パッチマクロ.xlsm の中のプロシージャの名前。
30'inOptionalArgs :任意の追加情報。
31Public Function ApplyPatch( _
32 ByVal inTargetBook As Excel.Workbook, _
33 ByVal inPatchBookPath As String, _
34 ByVal inPatchMacroName As String, _
35 ParamArray inOptionalArgs() As Variant _
36 ) As Variant
37
38 Dim appXl As Excel.Application
39 Set appXl = inTargetBook.Application
40
41 '修正パッチマクロ.xlsm を開く。
42 Dim patchBook As Excel.Workbook
43 Set patchBook = appXl.Workbooks.Open( _
44 inPatchBookPath, _
45 ReadOnly:=True _
46 )
47
48 Dim macroName As String
49 macroName = "'" & patchBook.Name & "'!" & inPatchMacroName
50
51 'Application.Run で inPatchMacroName で指定したマクロを実行&結果取得。
52 Let ApplyPatch = appXl.Run(macroName, inTargetBook, inOptionalArgs)
53
54 '修正パッチマクロ.xlsm は閉じておく。
55 patchBook.Close SaveChanges:=False
56
57End Function
vba
1'修正パッチマクロ.xlsm の中の処理。
2
3'Application.Run で呼び出される処理。
4 '他の処理を追加する場合も引数はこれと同じ型・数であること。
5Public Function PatchA(ByVal inBook As Excel.Workbook, inArgs() As Variant) As Variant
6 '1枚目のシートに現在時刻と、引数の文字列を設定し、設定した現在時刻を返す。
7
8 Dim ws As Excel.Worksheet
9 Set ws = inBook.Worksheets.Item(1)
10
11 ws.Range("A1").Value = VBA.DateTime.Now
12 ws.Range("A2").Value = VBA.Strings.Join(inArgs)
13
14 Let PatchA = ws.Range("A1").Value
15End Function