VBA全局变量,多个工作簿

时间:2010-09-23 10:31:10

标签: excel vba global-variables

我有一个VB应用程序,它使用一些全局变量来存储多个表单和模块所需的数据,这很好用。但是,如果用户打开另一个工作簿,运行相同的VBA应用程序,那么他们最终会访问(并更改)相同的公共变量。

如何拥有工作簿级别的全局变量,或者如果这不可能,那么存储所有表单和模块可访问的数据的最佳方法是什么,但仅限于特定工作簿内?

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

4 个答案:

答案 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。