我尝试复制第二个答案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
也可以。