[VBA XL] Modifier l'attribut d'une procédure [Résolu]

mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 21 mai 2007 à 15:35 - Dernière réponse : cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention
- 22 mai 2007 à 22:56
Salut à tous,

(je suis avec Excel 2003)

EN VB6 :
Lors de l'utilisation d'une collection, il y a possibilité d'utiliser une fonction cachée, à savoir _NewEnum (F2 pour le voir, tapez collection, afficher membre masqué).
Cela permet de parcourir tous les membres d'une collection, avec une boucle For Each, cependant, pour son utilisation, il faut rajouter cette procédure :
Public Function NewEnum() As IUnknown
   Set NewEnum = NomDeLaCollectionUtilisee.[_NewEnum]
End Function

ET (très important), pour l'utiliser, il faut aller dans le Menu Outils, Attibut de procédure, il faut mettre dans les propriétés avancées de cette procédure l'ID à -4 (moins 4) et cocher ~Masquer ce membre~

Bref, ça marche bien (enfin, avec VB6)

Cependant, je voudrais utiliser cette technique avec le VBA d'Excel mais j'ai eu une surprise en ne trouvant pas, dans le menu Outils, Attribut de procédure ?!?
Pourtant, dans l'explorateur d'objet, le membre masqué apparait bien. S'il apparait, il devrait donc être possible de modifier l'attribut d'une procédure pour pouvoir l'utiliser, non ?
Y'a-t-il une combine ou une autre façon de modifier l'attribut d'une Procédure ?

j'ai tenté de mettre ça par code, mais en vain :
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"

Merci de m'avoir lu

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Afficher la suite 

8 réponses

Répondre au sujet
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention - 21 mai 2007 à 23:31
+3
Utile
J'ai essayé quelque chose en "trichant" ... méchant moi...
En fait, j'ai importé la classe clsSAE créée en VB dans Excel et ça ne semble pas boguer.

En fait, si on regarde les 2 fichiers (celui d'Excel et celui de VB) dans NotePad, on peut remarquer une petite différence dans l'entête des fichiers... voir partie en vert

***** EXCEL *****
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "clsSae"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False

***** VB *****
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsSae"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False

Je ne connais pas la raison de cette différence ni pourquoi Excel n'a pas les mêmes outils que VB  en ce qui concerne les attributs de procédures, mais ça semble fonctionner de cette manière... peu orthodoxe...

Et ça prend bien un NEW à l'appel
Dim zyx As New clsListeEvenements

sinon plantage ... (?)

Bonne continuation

MPi
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_MPi
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention - 21 mai 2007 à 16:32
0
Utile
Salut Mortalino,
Je n'y connais rien à ce _NewEnum, mais voici ce qu'en dit MSDN
Voir la partie en bleu concernant VB
Remarks

With Visual C++, you can browse a collection to find a particular item by
using the _NewEnum property or the [_asug_item_method.htm Item] method. In Visual Basic, you do not need
to use the _NewEnum property, because it is automatically used in the
implementation of For Each ... Next.

Est-ce donc vraiment nécessaire de l'utiliser dans ton cas ?

MPi
Commenter la réponse de cs_MPi
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 21 mai 2007 à 16:44
0
Utile
Salut MPi,

merci de ta réponse, bien qu'allé sur MSDN, je n'ai pas trouvé cette info !
Mais ça concerne VB en général, ou que VBA ?
Car pour VB, c'est certain, l'implémentation n'est pas faite d'office, si tu ne changes pas l'attribut à -4, lors du For Each.., une erreur se produit.

Quoi qu'il en soit, j'avance mon projet, et je testerai sans avoir modifié l'attribut, en espérant qu'aucunes erreurs ne se produisent.
Merci encore, et je te tiens au courant

(PS : nécessaire, non, pas vraiment, mais c'est beaucoup plus rapide par cette façon que de trier tous les Items de la collection objets avec une boucle For...To...Next)

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 21 mai 2007 à 20:16
0
Utile
Bah je sais pas comment M$ fait sans changer l'attribut, mais moi, ça ne fonctionne toujours pas

J'ai bien l'erreur comme dans VB6, si tu ne changes pas l'attribut.
Un bout de code, très simplifié pour comprendre :
' classe principale  (clsSAE)

Option Explicit

Private mcolEvenements As New Collection

Public Function Add(ByVal sTypeEvenement As String, ByVal sVeracite As String, ByVal sAutoroute As String,
_
                    ByVal dPR As Double, ByVal iSens As Integer, ByVal iVoiesBloquees As Integer, _
                    ByVal dLongueur As Double) As clsEvenements
                    
   Dim NewPlacement As New clsEvenements
   
   With NewPlacement
      .NumFMC = 1
      
      .TypeEvenement = sTypeEvenement
      .Veracite = sVeracite
      .Autoroute = sAutoroute
      .PR = dPR
      .Sens = iSens
      .VoiesBloquees = iVoiesBloquees
      .Longueur = dLongueur
      
      mcolEvenements.Add NewPlacement, CStr(.NumFMC)
   End With
   Set Add = NewPlacement
End Function

Public Function Count() As Long
   Count = mcolEvenements.Count
End Function

Public Function NewEnum() As IUnknown
'Attribute NewEnum.VB_UserMemId = -4
'Attribute NewEnum.VB_MemberFlags = "40"
   Set NewEnum = mcolEvenements.[_NewEnum]
End Function

'
========= classe de l'evenement  (clsEvenements) ===========

Option Explicit

Public TypeEvenement    As String
Public Veracite         As String
Public Autoroute        As String
Public PR               As Double
Public Sens             As Integer
Public VoiesBloquees    As Integer
Public Longueur         As Double

Private m_NumFMC            As Long
'

Property Get NumFMC() As Long
   NumFMC = m_NumFMC
End Property

Property Let NumFMC(m_newNumFMC As Long)
      m_NumFMC = m_newNumFMC
End Property
' classe pour lister evenements  (clsListeEvenements)

Option Explicit

Private mMyEvenement As New clsSAE

Public Property Get clsSAE() As clsSAE
   Set clsSAE = mMyEvenement
End Property

'
===================================================' Utilisation avec l'implémentation For Each


Sub sdgfhglk()

    Dim abc As New clsSAE
    Dim zyx As New clsListeEvenements

With abc
    .Add "Accident", "Signale", "A8", 20, 1, 12, 0
End With

For Each abc In zyx.clsSAE   ' bug ici, le même qu'en
VB6 quand on ne change pas l'attribut.
    MsgBox abc
Next abc

End Sub

~
<small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

Une idée ? 

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 21 mai 2007 à 20:20
0
Utile
Oups,

    Dim zyx As <strike>New</strike> clsListeEvenements

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 22 mai 2007 à 14:14
0
Utile
Salut MPi,

t'es un malin, toi 
Je n'ai pas tenté, là je suis au boulot, je continue sur mon projet, et je verrai pour tricher comme tu l'as fait via VB6 ce soir.
Ca me donne un peu d'espoir, je t'en remercie !  (je valide ce soir, après tests  ;)  )

Effectivement, il y a quelques différences (ce que tu as mis en vert) + le "Attribute VB_Creatable", True avec VB, False avec VBA

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Commenter la réponse de mortalino
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 22 mai 2007 à 16:34
0
Utile
Bon beh MPi, j'ai accepté ta réponse car effectivement ça à l'air d'être pris en compte.
J'ai un Module de classe VB6 sur moi, que j'ai importé, nickel, plus de problème avec les objets.

Bon j'ai un autre souci, il ne passe jamais dans le MsgBox, mais bon, bien que ça me gonfle, ce doit être une erreur bidon, je vais essayer de la trouver.
En tout cas, merci de m'avoir trouver la solution secours pour l'attribut 

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
Commenter la réponse de mortalino
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention - 22 mai 2007 à 22:56
0
Utile
Je pensais au problème aujourd'hui au bureau...

Pour ne pas avoir à passer par VB lorsque tu crées ce genre de classe, tu pourrais te faire un bout de code qui créerait cette classe de base... simple fichier texte avec les entêtes nécessaires qui pourrait être sauvegardé sous un nom quelconque selon les besoins (à la demande).

Cette partie est assez simple.

Ensuite il ne reste qu'à importer cette classe dans ton projet. Ça, je n'ai jamais essayé, mais ça devrait pouvoir se faire aussi par code, j'imagine...(?)

MPi
Commenter la réponse de cs_MPi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.