3

这一定很明显,但我被困住了,所以也许你们可以帮助我。

考虑 VBA 自定义对象中的以下代码:

Private pSkipTrade As Boolean
Property Let SkipTrade(value As Double):
    If value = 0 Then
        pSkipTrade = False
    Else
        pSkipTrade = True
    End If
End Property

Public Property Get SkipTrade() As Boolean
    SkipTrade = pSkipTrade
End Property

谁能帮我?

提前谢谢!

4

2 回答 2

4

Let 参数必须与 Get 属性的返回类型相匹配。看到这个

所以你需要把Property Let中的参数改成布尔类型:

Private pSkipTrade As Boolean
Property Let SkipTrade(value As Boolean) '<--Parameter is Boolean type
   pSkipTrade = value 
End Property

Public Property Get SkipTrade() As Boolean
    SkipTrade = pSkipTrade
End Property

然后将您在 Let 属性中的逻辑移动到使用该属性的代码中:

If price = 0 Then
    SkipTrade = False
Else
    SkipTrade = True
End If
于 2015-12-15T22:35:54.653 回答
1

尝试这个:

Private pSkipTrade As Boolean
Public Property Let SkipTrade(lSkipTrade As Boolean)
    pSkipTrade = lSkipTrade
End Property
Property Get SkipTrade() As Boolean
   SkipTrade = pSkipTrade
End Property

在您的代码中的其他地方,您正在使用另一个变量(例如value)来设置此属性。如果此变量不是类型Boolean(例如,a Long、、DoubleDecimal),那么您可以执行以下操作:

Sub Test()
Dim MyObject As Object
Dim Value As Double               '## or, whatever

'# CREATE THE CLASS OBJECT
Set MyObject = New cMyObject  '## Modify to be your correct Type

Value = Application.InputBox("Enter any number")

'# ASSIGN THE PROPERTY VALUE BASED ON A LOCAL VARIABLE/LOGIC
'  use boolean logic to test whether "value = 0"
'  a non-zero value will return "True"
MyObject.SkipTrade = Not (CDbl(Value) = 0)

'# Display the value, so you can see that this is working correctly:
MsgBox "The value of SkipTrade is: " & MyObject.SkipTrade

End Sub

如果您有多个条件,最好Function在对象的属性分配期间使用调用来返回属性值。

您可以调用如下函数:

MyObject.SkipTrade = CheckSkipTrade(value)

在您的主代码模块中使用这样的函数,可以对其进行修改以包含您可能需要合并的任何逻辑:

Function CheckSkipTrade(value) As Boolean
Dim myVal as Boolean
    If IsNumeric(value) Then
       'returns true or false test whether 'value' = 0.
       myVal = Not(CDbl(value) = 0)
    Else:
        myVal = False

    End If

    '# Return the value of the function test:
    CheckSkipTrade = myVal
End Function

请注意,在上面的示例中,您直接对类对象的SkipTrade属性进行赋值是非常明确的 - 不是隐藏的?MyObject相反,您的方法本质上调用隐藏在对象模块中的子例程,该子例程为属性分配值。它有效吗?是的。这是最好的方法吗?我不这么认为;这是一种非常令人困惑的编码方式,这将使以后的故障排除(特别是如果您将此项目交给其他人时)变得更加困难。

显式编码优于隐式编码。

于 2013-08-26T14:35:25.130 回答