是否可以在VBA中将Friend属性获取到ThisworkBook中?

时间:2018-10-18 12:32:26

标签: excel vba excel-vba model-view-controller userform

我尝试复制第二个答案4xx class。这是我的ThisWorkBook代码:

代码

Option Explicit

Private Type TView
    UserInterFace As UIFrm
    Model as UIModel
End Type

Private this As TView

Friend Property Get UserInterFace() As UIFrm
    If this.UserInterFace Is Nothing Then
        Set this.UserInterFace = New UIFrm
    End If

    Set UserInterFace = this.UserInterFace
End Property

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not this.UserInterFace Is Nothing Then
        Unload this.UserInterFace
        Set this.UserInterFace = Nothing
    End If
End Sub

根据上面链接中的答案,这应该使我能够在同一项目的另一个模块中做到这一点:

ThisWorkbook.UserInterface.Show

上下文

我想制作一个无模式的用户窗体,其中实例“生存”的时间与工作簿一样长。我听说这可能会引起问题,但没有具体说明。我想这样做是为了保留我的UIModel。

UIModel是模型类UIFrm的无模式UI用户表单

问题

我无法使用ThisWorkBook.UserInterFace访问costum属性,如果我将Property Get声明为Public,我将收到有关以下内容的编译错误:私有属性无法公开访问。

是否有可能在ThisWorkbook-Object内部拥有一个属性?

1 个答案:

答案 0 :(得分:2)

ThisWorkbook可能不是您想的那样。

Application.ThisWorkbook,它是Application对象的属性。它返回工作簿,调用此属性的代码驻留在该工作簿中。

还有一个“只是” ThisWorkbook,一个code name,代表您的代码所在的Workbook类实例。问题在于,该ThisWorkbookApplication.ThisWorkbook不同,要进行本地化。它不是对象模型的一部分,而是一个任意名称。

对于英语版本的Excel,本地化名称也恰好是ThisWorkbook
对于非英语的Excel,情况会有所不同。

因此,由于作用域优先级,ThisWorkbook在英语Excel中解析为“代码名称”,在非英语Excel中解析为Application.ThisWorkbook

它们是同一对象,但是只能通过“内部真正”访问Friend属性,因此,通过Application.ThisWorkbook路径访问工作簿时,看不到它们。

解决方法是在项目树中将本地化的ThisWorkbook对象重命名为ThisWorkbook。像工作表代码名称一样,此更改在文件中是本地的。

在您的代码中使用本地化名称代替ThisWorkbook也可以。