我对“在这些工作簿中运行宏”的含糊之处持谨慎态度,但我会谨慎行事... :)
假设您有工作簿 Master.xls 和 Child1-3.xls。它们都有一个对 Windows Scripting Runtime 库的引用集。
- Master 有一个设置工作表和一些 VBA
- Child1-3 每个都有两个工作表,DataDump 和 Settings
- Child1-3 每个都有一个公共模块,其中包含要运行的 VBA proc(名称已知)
主设置 w/s 是这样填充的:
A1 = SettingName B1 = SettingValue
A2 = Setting1 B2 = Value1
A3 = Setting2 B3 = Value2
A4 = Setting3 B4 = Value3
(注意C列是空的,E总是有一个尾随\)
D1 = WBName E1 = WBPath F1 = ProcName
D2 = Child1.xls E2 = C:\Temp\ F2 = MaryJo
D3 = Child2.xls E3 = C:\Temp\ F3 = MaryLou
D4 = Child3.xls E4 = C:\Temp\ F4 = DaisyLou
设置好了,现在执行。
在 Master 的 proc ("Bob") 中编写如下内容:
Public Sub Bob
Dim dctSetting As Dictionary
Dim wkbCurrent As Workbook
Dim rngWkbook As Range
Dim rngSetting As Range
Set rngSetting = ThisWorkbook.Worksheets("Sheet1").Range("A2")
Set dctSetting = New Dictionary
Do Until rngSetting = ""
dctSetting.Add rngSetting.Value, rngSetting.Offset(0, 1).Value
Loop
Set rngWkBook = ThisWorkbook.Worksheets("Sheet1").Range("D2")
Do Until rngWkBook.Value = ""
Set wkbCurrent = Workbooks.Open(rngWkBook.Offset(0,1) & rngWkBook)
Application.Run "'" & rngWkBook & "'!" & rngWkBook.Offset(0,2),
dctSetting
Set wkbCurrent.Saved = True
wkbCurrent.Close False
Set rngWkBook = rngWkBook.Offset(1,0)
Loop
End Sub
Child1-3 中的每一个都有各自的 proc(MaryJo、MaryLou、DaisyLou),这种方法的局限性在于每个 proc 都必须接受一个参数(我猜最好把它做成字典)。
每个孩子的 proc 没有有使用所有三个设置,甚至其中任何一个。通过使用字典,您可以在使用之前检查设置是否存在。所以在每个子进程中都会有类似的东西:
Public Sub MaryLou(dctSettings as Dictionary)
Dim strMyValue As String
If dctSettings.Exists("TheNameOfTheMasterSettingIWantToUse") Then
strMyValue = dctSettings("TheNameOfTheMasterSettingIWantToUse")
' Your code runs here with the populated variable
End If
End Sub
您需要做一些额外的事情,例如在指定路径上检查孩子 w/b - 至少!