mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 2011
-
21 mai 2007 à 15:35
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 2018
-
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~
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 21 mai 2007 à 23:31
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
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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 21 mai 2007 à 16:32
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 ?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 21 mai 2007 à 16:44
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~
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 21 mai 2007 à 20:16
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
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
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 22 mai 2007 à 14:14
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~
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 22 mai 2007 à 16:34
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~
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 22 mai 2007 à 22:56
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...(?)