Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA - déclarer Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")

17 réponses
Avatar
twinley
Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une feuille ou
bien est ce mieux d'écrire Workbooks("flux.xls").Sheets("Graph1") à
chaque fois ?

merci pour l'aide
--
à+twinley

10 réponses

1 2
Avatar
Michel Gaboly
Re,

Tout à fait correct d'affecter une variable à une feuille.

Cependant, ta déclaration est mauvaise : Sheets est une collection de
feuilles de classeur, quelqu'en soit le type (feuille de calcul, feuille
graphique, feuille macro XL4 (normale ou internationale).

Il n'y a pas d'objet Sheet, mais les objets Worksheet et Chart existent,
et c'est ce dernier que tu dois utiliser :

Dim feuilGraph1 as Chart


Voici un exemple qui affiche successsivement le nom de toutes les
feuilles graphiques du classeur actif :


Sub Test()
Dim c As Chart
For Each c In ActiveWorkbook.Charts
MsgBox c.Name
Next
End Sub
Avatar
anomymousA
bonjour,

si feuilGraph1 est une feuille graphique, c'est As Chart. Si c'est une
feuille de calcul c'est As worksheet.

Il n' y a pas d'objet sheet mais une collection sheets qui comprend les
feuilles de type worksheet et de type Chart.
En conséquence, dans le cas où p. ton classeur contient 1 feuille graphique
et une feuille de calcul, une boucle comme celle ci fonctionne

for each sh in sheets
msgbox typename(sh)
next

mais la meme boucle avec Dim sh as Chart ou dim sh as worksheet en
déclaration ne passe pas la barre du débogger.Donc si tu as des boucles comme
ci- dessus à faire et que ton classeur ne contient pas qu'un seul type de
feuille, autant ne pas déclarer la variable de boucle ou alors il faut gerer
les erreurs potentielles.

Enfin écrire uen fois pour toute dans ton programme set wsh
=Workbooks("flux.xls").Sheets("Graph1") plutot que d'écrire à chaque fois
l'intégralité du texte ne sert qu'à alléger le code et le rendre + lisible.

De plus , tu ne peux pas écrire moy = feuilGraph1.Range("O11") si tu veux
définir moy de type range, il faut écrire set moy þuilGraph1.Range("O11")
sauf si tu veux en obtenir la valeur bien sur.


A+



Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une feuille ou
bien est ce mieux d'écrire Workbooks("flux.xls").Sheets("Graph1") à
chaque fois ?

merci pour l'aide
--
à+twinley



Avatar
AV
Pourquoi pas :

moy = [[flux.xls]Graph1!O11]

AV
Avatar
anomymousA
si feuilGraph1 est de type chart, je ne vois pas comment il est possible de
faire référence à une plage de cellules.

A+


bonjour,

si feuilGraph1 est une feuille graphique, c'est As Chart. Si c'est une
feuille de calcul c'est As worksheet.

Il n' y a pas d'objet sheet mais une collection sheets qui comprend les
feuilles de type worksheet et de type Chart.
En conséquence, dans le cas où p. ton classeur contient 1 feuille graphique
et une feuille de calcul, une boucle comme celle ci fonctionne

for each sh in sheets
msgbox typename(sh)
next

mais la meme boucle avec Dim sh as Chart ou dim sh as worksheet en
déclaration ne passe pas la barre du débogger.Donc si tu as des boucles comme
ci- dessus à faire et que ton classeur ne contient pas qu'un seul type de
feuille, autant ne pas déclarer la variable de boucle ou alors il faut gerer
les erreurs potentielles.

Enfin écrire uen fois pour toute dans ton programme set wsh
=Workbooks("flux.xls").Sheets("Graph1") plutot que d'écrire à chaque fois
l'intégralité du texte ne sert qu'à alléger le code et le rendre + lisible.

De plus , tu ne peux pas écrire moy = feuilGraph1.Range("O11") si tu veux
définir moy de type range, il faut écrire set moy þuilGraph1.Range("O11")
sauf si tu veux en obtenir la valeur bien sur.


A+



Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une feuille ou
bien est ce mieux d'écrire Workbooks("flux.xls").Sheets("Graph1") à
chaque fois ?

merci pour l'aide
--
à+twinley





Avatar
Michel Gaboly
Bonjour,

Juste 2 précisions :


- Dans Each sh in sheets, il faut être conscient que sans qualificatif,
Sheets représente les feuilles du classeur actif, ce qui peut conduire à
des surprises, si le classeur actif n'est pas celui auquel on s'attend.
Il est plus prudent d'écrire

For Each sh in ThisWorbook.Sheets

ou

For Each sh in Worbooks("Toto.xls").Sheets

ou

For Each sh in w.Sheets

où w représente un classeur


- Bien souvent, on n'a besoin de ne parcourir qu'un type de feuille du
classeur, les feuilles de calcul et pas les feuilles graphiques, par
exemple, auquel cas déclarer la variable de boucle et utiliser la
collection correspondante évite de mauvaises surprises si le classeur
contient des feuilles d'un autre type que celui auquel on s'intérersse :

Dim w as Worksheet
For each w in ThisWorbook.Workheets
...
Next w

permet d'explorer les feuilles de calcul sans devoir se préoccuper le
l'existence éventuelles de feuilles d'un autre type.

Personnellement je préconise de ne faire appel à la collection Sheets,
QUE si on a réellement besoin de traiter toutes les feuilles. Si ce
n'est pas le cas, il vaut mieux utiliser la collection correspondant au
type de feuille à parcourir, Worksheets ou Charts, selon le cas.


bonjour,

si feuilGraph1 est une feuille graphique, c'est As Chart. Si c'est une
feuille de calcul c'est As worksheet.

Il n' y a pas d'objet sheet mais une collection sheets qui comprend les
feuilles de type worksheet et de type Chart.
En conséquence, dans le cas où p. ton classeur contient 1 feuille graphique
et une feuille de calcul, une boucle comme celle ci fonctionne

for each sh in sheets
msgbox typename(sh)
next

mais la meme boucle avec Dim sh as Chart ou dim sh as worksheet en
déclaration ne passe pas la barre du débogger.Donc si tu as des boucles comme
ci- dessus à faire et que ton classeur ne contient pas qu'un seul type de
feuille, autant ne pas déclarer la variable de boucle ou alors il faut gerer
les erreurs potentielles.

Enfin écrire uen fois pour toute dans ton programme set wsh
=Workbooks("flux.xls").Sheets("Graph1") plutot que d'écrire à chaque fois
l'intégralité du texte ne sert qu'à alléger le code et le rendre + lisible.

De plus , tu ne peux pas écrire moy = feuilGraph1.Range("O11") si tu veux
définir moy de type range, il faut écrire set moy þuilGraph1.Range("O11")
sauf si tu veux en obtenir la valeur bien sur.


A+




Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une feuille ou
bien est ce mieux d'écrire Workbooks("flux.xls").Sheets("Graph1") à
chaque fois ?

merci pour l'aide
--
à+twinley





--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
Michel Gaboly
Re,

Effectivement, tu as raison ;-))

Sauf s'il cherche à nous induire en erreur ;-)) en ayant nommé "Graph1"
une feuille de calcul, parce qu'elle contient un ou plusieurs graphiques.

Auquel cas, "Graph1" serait un objet Worksheet et non Chart.


si feuilGraph1 est de type chart, je ne vois pas comment il est possible de
faire référence à une plage de cellules.

A+



bonjour,

si feuilGraph1 est une feuille graphique, c'est As Chart. Si c'est une
feuille de calcul c'est As worksheet.

Il n' y a pas d'objet sheet mais une collection sheets qui comprend les
feuilles de type worksheet et de type Chart.
En conséquence, dans le cas où p. ton classeur contient 1 feuille graphique
et une feuille de calcul, une boucle comme celle ci fonctionne

for each sh in sheets
msgbox typename(sh)
next

mais la meme boucle avec Dim sh as Chart ou dim sh as worksheet en
déclaration ne passe pas la barre du débogger.Donc si tu as des boucles comme
ci- dessus à faire et que ton classeur ne contient pas qu'un seul type de
feuille, autant ne pas déclarer la variable de boucle ou alors il faut gerer
les erreurs potentielles.

Enfin écrire uen fois pour toute dans ton programme set wsh
=Workbooks("flux.xls").Sheets("Graph1") plutot que d'écrire à chaque fois
l'intégralité du texte ne sert qu'à alléger le code et le rendre + lisible.

De plus , tu ne peux pas écrire moy = feuilGraph1.Range("O11") si tu veux
définir moy de type range, il faut écrire set moy þuilGraph1.Range("O11")
sauf si tu veux en obtenir la valeur bien sur.


A+




Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une feuille ou
bien est ce mieux d'écrire Workbooks("flux.xls").Sheets("Graph1") à
chaque fois ?

merci pour l'aide
--
à+twinley






--
Cordialement,

Michel Gaboly
www.gaboly.com



Avatar
anomymousA
Exact. Le classeur actif.

A+


Bonjour,

Juste 2 précisions :


- Dans Each sh in sheets, il faut être conscient que sans qualificatif,
Sheets représente les feuilles du classeur actif, ce qui peut conduire à
des surprises, si le classeur actif n'est pas celui auquel on s'attend.
Il est plus prudent d'écrire

For Each sh in ThisWorbook.Sheets

ou

For Each sh in Worbooks("Toto.xls").Sheets

ou

For Each sh in w.Sheets

où w représente un classeur


- Bien souvent, on n'a besoin de ne parcourir qu'un type de feuille du
classeur, les feuilles de calcul et pas les feuilles graphiques, par
exemple, auquel cas déclarer la variable de boucle et utiliser la
collection correspondante évite de mauvaises surprises si le classeur
contient des feuilles d'un autre type que celui auquel on s'intérersse :

Dim w as Worksheet
For each w in ThisWorbook.Workheets
...
Next w

permet d'explorer les feuilles de calcul sans devoir se préoccuper le
l'existence éventuelles de feuilles d'un autre type.

Personnellement je préconise de ne faire appel à la collection Sheets,
QUE si on a réellement besoin de traiter toutes les feuilles. Si ce
n'est pas le cas, il vaut mieux utiliser la collection correspondant au
type de feuille à parcourir, Worksheets ou Charts, selon le cas.


bonjour,

si feuilGraph1 est une feuille graphique, c'est As Chart. Si c'est une
feuille de calcul c'est As worksheet.

Il n' y a pas d'objet sheet mais une collection sheets qui comprend les
feuilles de type worksheet et de type Chart.
En conséquence, dans le cas où p. ton classeur contient 1 feuille graphique
et une feuille de calcul, une boucle comme celle ci fonctionne

for each sh in sheets
msgbox typename(sh)
next

mais la meme boucle avec Dim sh as Chart ou dim sh as worksheet en
déclaration ne passe pas la barre du débogger.Donc si tu as des boucles comme
ci- dessus à faire et que ton classeur ne contient pas qu'un seul type de
feuille, autant ne pas déclarer la variable de boucle ou alors il faut gerer
les erreurs potentielles.

Enfin écrire uen fois pour toute dans ton programme set wsh
=Workbooks("flux.xls").Sheets("Graph1") plutot que d'écrire à chaque fois
l'intégralité du texte ne sert qu'à alléger le code et le rendre + lisible.

De plus , tu ne peux pas écrire moy = feuilGraph1.Range("O11") si tu veux
définir moy de type range, il faut écrire set moy þuilGraph1.Range("O11")
sauf si tu veux en obtenir la valeur bien sur.


A+




Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une feuille ou
bien est ce mieux d'écrire Workbooks("flux.xls").Sheets("Graph1") à
chaque fois ?

merci pour l'aide
--
à+twinley





--
Cordialement,

Michel Gaboly
www.gaboly.com





Avatar
twinley
ben ça alors, c'est pratique...

à+twinley

Pourquoi pas :

moy = [[flux.xls]Graph1!O11]

AV




Avatar
twinley
Merci à touts les trois, ce sont ces connaissances qui me manquaient.

à+twinley

Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une feuille ou
bien est ce mieux d'écrire Workbooks("flux.xls").Sheets("Graph1") à
chaque fois ?

merci pour l'aide


Avatar
twinley
Graph1 est un nom de feuille. J'ai aisément adapté avec vos brillantes
explications.
Y avait pas de piège de ma part mais un manque de rigueur dans ma
programmation.
C'est la feuille Graph1 qui contient le graphique Graphique1.

à+twinley

Re,

Effectivement, tu as raison ;-))

Sauf s'il cherche à nous induire en erreur ;-)) en ayant nommé "Graph1"
une feuille de calcul, parce qu'elle contient un ou plusieurs graphiques.

Auquel cas, "Graph1" serait un objet Worksheet et non Chart.



si feuilGraph1 est de type chart, je ne vois pas comment il est
possible de faire référence à une plage de cellules.

A+



bonjour,

si feuilGraph1 est une feuille graphique, c'est As Chart. Si c'est
une feuille de calcul c'est As worksheet.

Il n' y a pas d'objet sheet mais une collection sheets qui comprend
les feuilles de type worksheet et de type Chart.
En conséquence, dans le cas où p. ton classeur contient 1 feuille
graphique et une feuille de calcul, une boucle comme celle ci fonctionne

for each sh in sheets
msgbox typename(sh)
next

mais la meme boucle avec Dim sh as Chart ou dim sh as worksheet en
déclaration ne passe pas la barre du débogger.Donc si tu as des
boucles comme ci- dessus à faire et que ton classeur ne contient pas
qu'un seul type de feuille, autant ne pas déclarer la variable de
boucle ou alors il faut gerer les erreurs potentielles.

Enfin écrire uen fois pour toute dans ton programme set wsh
=Workbooks("flux.xls").Sheets("Graph1") plutot que d'écrire à chaque
fois l'intégralité du texte ne sert qu'à alléger le code et le rendre
+ lisible.

De plus , tu ne peux pas écrire moy = feuilGraph1.Range("O11") si tu
veux définir moy de type range, il faut écrire set moy
þuilGraph1.Range("O11") sauf si tu veux en obtenir la valeur bien
sur.


A+




Bonjour,

comment dois-je déclarer feuilGraph1 qui est un "raccourci" pour
désigner la feuille d'un classeur ?


Dim feuilGraph1 As ?
Set feuilGraph1 = Workbooks("flux.xls").Sheets("Graph1")
moy = feuilGraph1.Range("O11")


si je met Dim feuilGraph1 As Sheets, il bute sur range("O11").

Autre question, est-ce une façon performante de manipuler une
feuille ou bien est ce mieux d'écrire
Workbooks("flux.xls").Sheets("Graph1") à chaque fois ?

merci pour l'aide
--
à+twinley











1 2