2017-08-17 34 views
2

在VBA (信貸墊的馬克杯)在目前已停產SO文檔站點閱讀有關用戶窗體最佳實踐後(發佈新鏈接SO文檔中不允許)我認爲爲我的項目中的用戶窗體設置Attribute VB_PredeclaredId = False是個好主意。有沒有辦法給VB_PredeclaredId屬性更改爲False VBA用戶窗體

我想這將提供一種實用的方法來強制每次使用用戶表單的新實例的概念,而不是使用默認實例。

對於類模塊,可以將VB_PredeclaredID屬性設置爲True,我期望能夠做相反的事情:導出用戶表單,將該屬性更改爲False,然後導入修改後的版本。

很遺憾,無論何時我導入修改過的用戶表單屬性自動(並令人討厭地)恢復爲真。

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屬性留虛假一些其他的事情嗎?

[編輯:我使用的是微軟的Word,將希望的答案是同樣適用於Excel中]

+1

不,不是我所知道的。你只需要努力。 ;) – Rory

+1

對於它的價值,我在Excel(2016)中試了一下,它的表現相同:在導入時重置它。 – ainwood

+0

@Rory我承認,我期待有一種方式,仍然有點驚訝,該屬性被重置: -/ – SlowLearner

回答

2

,似乎適合我的需要

該方法是基於這篇文章通過對一種解決方法@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事件中完成此項檢查,但實際上,在設置模型之前表單已初始化,這實際上太早了。

相關問題