XL 2016 Comment tester le Type d'Objet UserForm ?

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

VB:
Sub a()
    Dim Obj As Object
   
    Set Obj = ActiveSheet
    On Error Resume Next    'Instruction sans effet car l'erreur vient du compilateur.
    MsgBox TypeOf Obj Is UserForm
End Sub

Tant qu'on n'a pas créé un UserForm dans le Projet VBA l'instruction MsgBox TypeOf Obj Is UserForm génère cette erreur de compilation (pas d'exécution !):
2020-08-03_142426.jpg


Il suffit de créer un UserForm pour que le Type soit reconnu.
De plus, même après suppression du UserForm, le Type reste reconnu.

Comment tester le Type Userform sans UserForm dans le Projet VBA ?
Ou neutraliser ce test en vérifiant s'il y a 1 ou plusieurs UserForms dans le Projet VBA ?

Merci pour toute info.
D.
 
Solution
re
sinon tu t’embête pas tu active la référence
VB:
Sub TEST()
'================================================
'activation de la référence
    If VBA.UserForms.Count = 0 Then
        Set u = ThisWorkbook.VBProject.VBComponents.Add(3)    'ajout du module userform
        Set colU = VBA.UserForms.Add(u.Name)    ' ajout de ce module dans!!! la collection userforms
        ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=u    'suppression du dit module userform
    End If
'================================================
    Set Obj = ActiveSheet
    MsgBox TypeOf Obj Is msforms.UserForm
End Sub
re
sinon tu t’embête pas tu active la référence
VB:
Sub TEST()
'================================================
'activation de la référence
    If VBA.UserForms.Count = 0 Then
        Set u = ThisWorkbook.VBProject.VBComponents.Add(3)    'ajout du module userform
        Set colU = VBA.UserForms.Add(u.Name)    ' ajout de ce module dans!!! la collection userforms
        ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=u    'suppression du dit module userform
    End If
'================================================
    Set Obj = ActiveSheet
    MsgBox TypeOf Obj Is msforms.UserForm
End Sub
 
Bonjour la liste,
Sur la base des enseignements de ce sujet j'ai essayé de rejoindre les Roland Garros du VBA en créant un module qui traite des References avec différentes fonctions qui permettent de les lister, en tester l'existence, ajouter, supprimer.
En utilisant ce module (voir fichier joint, retirer l'extension .txt) le code devient:
VB:
Sub a()
    Const GUID = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}"
 
    'Ajout de la référence MsForms (pas d'erreur si déjà présente)
    If Not VBAProjectReferenceAdd(GUID:=GUID) Then
        MsgBox "Erreur ajout Reference MsForms !"
        Exit Sub
    End If
 
    Call aa
End Sub

Sub aa()
    Dim Obj As Object
 
    Set Obj = ActiveSheet
    MsgBox TypeOf Obj Is MSForms.userform
End Sub

La seule "subtilité" est que le test TypeOf Obj Is MSForms.userform ne peut être fait dans la même fonction que l'ajout de la référence MsForms car la compilateur / interpréteur (je ne sais pas trop) vérifie sa présence avant d'exécuter le code de la fonction.
 

Pièces jointes

Dernière édition:
Bonjour.
Je ne comprends rien à votre problème.
Le projet VBA où un objet est susceptible d'être un UserForm a forcément la référence à la bibliothèque MSForms.
C'est comme si vous aviez seulement besoin d'un MSForms.DataObject pour échanger des données avec le presse papier. Si vous avez besoin d'un type de donnée défini par une bibliothèque, cochez sa référence c'est tout !
Je ne comprends pas où vous voyez un problème.
 
Bonjour,
J'ai un module (.bas) qui peut être inclus dans des projets divers dans lesquels un ou plusieurs UserForm(s) peuvent être présents... ou pas.

Ce module a besoin, à un moment donné, de connaître le type d'un objet (et le type de son éventuel parent) pour traiter un problème particulier. Le type UserForm est l'un des types testé, pas le seul. Mais le seul à poser ce problème lié à la présence d'une référence.

Alors, en effet je peux (me) donner comme consigne "si le programme se plante sur le test TypeOf Obj is Userform alors inclure manuellement la référence MsForms." Mais perso, je préfère que le programme ne se plante pas et faire les choses automatiquement. Est-ce mal ?
 
En effet, à l'Open ou en amont quelque part selon ta méthode consistant à ajouter puis à supprimer dynamiquement un UserForm, ou encore avec mon module qui peut ajouter une référence par son GUID ou son FullPath.
La solution précédemment évoquée par la convergence de vos contributions d'une boucle sur la collection UserForms est d'ailleurs aussi excellente.
En tous cas merci à tous.
 
Bonjour.
Il est aussi possible de mettre les modules dans un classeur enregistré en .xlam avec le nom "VBProject" de son projet VBA changé en quelque chose de plus spécifique qui puisse être coché dans les références des projets des classeurs utilisateurs. Comme ça la référence à MSForms n'a besoin d'être cochée que dans ce projet de service.
Application.UserLibraryPath donne le Chemin où il est normalement conseillé de l'enregistrer. Le titre dans les propriété avancées du classeur se retrouvera alors dans la liste des compléments Excel, qu'il suffira de cocher coté Excel pour l'ouvrir en vue de cocher sa référence dans le projet VBA d'un classeur utilisateur, coté VBA cette fois.
C'est exactement comme ça qu'à été pensé le CBxLCtlA.xlsm, conçu pour s'installer en .xlam lors de son ouverture, de cette ressource, avec son projet VBA CLsCAs.

Pour votre problème, il serait aussi possible de vérifier, à l'aide d'une petite gestion d'erreur, si votre objet est muni d'une collection Controls. Ça étendrait son applicabilité aux objets Frame et Page.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour