Isabelle : efficace le code target.offset....etc !!!
En gros :
- Modules de feuille : l'objet parent est la feuille de calcul
- Module 'ThisWorkbook' : l'objet parent est le classeur
- Module de classe : l'objet parent est l'objet instancié à partir de la
classe
- Module standard : pas d'objet parent
L'objet parent est l'objet auquel se réfère le module. On peut accéder à
cet objet par le mot-clé "Me" (bien que ce ne soit pas indispensable).
Par exemple :
Me.Name dans le module "Feuil1" : renvoie le nom de la feuille
Me.Name dans le module "ThisWorkbook" : renvoie le nom du classeur
Me.Name dans le module "Class1" : renvoie le contenu de la variable ou
propriété "Name" de l'objet telle qu'elle est définie dans le module de
classe
Me.Name dans un module standard : génère une erreur d'exécution.
Les modules de feuille et 'ThisWorkbook' sont des types particuliers et
prédéfinis de modules de classe. Ils sont destinés à contenir le code
relatif à l'objet parent et aux objets qu'il contient (procédures
événementielles de la feuille de calcul ou du classeur).
Ceci concerne essentiellement :
1) Les procédures événementielles
Par exemple :
- Si l'on veut intercepter toutes les saisies de l'utilisateur dans la
feuille Feuil1, on utilise en principe l'évènement Worksheet_Change de
son module de code.
- Si l'on veut intercepter les saisies dans n'importe quelle feuille du
classeur, on utilise l'évènement Workbook_SheetChange du module
'ThisWorkbook'.
- Si l'on veut intercepter les saisies dans n'importe quelle feuille de
n'importe quel classeur, on utilise l'événement App_SheetChange d'une
variable Application définie dans un module de classe.
Comme l'application est conteneur du classeur, qui est lui-même
conteneur de la feuille, on peut aussi intercepter par exemple les
saisies dans une feuille particulière à partir de Workbook_SheetChange
ou même d'une procédure App_SheetChange, mais c'est moins direct et pas
vraiment approprié.
2) Les objets :
Tout le code d'un contrôle (bouton, etc) posé dans une feuille de calcul
doit impérativement (procédures événementielles attachées au contrôle)
ou devrait être (autres procédures) placé dans le module de cette même
feuille.
Un piège classique : quand on utilise la propriété Range() seule sans la
faire précéder de Worksheets("..."):
- Dans les modules standard, la feuille contenant le Range sera
implicitement la feuille active (Range("A1") renvoie donc
ActiveSheet.Range("A1")).
- Dans les modules de feuille, il ne s'agit *pas* de la feuille active,
mais de la feuille parent du module (Range("A1") renvoie
Me.Range("A1")). Si l'on veut se référer à la feuille active, il est
donc nécessaire dans les modules de feuille de l'identifier
explicitement: ActiveSheet.Range("A1").
3) Les fonctions personnalisées :
Il est impossible d'appeler dans une formule sous Excel une fonction
perso définie dans un module de feuille ou le module 'ThisWorkbook'. Il
faut les définir uniquement dans des modules standard.
4) La persistance des modules :
Les modules de feuille étant attachées à des feuilles de calcul, si l'on
déplace ou supprime celles-ci, les modules seront déplacés ou supprimés
en même temps. Les modules standard et de classe ne peuvent pas être
affectés par les manipulations de l'utilisateur sous Excel. Le module
'ThisWorkbook' est indestructible.
Conclusion : en principe, tant qu'on ne manipule pas des procédures
événementielles ou des contrôles posés sur des feuilles, il vaut
beaucoup mieux placer son code dans des modules standard plutôt que dans
des modules de feuille ou 'ThisWorkbook'.
Les modules de feuille et 'ThisWorkbook' sont essentiellement employés
pour définir des procédures événementielles attachées respectivement aux
feuilles de calcul (ou aux objets qu'elles contiennent) ou au classeur
dans son ensemble. Les modules de classes sont essentiellement utiles
pour gérer des événements de niveau application.
OUF !!! J'espère que j'ai rien oublié...
Si ça continue, je vais pas tarder à écrire un bouquin sur XL, moi...
Laurent
t'es une vraie encyclopédie !!
faut s'accrocher quelque peut pourr pas y perdre le nord, sinon c'est clair.
=> enfin je sais à quoi correspond ce "Me", qui m'a énervé bien des fois par
le passé.
Bye
Stéphane
Laurent Longre <laurent...@free.fr> a écrit dans le message :
383D6DD0...@free.fr...
Un truc pas très connu, c'est que le "Me" est optionnel. On peut
utiliser les propriétés ou méthodes de l'objet parent directement, sans
mentionner l'objet. Par exemple:
MsgBox Name
... dans le module ThisWorkbook affichera le nom du classeur, et dans un
module de feuille le nom de la feuille, exactement comme le ferait
Me.Name.
D'où la nécessité de déclarer toutes ses variables au moins dans ce type
de module: si on utilise une variable non déclarée "FullName" dans le
module ThisWorkbook, on manipulera en fait non pas une variable
quelconque non déclarée, mais la propriété ThisWorkbook.FullName...
Je précise pour Den, si je suis allé trop loin avec ma réponse
précédente (?): par "code attaché à une feuille", il faut entendre le
code contenu par le module de la feuille (modules "Feuil1", "Feuil2",
etc dans l'éditeur VBA, accessibles par clic droit sur un onglet de
feuille -> Visualiser le code).
Laurent
Laurent Longre <laurent...@free.fr> a écrit dans le message :
383D6DD0...@free.fr...
> Si ça continue, je vais pas tarder à écrire un bouquin sur XL, moi...
>
> Laurent
Ca, c'est une *vraie riche super XLente idée* !!!!
--
JM
Je ne sais pas si j'aurais le courage d'en écrire un un jour, ni
exactement ce que je mettrais dedans.
Ah si, je sais au moins quelle serait la dédicace :
"Pour Zaza et tou(te)s ses adeptes du forum fr.excel"
L'éditeur en pensera ce qu'il voudra: sans dédicace, pas de livre :->
Laurent
Tu pourrais même demander aux participants du forum qui veut écrire la préface.
Il restera plus qu'à choisir la couverture.
A+
--
==== Geo ==== de la douce Touraine (France)
Laurent Longre a écrit dans le message ...
--
Eric Jeanne
Geo <gl...@wanadoo.fr> a écrit dans le message : 81k8vb$sag$1...@wanadoo.fr...
Bon, je vais dire à Lolo.jpg de mettre une Zaza sur son site, en attendant
la publication de son best-seller ;-)
--
Gros bisous, Kenavo (et Miaou).
Catherine (et Sainte Zaza)
C'est une excellente idée, et en plus, chaque fois qu'on nous posera une
question, il suffira de répondre...
Achetez le bouquin de L.L.
Bonne fête à Catherine.
--
Marcel (et Mira) :-)
Laurent Longre a écrit dans le message <383D9E55...@free.fr>...
>
>> > Si ça continue, je vais pas tarder à écrire un bouquin sur XL, moi...
>>
>> Ca, c'est une *vraie riche super XLente idée* !!!!
>
>Je ne sais pas si j'aurais le courage d'en écrire un un jour, ni
>exactement ce que je mettrais dedans.
>
>Ah si, je sais au moins quelle serait la dédicace :
>
>"Pour Zaza et tou(te)s ses adeptes du forum fr.excel"
>
Oui et puis comme ça plus personne ne posera de question et le forum
sera vide...
Je ne pense pas que ce soit une bonne idée !
A part ça si il y a un livre je veux bien un exemplaire.
> Bonne fête à Catherine.
Pareil.