【问题标题】:VBA global class variableVBA 全局类变量
【发布时间】:2016-10-06 14:01:27
【问题描述】:

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

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

这是我的类定义,作为名为“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

感谢您的宝贵时间

【问题讨论】:

  • Set Bedoya = New cRSM: Bedoya.Name = "Bedoya" 在类初始化方法中执行此操作 - 您不能在方法之外使用此代码。
  • @Tim Williams,你叫什么“方法”?小代码示例请,我在这里迷路了
  • 方法是子或函数

标签: vba excel class userform


【解决方案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

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

【讨论】:

  • 这是什么意思:“意外实例化变量”?
  • 意思是在你不打算使用的地方使用Bedoya
【解决方案2】:

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

你可以把声明放在模块中

public Bedoya As cRSM

那么你已经创建了对象......你可以在 Workbook 中使用一个全局事件,比如

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

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

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

你现在想做的事情是使用单例软件模式完成的,但这是为其他日子做的,呵呵

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2013-01-18
    • 2018-03-04
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多