在现已停止使用的 SO 文档网站中阅读了 VBA 中的用户表单最佳实践(归功于 Mat's Mug)(不允许发布指向 SO 文档的新链接),我认为为我的项目中的用户表单设置属性 VB_PredeclaredId = False 是个好主意。
我认为这将提供一种实用的方法来强制每次使用用户窗体的新实例而不是使用默认实例的概念。
对于类模块,可以将 VB_PredeclaredID 属性设置为 True,我预计能够执行相反的操作:导出用户表单,将属性更改为 False,然后导入修改后的版本。
遗憾的是,每当我导入修改后的用户表单时,该属性就会自动(并且令人烦恼地)恢复为 True。
VERSION 5.00
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} UserForm1
Caption = "UserForm1"
ClientHeight = 3165
ClientLeft = 45
ClientTop = 390
ClientWidth = 4710
OleObjectBlob = "UserForm1.frx":0000
StartUpPosition = 1 'CenterOwner
End
Attribute VB_Name = "UserForm1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False ' <<<<< Keeps changing back to True
Attribute VB_Exposed = False
所以,问题是:
是否可以通过设置或其他操作强制用户窗体的 VB_PredeclaredId 属性保持 False?
[编辑:我使用的是 MS Word,希望答案同样适用于 Excel]
最佳答案
似乎适合我的需求的解决方法
该方法基于@MatsMug 的这篇文章:userform1.show 。
在我的用户表单中,我添加以下内容:
'@Folder("UI.Forms")
Option Explicit
Implements IView
Const ERR_MODEL As String = "This userForm requires a view model (which is not set)"
Private Type TView
IsCancelled As Boolean
Model As frmModel
toDisplay As String
End Type
Private this As TView
Private Sub UserForm_Activate()
If this.Model Is Nothing Then
Err.Raise Number:=91, Description:=ERR_MODEL
Unload Me
End If
End Sub
_Activate
事件检查模型是否已设置 - 如果没有设置,则会引发错误。
最初,我尝试在 _Initialize
事件中完成此检查,但这实际上为时过早,因为在设置模型之前就初始化了表单。
关于vba - 有没有办法将 VBA 用户表单的 VB_PredeclaredId 属性更改为 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730410/