我正在开发大量Excel宏,以使我的生活更轻松。不同宏的一部分是将图片插入工作表中。因此,我想将图像的路径保存在全局位置,然后通过变量访问它(这样,如果更改了宏,则不必手动调整每个宏中的路径)。我每个宏只能使用一个模块
在我自己的模块“变量”中,我将变量定义为“公共”或“全局”,然后通过子项分配了一个值。如果现在通过另一个模块访问此变量,则会得到一个空的MsgBox。 为了进行测试,我使用了一个要通过MsgBox显示的字符串。
模块1:
GridLength
模块2:
Public test As String
Sub variablen()
test = "String for Test "
End Sub
答案 0 :(得分:2)
我建议使用常量而不是变量:
模块1
Option Explicit
Public Const MyPath As String = "C:\Temp"
模块2
Option Explicit
Public Sub ShowPath()
MsgBox MyPath
End Sub
我还建议激活Option Explicit
:在VBA编辑器中,转到工具› 选项› Require Variable Declaration
如果您像这样做一样进行操作,test
将为空,直到先通过运行过程variablen
对其进行初始化。如果您使用Public Const
,则不需要初始化。
答案 1 :(得分:1)
,这样我就不必在每个宏更改时手动调整路径
如果需要更改,那么从语义上讲它不是Const
。编写不需要经常修改的代码的关键是将 code 与 data 分开。
有时需要更改 的文件路径可以看作是某种配置设置。
具有一个模块,该模块能够从任何地方读取设置,并使用给定的 key 返回设置的值。
这些设置本身可以保存在(隐藏的)工作表中,位于ListObject
和Key
列的Value
表中,并可以通过INDEX
+ {{ 1}}函数(在键字符串不存在的情况下,使用早期绑定的MATCH
函数会引发运行时错误):
WorksheetFunction
Option Explicit
Public Function GetSettingValue(ByVal key As String) As Variant
With SettingsSheet.ListObjects(1)
GetSettingValue = Application.WorksheetFunction.Index( _
.ListColumns("Value").DataBodyRange, _
Application.WorksheetFunction.Match(key, .ListColumns("Key").DataBodyRange, 0))
End With
End Function
将保留Variant
的子类型,因此对于Value
值,您将获得String
;对于Variant/String
值,您将获得Date
;对于数字值,您将得到Variant/Date
;对于TRUE / FALSE值,您将得到Variant/Double
。
现在,当文件路径需要更改时,您的代码不需要:
Variant/Boolean
如果您需要更多设置,则无需添加任何代码,
Dim path As String
path = GetSettingValue("ImageFolderPath")
您需要做的就是确保所使用的字符串键与Dim otherThing As String
otherThing = GetSettingValue("OtherThing")
中Key
列的内容匹配。