VBA属性调用Get而不是Let

时间:2018-12-15 14:00:30

标签: excel vba

您好,我正在尝试实现一个接口,以便可以拥有多个模型并将不同的模型传递给不同的方法。在这种情况下,我试图设置一个工作簿变量,但似乎无法理解为什么这是调用get方法而不是let的原因。

设置值的方法:

Public Sub OpenAllWorkbooks(ByRef fromCopyItems As Collection)
    Dim currentCopyItem As ICopyItem
    Dim wb As Variant

    For Each currentCopyItem In fromCopyItems
        ' Set currentCopyItem.ItemWorkBook = OpenWorkbook(currentCopyItem.WorkbookPath) I commented this out to make sure that was set currentCopyItem = whatever was the error
        Set wb = OpenWorkbook(currentCopyItem.WorkbookPath)
        Set currentCopyItem.ItemWorkBook = wb ' It breaks here
        currentCopyItem.IsOpen = True
    Next currentCopyItem

End Sub

这在实现ICopyItem的费用模型中:

'Calling this instead of let
Public Property Get ICopyItem_ItemWorkBook() As Workbook
    Set ICopyItem_ItemWorkBook = Item.ItemWorkBook 
End Property

这应该是它的称呼:

Public Property Let ICopyItem_ItemWorkBook(value As Workbook)
    Set Item.ItemWorkBook = value
End Property

有人可以解释为什么会这样吗

1 个答案:

答案 0 :(得分:4)

这里的基本问题是您定义了一个Property Let访问器而不是Property Set访问器。 Property Let通常用于值类型的分配,Property Set通常用于对象类型的分配。

之所以发生对Property Get的调用,是因为VBE Language specification的5.4.3.9节中的以下段落,该段落描述了在没有Property Set的情况下的回退机制。

  

如果 l-expression 被归类为属性或函数,并且是指   封闭   财产获取   或函数,将强制表达式的值分配给封闭过程的返回值。