VBA 全局类变量



我的障碍是试图让多个子识别类变量。 当我尝试全局声明它们时,我收到一个编译错误:"外部过程无效"。 然后,当我运行公共函数或 sub 来声明变量时,它们在其他 sub 中保持未定义。 我希望多个子识别变量,因为它们的值应该通过UserForm更改,然后在不同的子中使用。

如果它可以以这种方式工作,那就太好了,但我知道我的设计可能从根本上存在缺陷。请指教!

这是我的类

定义,作为名为"cRSM"的类模块插入:

Option Explicit
Private pName As String
Private pDesiredGrowth As Double
'Name of RSM
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Name(Value As String)
pName = Value
End Property

'Growth property
Public Property Get DesiredGrowth() As Double
DesiredGrowth = pDesiredGrowth
End Property
Public Property Let DesiredGrowth(Value As Double)
If Value > 0 And Value < 1 Then
    pDesiredGrowth = Value
End If
End Property

这是无效的过程错误(我将其放在"全局声明"部分中):

'Bedoya
Dim Bedoya As cRSM
Set Bedoya = New cRSM
Bedoya.Name = "Bedoya"

这是"变量未定义错误"(在私有子中):

Private Sub Add_Click()
**Bedoya.DesiredGrowth** = Txt2.Value

谢谢你的时间

在一个标准模块(我命名我的MGlobals)中,把

Public Bedoya As cRSM

然后在另一个标准模块(我命名我的MOpenClose)中,将

Sub Initialize()
    If Not Bedoya Is Nothing Then
        Set Bedoya = New cRSM
    End If
End Sub

要设置的任何默认属性都应在Class_Initialize过程中设置。在要使用的任何过程中Bedoya ,使用

Initialize

如有必要,它将实例化全局变量。this 和 New 关键字之间的唯一区别是,您不会意外地使用此方法实例化变量。你要么打电话Initialize,要么不打电话。许多VBA开发人员使用New,但几乎从不这样做。

如果我理解得很好,你需要一个全局对象。

您可以将声明放在模块中,例如

public Bedoya As cRSM

然后你已经创建了对象...您可以在工作簿中使用全局事件,例如

Private Sub Workbook_Open()
   Set Bedoya = New cRSM
   Bedoya.initialize("Bedoya") 'a method to initialize private variables
End Sub

现在,您可以使用全局对象。您必须重新启动 excel 文件或手动运行此方法。

使用全局变量的风格不好,但有时是比较容易做到的:P

你现在想做的是使用单例软件模式完成的,但这是其他一天的嘿嘿嘿

最新更新