全局变量的对象/字典

时间:2015-12-22 20:39:58

标签: vba object dictionary

我正在编写一个将放在工作簿A中的宏。

练习册A的主要功能是打开工作簿1-5,并在这些工作簿中运行宏。但是,为了在工作簿1-5中运行宏,我需要将输入传递到工作簿A中的工作簿1-5。

我想在工作簿A中定义一个字典或一个对象,它将整个输入集传递给每个工作簿1-5。工作簿1-5中的宏只会获取必要的输入。

我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:1)

我警惕"在这些工作簿中运行宏",但我会谨慎行事...... :)

假设您有自己的工作簿,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中的每一个都有各自的过程(MaryJo,MaryLou,DaisyLou),这种方法的局限在于每个过程都必须接受一个参数(我猜这最好使它成为字典)。 / p>

每个孩子的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,至少是这样!