【问题标题】:Custom class declaration - definitions of property procedures for the same自定义类声明 - 相同的属性过程的定义
【发布时间】:2015-12-01 14:52:43
【问题描述】:

我在下面的代码中得到了我只能假设是this error(Excel 中的错误消息更长,但在其他方面对应于 MSDN 上描述的问题),我不明白为什么。

Private cLocation As String

' Location
Public Property Get Location() As String
    Location = cLocation
End Property

Public Property Let Location(Value As String, Value1 As String)
    If Value <> "" And Len(Value) > 2 Then
        cLocation = Value
    Else
        cLocation = Value1
    End If

    cLocation = Test.scrubLocation(cLocation, Me.NewZipcode)
End Property

它突出了这个特定的Let 过程。

Property Get 过程的参数数量不少于一个 比匹配的 Property Let 的参数数量或 属性设置过程。向 Property Let 或 Property 添加参数 根据需要在 Property Get 中设置或删除参数。

我认为这不可能 - Get 的参数比 Let 少 2 个。此外,向Get 添加参数也无济于事。

Property Get 的参数类型必须完全匹配 Property Let或Property Set的对应参数,除了 额外的属性集参数。修改中的参数声明 相应的过程定义,因此它们是适当的 匹配。

Property Let 的额外参数的参数类型必须 匹配相应 Property Get 过程的返回类型。 修改 Property Let 中的额外参数声明或 相应 Property Get 的返回类型,因此它们是 适当匹配。

一切都是字符串,所以这也应该可以吧?

您使用 Optional 或 ParamArray 定义了一个 Property 过程 范围。不允许使用 ParamArray 和 Optional 参数 财产手续。重新定义程序而不使用这些 关键字。

没有。

我还确保我没有在其他任何地方设置cLocation。在整个项目中,除了上面的Let之外,没有其他程序对cLocation进行修改。

我做错了Let 吗?我的印象是,我可以通过 this answer 做到这一点。

【问题讨论】:

  • 如果 Let 有 2 个参数,Get 必须有一个,而不是没有,根据您的第一个引用部分。
  • 我确实尝试向Get 添加一个参数,但什么也没做。然而,这是一个武断的论点。在这种情况下,Get 是否有一些“形式要求”?
  • 它必须是String 参数,并且与Let 过程的第一个参数同名。
  • Rory 完全正确,但您的代码对Property Let 的使用有点奇怪。更常见的是在调用模块中运行 If 子句:If Len(val) &gt; 2 Then obj.Location = val else obj.Location = val2。而且你的Let 过程中只有一个参数。
  • @Ambie 你的评论让我思考,我想出了一个更优雅的解决方案。我不会在这里发布它,因为它对我提出的问题没有任何帮助,但有一个无形的支持。

标签: class excel vba


【解决方案1】:

您的Get 过程也必须有一个名为Value 的字符串参数:

Public Property Get Location(Value As String) As String
    Location = cLocation
End Property

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多