我有一个VB应用程序,它使用一些全局变量来存储多个表单和模块所需的数据,这很好用。但是,如果用户打开另一个工作簿,运行相同的VBA应用程序,那么他们最终会访问(并更改)相同的公共变量。
如何拥有工作簿级别的全局变量,或者如果这不可能,那么存储所有表单和模块可访问的数据的最佳方法是什么,但仅限于特定工作簿内?
这是一个VBA插件,全局变量在标准模块中声明。
答案 0 :(得分:1)
Public myvar as Variant
声明为Public的变量的范围限定在它们所在的工作簿中。如果你有另一个myvar工作簿,将其值改为一个不会改变另一个。也许你有一个事件,它在两个项目中触发的活动表中设置该变量,并将变量设置为相同的东西。
答案 1 :(得分:1)
您的全局变量全局范围为您的Addin。 我会将它们存储在每个工作簿中的隐藏名称中,然后在每次激活工作簿时重置全局变量(并将值重新存储在已停用的工作簿中)。
答案 2 :(得分:1)
我能够用一个名为George的简单xla复制问题:
Public harry As Variant
Public Sub setHarry(x)
harry = x
End Sub
Public Function getHarry()
getHarry = harry
End Function
我安装了xla。然后我用一个文本框创建了Alice.xls,当它发生变化时调用了setHarry,并且在其中创建了一个带有= getHarry()的单元格。我保持这很简单:
Private Sub TextBox1_Change()
Run "george.xla!setHarry", TextBox1
End Sub
然后我将Alice.xls的副本复制为Bob.xls并运行它们。正如预期的那样,如果任何工作簿更改了Harry,则两个工作簿都会看到结果。
我说预期因为xla就像dll一样,因为每个人共享内存中只有一个副本;这显然包括全局变量,这是有道理的。我只想测试这个理论。
在我看来,解决此问题的最佳方法是使用类模块而不是普通模块。这样,您可以在Workbook_Open事件中为每个工作簿提供自己的类实例及其变量。如果变量被声明为public,则不需要属性获取和设置,但如果有值,则可以使用它们。
答案 3 :(得分:1)
我认为您可以在运行时获取工作簿名称。
因此,收藏可能会完成这项工作。
'//-- 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。