多个Excel VBA例程访问相同的对象?

我有以下两个子例程:

Rem Attribute VBA_ModuleType=VBAModule Sub FixPlatformsSelection() Dim fndList As Object Set fndList = CreateObject("Scripting.Dictionary") fndList.Add "3DO Interactive Multiplayer", "3DO" fndList.Add "Nintendo 3DS", "3DS" fndList.Add "Ajax", "AJAX" fndList.Add "Xerox Alto", "ALTO" fndList.Add "Amiga CD32", "AMI32" fndList.Add "Amiga", "AMI" fndList.Add "Apple I", "APPI" fndList.Add "Apple IIe", "APPIIE" fndList.Add "Apple IIGS", "APPGS" fndList.Add "Apple II Plus", "APPII+" fndList.Add "Apple II series", "APPII" fndList.Add "Apple II", "APPII" For Each strKey In fndList.Keys() Selection.Replace What:=strKey, Replacement:=fndList(strKey), _ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _ SearchFormat:=False, ReplaceFormat:=False Next strKey End Sub Rem Attribute VBA_ModuleType=VBAModule Sub FixPlatformsWorkbook() Dim fndList As Object Set fndList = CreateObject("Scripting.Dictionary") fndList.Add "3DO Interactive Multiplayer", "3DO" fndList.Add "Nintendo 3DS", "3DS" fndList.Add "Ajax", "AJAX" fndList.Add "Xerox Alto", "ALTO" fndList.Add "Amiga CD32", "AMI32" fndList.Add "Amiga", "AMI" fndList.Add "Apple I", "APPI" fndList.Add "Apple IIe", "APPIIE" fndList.Add "Apple IIGS", "APPGS" fndList.Add "Apple II Plus", "APPII+" fndList.Add "Apple II series", "APPII" fndList.Add "Apple II", "APPII" For Each sht In ActiveWorkbook.Worksheets For Each strKey In fndList.Keys() sht.Cells.Replace What:=strKey, Replacement:=fndList(strKey), _ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _ SearchFormat:=False, ReplaceFormat:=False Next strKey Next sht End Sub 

如何从子例程中删除fndList字典并将其移动到其他位置,以便所有子例程都可以访问它? 我有两个需要这个字典的例程,并且不想维护相同代码的两个副本。 在VBA中放置“全局”variables是否有特殊的地方? 谢谢。

[编辑]

我试图把这些声明放在程序之外:

 Public fndList As Object Set fndList = CreateObject("Scripting.Dictionary") fndList.Add "3DO Interactive Multiplayer", "3DO" fndList.Add "Nintendo 3DS", "3DS" fndList.Add "Ajax", "AJAX" fndList.Add "Xerox Alto", "ALTO" fndList.Add "Amiga CD32", "AMI32" fndList.Add "Amiga", "AMI" fndList.Add "Apple I", "APPI" fndList.Add "Apple IIe", "APPIIE" fndList.Add "Apple IIGS", "APPGS" fndList.Add "Apple II Plus", "APPII+" fndList.Add "Apple II series", "APPII" fndList.Add "Apple II", "APPII" Rem Attribute VBA_ModuleType=VBAModule Sub FixPlatformsSelection() For Each strKey In fndList.Keys() Selection.Replace What:=strKey, Replacement:=fndList(strKey), _ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _ SearchFormat:=False, ReplaceFormat:=False Next strKey End Sub 

但是我得到一个编译错误:外部程序无效。

您可以在任何SubFunction之外创build模块级variables:

 Private fndList As Scripting.Dictionary 

如果您需要variables可以被多个文件(AKA模块)访问,则将该variables声明为Public

 Public fndList As Scripting.Dictionary 

虽然你可以在过程之外声明variables,但是你不能在过程之外执行语句(你会得到Invalid outside procedure.错误信息)。 因此,初始化代码必须在第三个Sub

 Sub InitDictionary If Not fndList Is Nothing Then Exit Sub Set fndList = New Scripting.Dictionary fndList.Add "3DO Interactive Multiplayer", "3DO" fndList.Add "Nintendo 3DS", "3DS" fndList.Add "Ajax", "AJAX" fndList.Add "Xerox Alto", "ALTO" fndList.Add "Amiga CD32", "AMI32" fndList.Add "Amiga", "AMI" fndList.Add "Apple I", "APPI" fndList.Add "Apple IIe", "APPIIE" fndList.Add "Apple IIGS", "APPGS" fndList.Add "Apple II Plus", "APPII+" fndList.Add "Apple II series", "APPII" fndList.Add "Apple II", "APPII" End Sub 

如果需要,它将初始化字典。

然后,从其他Sub调用初始化Sub

 Sub FixPlatformsSelection() InitDictionary For Each strKey In fndList.Keys() '... Next End Sub Sub FixPlatformsWorkbook() InitDictionary For Each sht In ActiveWorkbook.Worksheets '... Next sht End Sub 

参考文献:

  • 的Scripting.Dictionary
  • 了解VBA中的范围和可见性