我尝试复制第二个答案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内部拥有一个属性?
答案 0 :(得分:2)
ThisWorkbook
可能不是您想的那样。
有Application.ThisWorkbook
,它是Application
对象的属性。它返回工作簿,调用此属性的代码驻留在该工作簿中。
还有一个“只是” ThisWorkbook
,一个code name,代表您的代码所在的Workbook类实例。问题在于,该ThisWorkbook
与Application.ThisWorkbook
不同,要进行本地化。它不是对象模型的一部分,而是一个任意名称。
对于英语版本的Excel,本地化名称也恰好是ThisWorkbook
。
对于非英语的Excel,情况会有所不同。
因此,由于作用域优先级,ThisWorkbook
在英语Excel中解析为“代码名称”,在非英语Excel中解析为Application.ThisWorkbook
。
它们是同一对象,但是只能通过“内部真正”访问Friend属性,因此,通过Application.ThisWorkbook
路径访问工作簿时,看不到它们。
解决方法是在项目树中将本地化的ThisWorkbook
对象重命名为ThisWorkbook
。像工作表代码名称一样,此更改在文件中是本地的。
在您的代码中使用本地化名称代替ThisWorkbook
也可以。