OVH Cloud OVH Cloud

Repéter SET dans macro appelée ?

10 réponses
Avatar
JeNeVois
Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci

10 réponses

Avatar
MichDenis
Bonjour JeNeVois,

2 façons de faire parmi d'autres :

A )
'------------------------------
Sub appelant()
Dim MySheet As Worksheet
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée MySheet
End Sub
'------------------------------
Sub appelée(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------

B )
'------------------------------
Sub appelant1()

appelée1 Workbooks("MyBook.xls").Sheets("xxx")

End Sub
'------------------------------
Sub appelée1(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------


Salutations!




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

Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci
Avatar
anonymousA
Bonjour,

Objet requis , je ne vois pas en dehors d'un problème de dénomination du
classeur et/ou de la feuille.
Par contre, même si le classeur et la feuille sont bien nommés, le "select"
mettra la zouba si MyBook.xls n'est pas actif dans ce cas précis.
Enfin, la variable étant de niveau module, il n'y a aucune necessité à
répeter le set.

A+


Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci






Avatar
MichDenis
J'ai oublié de mentionner que pour sélectionner une plage de cellules, la feuille doit être obligatoirement celle qui est active. Ta
procédure deviendrait :

'--------------------------
Sub appelée(Sh As Worksheet)
With Sh
.Select
.Range("H2").Select
End With
End Sub
'--------------------------

Mais selon ce que tu veux faire, il y a beaucoup mieux que "Select" pour travailler avec des plages de cellules.


Salutations!


"MichDenis" a écrit dans le message de news: %23%
Bonjour JeNeVois,

2 façons de faire parmi d'autres :

A )
'------------------------------
Sub appelant()
Dim MySheet As Worksheet
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée MySheet
End Sub
'------------------------------
Sub appelée(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------

B )
'------------------------------
Sub appelant1()

appelée1 Workbooks("MyBook.xls").Sheets("xxx")

End Sub
'------------------------------
Sub appelée1(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------


Salutations!




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

Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci
Avatar
JeNeVois
Merci,mais j'avais justement déclaré le
MySheet As Worksheet
au niveau module.
Ainsi je croyais de ne pas devoir repéter
l'instruction SET ni de passer cette variable
à la macro appelée (avec parenthèse).

Salutations


Bonjour JeNeVois,

2 façons de faire parmi d'autres :

A )
'------------------------------
Sub appelant()
Dim MySheet As Worksheet
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée MySheet
End Sub
'------------------------------
Sub appelée(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------

B )
'------------------------------
Sub appelant1()

appelée1 Workbooks("MyBook.xls").Sheets("xxx")

End Sub
'------------------------------
Sub appelée1(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------


Salutations!




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

Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci








Avatar
JeNeVois
Merci, mais il est sousentendu que la
dénomination est correcte (sinon la
macro appelée ne fonctionnerait pas
avec la repétition de l'instruction SET).
De même si la feuille n'était pas activée.

Salutations


Bonjour,

Objet requis , je ne vois pas en dehors d'un problème de dénomination du
classeur et/ou de la feuille.
Par contre, même si le classeur et la feuille sont bien nommés, le "select"
mettra la zouba si MyBook.xls n'est pas actif dans ce cas précis.
Enfin, la variable étant de niveau module, il n'y a aucune necessité à
répeter le set.

A+


Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci








Avatar
MichDenis
Bonjour ,

Tu peux utiliser une variable au niveau du module Standard, Utilise plutôt "Public" en lieu et place de "Dim". Ta variable va être
disponible dans tout le classeur et pas seulement dans ce module

Ceci devrait aussi très bien fonctionner ...sauf que ta variable demeure en mémoire tant et aussi longtemps que ton classeur est
ouvert. Cela signifie que ce type de variables consomment plus des ressources système dû au fait de leur permanence ... mais si ton
programme le requiert ...!

Public MySheet As Worksheet

'-------------------------------
Sub appelant()

Set MySheet = Workbooks(1).Sheets(1)
appelée
End Sub
'-------------------------------
Sub appelée()
With MySheet
.Select
.Range("H2").Select
End With
End Sub
'-------------------------------


Salutations!


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

Merci,mais j'avais justement déclaré le
MySheet As Worksheet
au niveau module.
Ainsi je croyais de ne pas devoir repéter
l'instruction SET ni de passer cette variable
à la macro appelée (avec parenthèse).

Salutations


Bonjour JeNeVois,

2 façons de faire parmi d'autres :

A )
'------------------------------
Sub appelant()
Dim MySheet As Worksheet
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée MySheet
End Sub
'------------------------------
Sub appelée(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------

B )
'------------------------------
Sub appelant1()

appelée1 Workbooks("MyBook.xls").Sheets("xxx")

End Sub
'------------------------------
Sub appelée1(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------


Salutations!




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

Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci








Avatar
anonymousA
re,

ben , alors c'est formidable. Ou est le problème ?

A+


Merci, mais il est sousentendu que la
dénomination est correcte (sinon la
macro appelée ne fonctionnerait pas
avec la repétition de l'instruction SET).
De même si la feuille n'était pas activée.

Salutations


Bonjour,

Objet requis , je ne vois pas en dehors d'un problème de dénomination du
classeur et/ou de la feuille.
Par contre, même si le classeur et la feuille sont bien nommés, le "select"
mettra la zouba si MyBook.xls n'est pas actif dans ce cas précis.
Enfin, la variable étant de niveau module, il n'y a aucune necessité à
répeter le set.

A+


Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci










Avatar
JeNeVois
@MichDenis
@anomymousA

Il est vrai que dans ces subs d'exemples le problème
n'apparaît pas , mais dans les subs plus complexes
il revient. Comme il disparaît dès que je repète
l'instruction SET dans la macro appelé, je ne vois
pas d'autres raisons de l'erreur "Objet requis"

Merci encore pour les réponses




Bonjour ,

Tu peux utiliser une variable au niveau du module Standard, Utilise plutôt "Public" en lieu et place de "Dim". Ta variable va être
disponible dans tout le classeur et pas seulement dans ce module

Ceci devrait aussi très bien fonctionner ...sauf que ta variable demeure en mémoire tant et aussi longtemps que ton classeur est
ouvert. Cela signifie que ce type de variables consomment plus des ressources système dû au fait de leur permanence ... mais si ton
programme le requiert ...!

Public MySheet As Worksheet

'-------------------------------
Sub appelant()

Set MySheet = Workbooks(1).Sheets(1)
appelée
End Sub
'-------------------------------
Sub appelée()
With MySheet
.Select
.Range("H2").Select
End With
End Sub
'-------------------------------


Salutations!


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

Merci,mais j'avais justement déclaré le
MySheet As Worksheet
au niveau module.
Ainsi je croyais de ne pas devoir repéter
l'instruction SET ni de passer cette variable
à la macro appelée (avec parenthèse).

Salutations


Bonjour JeNeVois,

2 façons de faire parmi d'autres :

A )
'------------------------------
Sub appelant()
Dim MySheet As Worksheet
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée MySheet
End Sub
'------------------------------
Sub appelée(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------

B )
'------------------------------
Sub appelant1()

appelée1 Workbooks("MyBook.xls").Sheets("xxx")

End Sub
'------------------------------
Sub appelée1(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------


Salutations!




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

Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci













Avatar
anonymousA
Puisque tu le constates, c'est forcément que le problème se produit. Pour
autant, c'est insatisfaisant intellectuellement de constater ce que tu
rencontres, car les choses sont claires de ce point de vue dans VBA. Une
variable de niveau module qui n'est pas déclarée a une portée module et
seulement module.
Si tes subs sont dans des modules différents, le problème peut se produire
puisque la variable déclarée dans un module ne l'est pas dans l'autre même si
d'ailleurs dans les 2 modules différents la même variable (comprendre le même
nom de variable) est déclaré.
Il n'y a pas à ma conniassance d'entorse à cette règle.

A+


@MichDenis
@anomymousA

Il est vrai que dans ces subs d'exemples le problème
n'apparaît pas , mais dans les subs plus complexes
il revient. Comme il disparaît dès que je repète
l'instruction SET dans la macro appelé, je ne vois
pas d'autres raisons de l'erreur "Objet requis"

Merci encore pour les réponses




Bonjour ,

Tu peux utiliser une variable au niveau du module Standard, Utilise plutôt "Public" en lieu et place de "Dim". Ta variable va être
disponible dans tout le classeur et pas seulement dans ce module

Ceci devrait aussi très bien fonctionner ...sauf que ta variable demeure en mémoire tant et aussi longtemps que ton classeur est
ouvert. Cela signifie que ce type de variables consomment plus des ressources système dû au fait de leur permanence ... mais si ton
programme le requiert ...!

Public MySheet As Worksheet

'-------------------------------
Sub appelant()

Set MySheet = Workbooks(1).Sheets(1)
appelée
End Sub
'-------------------------------
Sub appelée()
With MySheet
.Select
.Range("H2").Select
End With
End Sub
'-------------------------------


Salutations!


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

Merci,mais j'avais justement déclaré le
MySheet As Worksheet
au niveau module.
Ainsi je croyais de ne pas devoir repéter
l'instruction SET ni de passer cette variable
à la macro appelée (avec parenthèse).

Salutations


Bonjour JeNeVois,

2 façons de faire parmi d'autres :

A )
'------------------------------
Sub appelant()
Dim MySheet As Worksheet
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée MySheet
End Sub
'------------------------------
Sub appelée(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------

B )
'------------------------------
Sub appelant1()

appelée1 Workbooks("MyBook.xls").Sheets("xxx")

End Sub
'------------------------------
Sub appelée1(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------


Salutations!




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

Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci















Avatar
JeNeVois
Bonsoir

Je crois avoir trouvé le problème :

J'avais formulé dans un autre module du même classeur

Public Mysheet1, Mysheet2, Mysheet3 As Worksheet
au lieu de
Public Mysheet1 As Worksheet, Mysheet2 As Worksheet, Mysheet3 As Worksheet

ensuite j'avais beau redimer dans mon module separément
dim Mysheet1 As Worksheet
quelquechose restait "coinçé".

Bonne soirée




Bonjour ,

Tu peux utiliser une variable au niveau du module Standard, Utilise plutôt "Public" en lieu et place de "Dim". Ta variable va être
disponible dans tout le classeur et pas seulement dans ce module

Ceci devrait aussi très bien fonctionner ...sauf que ta variable demeure en mémoire tant et aussi longtemps que ton classeur est
ouvert. Cela signifie que ce type de variables consomment plus des ressources système dû au fait de leur permanence ... mais si ton
programme le requiert ...!

Public MySheet As Worksheet

'-------------------------------
Sub appelant()

Set MySheet = Workbooks(1).Sheets(1)
appelée
End Sub
'-------------------------------
Sub appelée()
With MySheet
.Select
.Range("H2").Select
End With
End Sub
'-------------------------------


Salutations!


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

Merci,mais j'avais justement déclaré le
MySheet As Worksheet
au niveau module.
Ainsi je croyais de ne pas devoir repéter
l'instruction SET ni de passer cette variable
à la macro appelée (avec parenthèse).

Salutations


Bonjour JeNeVois,

2 façons de faire parmi d'autres :

A )
'------------------------------
Sub appelant()
Dim MySheet As Worksheet
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée MySheet
End Sub
'------------------------------
Sub appelée(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------

B )
'------------------------------
Sub appelant1()

appelée1 Workbooks("MyBook.xls").Sheets("xxx")

End Sub
'------------------------------
Sub appelée1(Sh As Worksheet)
Sh.Range("H2").Select
End Sub
'------------------------------


Salutations!




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

Bonjour,

fauti-il repéter l'instruction SET dans une sub appélé ?

P.exp. une sub du type

'(avec déclaration pour le module)
Dim MySheet As Worksheet

sub appelant()
Set MySheet = Workbooks("MyBook.xls").Sheets("xxx")
appelée
end sub

sub appelée()
MySheet.Range("H2").select
end sub

me donne toujours l'erreur "Objet requis" qui disparaît seulement
si je repète le SET etc dans la macro appelée

Où est l'erreur ?

Merci