【问题标题】:Objects/dictionary for global variables全局变量的对象/字典
【发布时间】:2015-12-22 20:39:57
【问题描述】:

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

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 您是否考虑过使用一个类模块来表示您要使用的内容,然后在模块 A 中实例化一个?
  • 您能否举例说明您设想这两个宏将如何交互?

标签: vba object dictionary


【解决方案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 中的每一个都有各自的 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 - 至少!

【讨论】:

    最近更新 更多