2017-08-17 1 views
2

Après avoir lu sur UserForm meilleures pratiques en VBA (crédit Tasse Mat) dans le site maintenant discontinué de documentation SO (affichage de nouveaux liens vers SO La documentation est non autorisé) J'ai pensé que ce serait une bonne idée de définir Attribute VB_PredeclaredId = False pour les userforms dans mon projet. Je pensais que cela fournirait un moyen pratique d'appliquer le concept d'utilisation d'une nouvelle instance de la forme d'utilisateur à chaque fois au lieu d'utiliser l'instance par défaut.Est-il possible de changer l'attribut VB_PredeclaredId False pour l'utilisateur VBA Forms

Pour un module de classe, il est possible de définir l'attribut VB_PredeclaredID sur True, je pensais pouvoir faire le contraire: exporter le userform, changer l'attribut en False, puis importer la version modifiée.

Tristement chaque fois que j'importe le formulaire utilisateur modifié, l'attribut revient automatiquement (et de manière agaçante) à 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 

Ainsi, la question:

Y at-il un cadre ou une autre chose que je peux faire pour forcer l'attribut VB_PredeclaredId d'un userform rester Faux?

[Edit: J'utilise MS Word, espère que la réponse est également applicable à Excel]

+1

Non, pas que je sache. Vous devrez juste être diligent. ;) – Rory

+1

Pour ce que ça vaut, je l'ai essayé dans Excel (2016) et il s'est comporté de la même façon: Réinitialiser à l'importation. – ainwood

+0

@Rory J'avoue que je m'attends à ce qu'il y ait un moyen, encore un peu surpris que l'attribut est réinitialisé: -/ – SlowLearner

Répondre

2

Une solution qui semble répondre à mes besoins

L'approche est basée sur cet article par @MatsMug : userform1.show.

Dans mon formUtilisateur j'ajouter ce qui suit:

'@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 

Les contrôles si le modèle d'événement _Activate est défini - sinon une erreur est soulevée.

Initialement, j'ai essayé de terminer cette vérification dans l'événement _Initialize, mais c'est en fait trop tôt car le formulaire est initialisé avant que le modèle ne soit défini.