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

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

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 !):
Il suffit de créer un UserForm pour que le Type soit reconnu.
Tant que vous n'avez pas créé un UserForm la librairie nommée Mictosoft Forms 2 Object Library n'est pas référencée dans votre projet.

Mais elle le reste après suppression du userform.

Cordialement
 

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
je n'ai pas pu m'en empêcher :p
VB:
Sub a()
    Dim Obj As Object, typeouff As Boolean

    Set Obj = ActiveSheet
    'On Error Resume Next    'Instruction sans effet car l'erreur vient du compilateur.
    For Each usf In UserForms: typeouff = usf.Name = Obj.Name: Next
    MsgBox typeouff
End Sub
peut etre en faire une fonction
VB:
Sub a()
    Dim obj As Object
    Set obj = ActiveSheet
    MsgBox typeouff(obj, UserForms)
    MsgBox typeouff(obj, Worksheets)
End Sub
Function typeouff(obj, lacollection) As Boolean
    Dim truc
    For Each truc In lacollection
        If truc.Name = obj.Name Then typeouff = True
    Next
End Function
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Merci à tous, vous êtes des As !
VB:
Sub a()
    Dim Obj As Object
    Dim Usf As Object
    Dim IsUserForm As Boolean
  
    Set Obj = ActiveSheet
    'Set Obj = UserForm1

    For Each Usf In UserForms
         If Usf.Name = Obj.Name Then IsUserForm = True
    Next Usf
    
    MsgBox IsUserForm
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Comment tester le Type Userform sans UserForm dans le Projet VBA ?
C'est un type d'objet défini par la bibliothèque MSForms. Sa référence Microsoft Forms 2.0 Object Library doit par conséquent être cochée. Or elle se coche toute seule lorsqu'on demande l'insertion d'un nouvel UserForm.
Attention TypeName(Obj) renvoie le nom de l'UserForm et non "UserForm". C'est en réalité un module de classe avec une interface d'affichage. Cependant je pense qu'il implémente un UserForm et que c'est pourquoi TypeOf Obj Is MSForms.UserForm est vrai quand même aussi.
VB:
Sub Test()
   Dim Obj As Object
   Set Obj = New UserForm1
   MsgBox TypeOf Obj Is MSForms.UserForm _
      & vbLf & TypeOf Obj Is UserForm1 _
      & vbLf & TypeName(Obj)
   End Sub
(UserForm1 est un objet de la rubrique Feuilles que j'ai créé pour le test, bien sûr)
(Et il en existe toujours aussi un exemplaire Public portant pour nom d'objet son nom de type)
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Enfin, y a quand même un schmilblick dans le code.
Si une feuille (ou tout autre objet) porte le même nom qu'un des UserForms ça ressort en type UserForm.

Ou alors il faut que je réserve ce test si aucun TypeOf n'a abouti avant.
 

Dudu2

XLDnaute Barbatruc
Ou alors, tester si la bibliothèque fait partie des Références et si elle n'en fait pas partie, l'inclure.
Mais le compilateur va-t-il la voir si son inclusion résulte de l'exécution ?!

Edit: C'est pas impossible qu'il la voit. Car le compilateur est moitié compilo moitié interpréteur non ?
Sinon j'aurais l'erreur même sans passer dans le code concerné (la référence étant manquante), ce qui n'est pas le cas.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ceci affiche aussi Vrai :
VB:
Sub test2()
   Dim Obj As Object, UFm As Object, CeLEst As Boolean
   Set Obj = UserForm1
   For Each UFm In VBA.UserForms
      CeLEst = UFm Is Obj
      If CeLEst Then Exit For
      Next UFm
   MsgBox CeLEst
   End Sub
Attention: l'opérateur Is utilisé comme ça marche rarement pour des objets Excel.
 

Dudu2

XLDnaute Barbatruc
En l'occurrence c'est bien ta première assertion qu'on veut vérifier.
Et donc le code:
VB:
Sub a()
    Dim Obj As Object
    Dim Usf As Object
    Dim IsUserForm As Boolean

    Set Obj = ActiveSheet
    'Set Obj = UserForm1

    For Each Usf In UserForms
         IsUserForm = Usf Is Obj
         If IsUserForm Then Exit For
    Next Usf
  
    MsgBox IsUserForm
End Sub

Edit: Et plus utilisable sous forme de fonction:
VB:
Function IsUserForm(Obj As Object) As Boolean
    Dim Usf As Object
    
    For Each Usf In UserForms
         If Usf Is Obj Then Exit For
    Next Usf
    
    If Not Usf Is Nothing Then IsUserForm = True
End Function

Franchement, vous êtes trop forts !
Merci.
 
Dernière édition:

Discussions similaires

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

Statistiques des forums

Discussions
312 196
Messages
2 086 087
Membres
103 116
dernier inscrit
kutobi87