用值定义跨模块变量

时间:2019-01-16 15:18:19

标签: excel vba

我正在开发大量Excel宏,以使我的生活更轻松。不同宏的一部分是将图片插入工作表中。因此,我想将图像的路径保存在全局位置,然后通过变量访问它(这样,如果更改了宏,则不必手动调整每个宏中的路径)。我每个宏只能使用一个模块

在我自己的模块“变量”中,我将变量定义为“公共”或“全局”,然后通过子项分配了一个值。如果现在通过另一个模块访问此变量,则会得到一个空的MsgBox。 为了进行测试,我使用了一个要通过MsgBox显示的字符串。

模块1:

GridLength

模块2:

Public test As String
Sub variablen()
    test = "String for Test "
End Sub

2 个答案:

答案 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 返回设置的值。

这些设置本身可以保存在(隐藏的)工作表中,位于ListObjectKey列的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列的内容匹配。