Excel Vba错误:同一属性的属性过程的定义不一致

时间:2013-08-26 14:26:01

标签: excel vba properties custom-object

它一定是显而易见的东西但是我被困住了所以也许你们可以帮助我。

在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

任何人都可以帮助我吗?

事先提前!

2 个答案:

答案 0 :(得分:4)

Let参数必须与Get属性的返回类型匹配。请参阅this

因此,您需要将Property Let中的参数更改为布尔类型:

If price = 0 Then
    SkipTrade = False
Else
    SkipTrade = True
End If

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

target

答案 1 :(得分: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类型(例如,LongDoubleDecimal),那么您可以执行以下操作:

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属性进行赋值?相反,您的方法实质上调用隐藏在对象模块中的子例程,该子例程为属性赋值。它有用吗?是。这是最好的方式吗?我不这么认为;这是一种非常令人困惑的编码方式,这将使以后的故障排除(特别是如果你将这个项目交给其他人)更加困难。

明确编码比隐式编码 更好。