VBA全局类变量

时间:2016-06-06 20:25:57

标签: vba excel-vba class userform excel

我的障碍是试图让多个潜艇识别类变量。当我尝试全局声明它们时,我收到编译错误:"无效的外部程序"。然后,当我运行一个public函数或sub来声明变量时,它们在其他subs中保持未定义。我想要多个subs来识别变量,因为它们的值应该通过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"

这是&#34;变量未定义错误&#34; (在私人分区内):

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

感谢您的时间

2 个答案:

答案 0 :(得分:1)

在标准模块中(我将我的名字命名为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

如果需要,它将实例化全局变量。这与New关键字之间的唯一区别在于您无法使用此方法意外地实例化变量。您要么致电Initialize,要么致电{1}}。许多VBA开发人员使用New,但几乎从不这样做。

答案 1 :(得分:0)

如果我理解得很好你想要一个全球性的对象。

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

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

你现在想做的事情是使用单身软件模式完成,但这是其他一天hehehe