XL 2016 Comment tester le Type d'Objet UserForm ?

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

patricktoulon

XLDnaute Barbatruc
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
 

Dudu2

XLDnaute Barbatruc
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

  • Module_VBAProjectReferences.bas.txt
    8.5 KB · Affichages: 6
Dernière édition:

Dranreb

XLDnaute Barbatruc
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.
 

Dudu2

XLDnaute Barbatruc
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 ?
 

patricktoulon

XLDnaute Barbatruc
Bonjour Dudu2
perso dans le pire des cas le pire des pires des plus pires
et ben je m'ennuie pas j'active la ref a l'open même par vba comme je te l'ai donnée
je l'ai dispo dans tout module et j'ai plus de soucis
la question ne se pose même plus
 

Dudu2

XLDnaute Barbatruc
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.
 

Dranreb

XLDnaute Barbatruc
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:

Discussions similaires

Réponses
11
Affichages
525
Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
312 104
Messages
2 085 337
Membres
102 865
dernier inscrit
FreyaSalander