OVH Cloud OVH Cloud

Identification d'une feuille d'un classeur

14 réponses
Avatar
Horace Rochat
Bonjour,
Comment puis-je dans une macro quelconque d=E9terminer=20
1- Au d=E9but, la feuille dans laquelle je me trouve=20
au lancement de la macro
2- =C0 la fin de l'ex=E9cution de la macro me retrouver=20
dans ladite feuille? =20

Autrement dit, que dois-je =E9crire, au d=E9but et =E0 la fin=20
de la macro? Je ne connais pas la syntaxe mais ce serait=20
du style :
1- identifie la feuille dans laquelle tu te trouves
----- ex=E9cution de la macro--------------
2- va dans la feuille dans laquelle tu te trouvais=20
avant l'ex=E9cution de la macro

Merci,
Horace

4 réponses

1 2
Avatar
Michel Gaboly
Bonsoir Isabelle et Frédéric,

Je ne suis pas tout à fait d'accord : si on modifie ainsi la première
macro d'Isabelle (appel de la macro 2 à partir de la macro 1, et
MsgBox affichant le nom de la feuille correspondant à x après cet
appel :

Sub Macro1()
Sheets("Feuil1").Select
Set x = ActiveSheet
Sheets("Feuil2").Select
Macro2
MsgBox x.Name
End Sub

Sub Macro2()
x.Select
End Sub

Lorsque le traitement passe dans la macro 2, une erreur 424 (objet
requis) survient effectivement.

Toutefois, si on commentarise alors la ligne concernée et qu'on poursuive
le traitement avec F5, l'instruction MsgBox affiche le nom de la feuille
associée à x ("Feuil1"). Par conséquent la variable n'a pas encore été remise
à Nothing.

On ne peut donc en déduire que le message d'erreur "Objet requis" implique
une remise automatique à Nothing de x.

Il s'agit tout bêtement d'un problème de portée : un premier x, créé automa-
tiquement a une portée limitée à la procédure "Macro1".

Le "x" de la seconde procédure est également une variable locale, créée à la
volée, mais dont la portée correspond à la seconde procédure ("Macro2").

Il s'agit donc de 2 variables distinctes, qui portent le même nom, mais cela
n'a jamais été un moyen de récupérer dans la variable x de la "Macro2" la
valeur de la variable homonyme définie dans la "Macro1".

C'est le fait qu'il s'agit de 2 variables distinctes qui provoque le message
"Objet requis", car la variable x de la seconde procédure n'a pas été initia-
lisée. Cela n'a rien à voir avec le statut et/ou la valeur de la variable x de la
première procédure.

Par ailleurs, le fait en fin de traitement de libérer de la mémoire avec
set c = Nothing ne me semble pas avoir beaucoup d'importance en pratique.

C'est plus orthodoxe d le faire, mais compte tenu de la mémoire des machines
actuelles, rarement moins de 128 Mo, en général beaucoup plus, je pense qu'il
faut qu'un programme utilise de nombreuses variables objets pour que l'inci-
dence soit perceptible, sauf dans des cas très particuliers : tableaux de grandes
dimension ou chaines de caractères particulièrement lourdes.

Bonne année à vous 2



Bonsoir Isabelle,


Sub Macro1()
Sheets("Feuil1").Select
Set x = ActiveSheet
Sheets("Feuil2").Select
End Sub

Sub Macro2()
x.Select
End Sub

sur la macro2 on obtient le message : objet requis
j'en conclus qu'excel remet automatiquement à nothing en fin de macro, à
moin d'avoir déclaré Public x dans le module


Et je pense que tu as, globalement, raison. Si j'en crois l'aide sur le mot clé
Nothing, il peut être, pour libérer 'les ressources mémoire et système' (pour
citer l'aide, justement), affecté explicitement à une variable objet (par
l'instruction Set xxx=Nothing) ou implicitement lorsque la variable objet xxx
devient 'hors de portée', cad lorsqu'elle sort des limites de la portée de sa
déclaration.
Dans ta Macro1, la variable x n'est pas déclarée, ce qui fait que VBA lui
attribue par défaut une portée locale, limitée à la procédure Macro1. Du coup,
l'instruction End Sub de Macro1 entraîne une affectation implicite de Nothing à
la variable x et les ressources sont automatiquement libérées à la fin de cette
procédure.
Pour toutes les variables objet dont la déclaration est limitée à une procédure,
ou celles qui sont uniques pour faire référence à un objet, l'affectation
explicite de Nothing pour libérer les ressources mémoire n'est donc, AMHA,
absolument pas obligatoire dans la mesure où l'instruction End Sub (ou End
Function) de la dernière procédure qui les utilise s'en charge de toute façon
automatiquement. Il n'y a que dans les cas, exceptionnels à mon sens, où
plusieurs variables différentes font référence au même objet que l'affectation
explicite de Nothing est obligatoire.
Libérer systématiquement les ressources affectées aux variables objet en leur
affectant explicitement Nothing n'est pas inutile non plus (ce qui est fait là
par le programmeur n'est plus à faire en automatique) mais, comme les ressources
seront de toute façon libérées, ne pas le faire n'a pas la moindre influence sur
un éventuel manque de mémoire ou de ressources pour Excel :)

Mes deux centimes d'euro..

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

isabelle


Et ne pas oublier, si aucune autre variable ne le désigne, de libèrer
l'ensemble des ressources système et mémoire associées à l'objet
anciennement référencé avec:
set début = Nothing

et vlan... 1 partout ! ;-))

ChrisV

"isabelle" a écrit dans le message de news:

bonjour Horace,

en créant un objet :

set début = ActiveSheet
macro...
début.select

isabelle


Bonjour,
Comment puis-je dans une macro quelconque déterminer
1- Au début, la feuille dans laquelle je me trouve
au lancement de la macro
2- À la fin de l'exécution de la macro me retrouver
dans ladite feuille?

Autrement dit, que dois-je écrire, au début et à la fin
de la macro? Je ne connais pas la syntaxe mais ce serait
du style :
1- identifie la feuille dans laquelle tu te trouves
----- exécution de la macro--------------
2- va dans la feuille dans laquelle tu te trouvais
avant l'exécution de la macro

Merci,
Horace






--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
Frédéric Sigonneau
Bonsoir Michel,


Je ne suis pas tout à fait d'accord :


(snip)

Il s'agit tout bêtement d'un problème de portée : un premier x, créé automa-
tiquement a une portée limitée à la procédure "Macro1".

Le "x" de la seconde procédure est également une variable locale, créée à la
volée, mais dont la portée correspond à la seconde procédure ("Macro2").

Il s'agit donc de 2 variables distinctes, qui portent le même nom, mais cela
n'a jamais été un moyen de récupérer dans la variable x de la "Macro2" la
valeur de la variable homonyme définie dans la "Macro1".


Tout à fait d'accord. Il s'agit bien d'un problème de portée et la variable x de
Macro1 ne peut en aucun cas être connue de Macro2, même si Macro2 est appelée
par Macro1 !
Cela serait différent si Macro2 acceptait un paramètre et que cette procédure
soit appelée avec x passée en paramètre, mais, telle que, Macro2 n'a aucun moyen
de 'connaître' x ...

C'est le fait qu'il s'agit de 2 variables distinctes qui provoque le message
"Objet requis", car la variable x de la seconde procédure n'a pas été initia-
lisée. Cela n'a rien à voir avec le statut et/ou la valeur de la variable x de la
première procédure.


Tout à fait d'accord de nouveau mais j'ai laissé cet aspect de côté car je
voulais plutôt intervenir sur cette question : l'affectation de Nothing à une
variable objet en fin de macro par une instruction
Set xxx=Nothing
est-elle obligatoire ou non pour libérer les ressources ?
Les arguments que j'ai développés tendent à démontrer que la réponse est non. Si
la libération des ressources n'est pas programmée explicitement, End Sub le fait
implicitement.
Ton message ne cherchant pas à démontrer le contraire, je ne vois pas bien où
nous serions en désaccord...
:)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

Par ailleurs, le fait en fin de traitement de libérer de la mémoire avec
set c = Nothing ne me semble pas avoir beaucoup d'importance en pratique.

C'est plus orthodoxe d le faire, mais compte tenu de la mémoire des machines
actuelles, rarement moins de 128 Mo, en général beaucoup plus, je pense qu'il
faut qu'un programme utilise de nombreuses variables objets pour que l'inci-
dence soit perceptible, sauf dans des cas très particuliers : tableaux de grandes
dimension ou chaines de caractères particulièrement lourdes.

Bonne année à vous 2


Bonsoir Isabelle,


Sub Macro1()
Sheets("Feuil1").Select
Set x = ActiveSheet
Sheets("Feuil2").Select
End Sub

Sub Macro2()
x.Select
End Sub

sur la macro2 on obtient le message : objet requis
j'en conclus qu'excel remet automatiquement à nothing en fin de macro, à
moin d'avoir déclaré Public x dans le module


Et je pense que tu as, globalement, raison. Si j'en crois l'aide sur le mot clé
Nothing, il peut être, pour libérer 'les ressources mémoire et système' (pour
citer l'aide, justement), affecté explicitement à une variable objet (par
l'instruction Set xxx=Nothing) ou implicitement lorsque la variable objet xxx
devient 'hors de portée', cad lorsqu'elle sort des limites de la portée de sa
déclaration.
Dans ta Macro1, la variable x n'est pas déclarée, ce qui fait que VBA lui
attribue par défaut une portée locale, limitée à la procédure Macro1. Du coup,
l'instruction End Sub de Macro1 entraîne une affectation implicite de Nothing à
la variable x et les ressources sont automatiquement libérées à la fin de cette
procédure.
Pour toutes les variables objet dont la déclaration est limitée à une procédure,
ou celles qui sont uniques pour faire référence à un objet, l'affectation
explicite de Nothing pour libérer les ressources mémoire n'est donc, AMHA,
absolument pas obligatoire dans la mesure où l'instruction End Sub (ou End
Function) de la dernière procédure qui les utilise s'en charge de toute façon
automatiquement. Il n'y a que dans les cas, exceptionnels à mon sens, où
plusieurs variables différentes font référence au même objet que l'affectation
explicite de Nothing est obligatoire.
Libérer systématiquement les ressources affectées aux variables objet en leur
affectant explicitement Nothing n'est pas inutile non plus (ce qui est fait là
par le programmeur n'est plus à faire en automatique) mais, comme les ressources
seront de toute façon libérées, ne pas le faire n'a pas la moindre influence sur
un éventuel manque de mémoire ou de ressources pour Excel :)

Mes deux centimes d'euro..

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

isabelle


Et ne pas oublier, si aucune autre variable ne le désigne, de libèrer
l'ensemble des ressources système et mémoire associées à l'objet
anciennement référencé avec:
set début = Nothing

et vlan... 1 partout ! ;-))

ChrisV

"isabelle" a écrit dans le message de news:

bonjour Horace,

en créant un objet :

set début = ActiveSheet
macro...
début.select

isabelle


Bonjour,
Comment puis-je dans une macro quelconque déterminer
1- Au début, la feuille dans laquelle je me trouve
au lancement de la macro
2- À la fin de l'exécution de la macro me retrouver
dans ladite feuille?

Autrement dit, que dois-je écrire, au début et à la fin
de la macro? Je ne connais pas la syntaxe mais ce serait
du style :
1- identifie la feuille dans laquelle tu te trouves
----- exécution de la macro--------------
2- va dans la feuille dans laquelle tu te trouvais
avant l'exécution de la macro

Merci,
Horace






--
Cordialement,

Michel Gaboly
http://www.gaboly.com







Avatar
isabelle
merci ! à vous deux pour ces explications, et donc le passage à End Sub
remet bien la variable de la portée de la déclaration (ici dans macro1)
à nothing.

isabelle
ps ChrisV c'est toujours 1-0 ;-)


Bonsoir Michel,


Je ne suis pas tout à fait d'accord :


(snip)

Il s'agit tout bêtement d'un problème de portée : un premier x, créé automa-
tiquement a une portée limitée à la procédure "Macro1".

Le "x" de la seconde procédure est également une variable locale, créée à la
volée, mais dont la portée correspond à la seconde procédure ("Macro2").

Il s'agit donc de 2 variables distinctes, qui portent le même nom, mais cela
n'a jamais été un moyen de récupérer dans la variable x de la "Macro2" la
valeur de la variable homonyme définie dans la "Macro1".


Tout à fait d'accord. Il s'agit bien d'un problème de portée et la variable x de
Macro1 ne peut en aucun cas être connue de Macro2, même si Macro2 est appelée
par Macro1 !
Cela serait différent si Macro2 acceptait un paramètre et que cette procédure
soit appelée avec x passée en paramètre, mais, telle que, Macro2 n'a aucun moyen
de 'connaître' x ...

C'est le fait qu'il s'agit de 2 variables distinctes qui provoque le message
"Objet requis", car la variable x de la seconde procédure n'a pas été initia-
lisée. Cela n'a rien à voir avec le statut et/ou la valeur de la variable x de la
première procédure.


Tout à fait d'accord de nouveau mais j'ai laissé cet aspect de côté car je
voulais plutôt intervenir sur cette question : l'affectation de Nothing à une
variable objet en fin de macro par une instruction
Set xxx=Nothing
est-elle obligatoire ou non pour libérer les ressources ?
Les arguments que j'ai développés tendent à démontrer que la réponse est non. Si
la libération des ressources n'est pas programmée explicitement, End Sub le fait
implicitement.
Ton message ne cherchant pas à démontrer le contraire, je ne vois pas bien où
nous serions en désaccord...
:)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

Par ailleurs, le fait en fin de traitement de libérer de la mémoire avec
set c = Nothing ne me semble pas avoir beaucoup d'importance en pratique.

C'est plus orthodoxe d le faire, mais compte tenu de la mémoire des machines
actuelles, rarement moins de 128 Mo, en général beaucoup plus, je pense qu'il
faut qu'un programme utilise de nombreuses variables objets pour que l'inci-
dence soit perceptible, sauf dans des cas très particuliers : tableaux de grandes
dimension ou chaines de caractères particulièrement lourdes.

Bonne année à vous 2


Bonsoir Isabelle,


Sub Macro1()
Sheets("Feuil1").Select
Set x = ActiveSheet
Sheets("Feuil2").Select
End Sub

Sub Macro2()
x.Select
End Sub

sur la macro2 on obtient le message : objet requis
j'en conclus qu'excel remet automatiquement à nothing en fin de macro, à
moin d'avoir déclaré Public x dans le module


Et je pense que tu as, globalement, raison. Si j'en crois l'aide sur le mot clé
Nothing, il peut être, pour libérer 'les ressources mémoire et système' (pour
citer l'aide, justement), affecté explicitement à une variable objet (par
l'instruction Set xxx=Nothing) ou implicitement lorsque la variable objet xxx
devient 'hors de portée', cad lorsqu'elle sort des limites de la portée de sa
déclaration.
Dans ta Macro1, la variable x n'est pas déclarée, ce qui fait que VBA lui
attribue par défaut une portée locale, limitée à la procédure Macro1. Du coup,
l'instruction End Sub de Macro1 entraîne une affectation implicite de Nothing à
la variable x et les ressources sont automatiquement libérées à la fin de cette
procédure.
Pour toutes les variables objet dont la déclaration est limitée à une procédure,
ou celles qui sont uniques pour faire référence à un objet, l'affectation
explicite de Nothing pour libérer les ressources mémoire n'est donc, AMHA,
absolument pas obligatoire dans la mesure où l'instruction End Sub (ou End
Function) de la dernière procédure qui les utilise s'en charge de toute façon
automatiquement. Il n'y a que dans les cas, exceptionnels à mon sens, où
plusieurs variables différentes font référence au même objet que l'affectation
explicite de Nothing est obligatoire.
Libérer systématiquement les ressources affectées aux variables objet en leur
affectant explicitement Nothing n'est pas inutile non plus (ce qui est fait là
par le programmeur n'est plus à faire en automatique) mais, comme les ressources
seront de toute façon libérées, ne pas le faire n'a pas la moindre influence sur
un éventuel manque de mémoire ou de ressources pour Excel :)

Mes deux centimes d'euro..

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

isabelle


Et ne pas oublier, si aucune autre variable ne le désigne, de libèrer
l'ensemble des ressources système et mémoire associées à l'objet
anciennement référencé avec:
set début = Nothing

et vlan... 1 partout ! ;-))

ChrisV

"isabelle" a écrit dans le message de news:

bonjour Horace,

en créant un objet :

set début = ActiveSheet
macro...
début.select

isabelle


Bonjour,
Comment puis-je dans une macro quelconque déterminer
1- Au début, la feuille dans laquelle je me trouve
au lancement de la macro
2- À la fin de l'exécution de la macro me retrouver
dans ladite feuille?

Autrement dit, que dois-je écrire, au début et à la fin
de la macro? Je ne connais pas la syntaxe mais ce serait
du style :
1- identifie la feuille dans laquelle tu te trouves
----- exécution de la macro--------------
2- va dans la feuille dans laquelle tu te trouvais
avant l'exécution de la macro

Merci,
Horace






--
Cordialement,

Michel Gaboly
http://www.gaboly.com









Avatar
ChrisV
;-)

Ok Isabelle... finalement c'est un peu comme le choix de déclarer ou pas
explicitement les variables en début de proc...
tu laisses le choix à Excel... :-P


ChrisV


"isabelle" a écrit dans le message de news:

merci ! à vous deux pour ces explications, et donc le passage à End Sub
remet bien la variable de la portée de la déclaration (ici dans macro1)
à nothing.

isabelle
ps ChrisV c'est toujours 1-0 ;-)


1 2