我尝试复制第二个答案from this question。这是我的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内部拥有一个属性吗?

最佳答案

ThisWorkbook可能不是您想的那样。

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

还有一个“ just” ThisWorkbook,一个code name代表代码所在的Workbook类实例。问题在于,与ThisWorkbook不同,此Application.ThisWorkbook受本地化限制。它不是对象模型的一部分,而是一个任意名称。

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

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

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

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

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

09-20 16:57