我有以下两个子程序:
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中放置“全局”变量是否有特殊的地方?感谢。
[编辑]
我尝试将声明放在程序之外:
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
但是我收到编译错误:外部程序无效。
答案 0 :(得分:2)
您可以在任何Sub
或Function
之外创建模块级变量:
Private fndList As Scripting.Dictionary
如果您需要可以访问多个文件(AKA模块)的变量,那么将变量声明为Public
:
Public fndList As Scripting.Dictionary
虽然您可以在过程之外声明变量,但是您无法在过程之外执行语句(您将收到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 FixPlatformsSelection()
InitDictionary
For Each strKey In fndList.Keys()
'...
Next
End Sub
Sub FixPlatformsWorkbook()
InitDictionary
For Each sht In ActiveWorkbook.Worksheets
'...
Next sht
End Sub
参考文献: