VBA全局variables,多个工作簿

我有一个VB应用程序,它使用一些全局variables来存储多个窗体和模块所需的数据,这工作正常。 但是,如果用户打开另一个工作簿,运行相同的VBA应用程序,则最终访问(和更改)相同的公共variables。

我怎样才能有工作簿级的全局variables,或者如果这是不可能的,什么是最好的方式来存储数据,所有forms和模块可访问,但只有在特定的工作簿?

这是一个VBA插件,全局variables是在一个标准模块中声明的。

我可以用一个简单的叫做George的xla来复制这个问题:

Public harry As Variant Public Sub setHarry(x) harry = x End Sub Public Function getHarry() getHarry = harry End Function 

我安装了xla。 然后我创build了一个名为setHarry的文本框,当它改变的时候,还有一个带有= getHarry()的单元格。 我保持简单:

 Private Sub TextBox1_Change() Run "george.xla!setHarry", TextBox1 End Sub 

然后,我把Bob.xls的Alice.xls拷贝到一起,然后运行它们。 正如所料,如果两本工作手册都改变了哈利,两本手册都会看到结果。

我说预计是因为xla就像dll,因为每个人都有一个内存拷贝, 这显然包括全局variables,这是有道理的。 我只是想testing这个理论。

在我看来,解决这个问题的最好方法是使用类模块而不是普通的模块。 这样,您可以在Workbook_Open事件中为每个工作簿提供自己的类实例及其variables。 如果variables被声明为公共的,你不需要属性获取和设置,尽pipe你可以使用它们,如果有价值的话。

 Public myvar as Variant 

声明为Public的variables作用于他们所在的工作簿。如果您有另一个myvar工作簿,在其中更改它的值不会在另一个工作簿中更改。 也许你有一个事件是从在两个项目中触发的activesheet设置该variables,并将variables设置为相同的事情。

你的全局variables是全局范围的,你的地址。 我会将它们存储在每个工作簿中的隐藏名称中,然后在每次激活工作簿时重置全局variables(并将值重新存储在停用的工作簿中)。

我想你可以在运行时获得工作簿名称。

所以,收集可能会做的工作。

 '//-- module -- Public var As Collection Public Function SetVar(Value) If var Is Nothing Then Set var = New Collection End If var.Add Value, ThisWorkbook.Name End Function Public Function GetVar() As Variant If var Is Nothing Then GetVar = Null Else GetVar = var.Item(ThisWorkbook.Name) End If End Function 

不知道它是否会为你的Addin工作。