【发布时间】: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) > 2 Then obj.Location = val else obj.Location = val2。而且你的Let过程中只有一个参数。 -
@Ambie 你的评论让我思考,我想出了一个更优雅的解决方案。我不会在这里发布它,因为它对我提出的问题没有任何帮助,但有一个无形的支持。