OVH Cloud OVH Cloud

Débogage d'une macro

5 réponses
Avatar
michel-hirard
Bonsoir à toutes et tous,
Deux questions pour ce soir.

1) Voilà , j'ai récupéré sur le forum une macro qui fait bien mon affaire,
sauf que la seconde bogue sur "SaPropriétéVisible()" et je ne vois pas
pourquoi...
2) J'aimerais afficher simultanément la feuille de mon classeur et la
fenêtre de code de l'éditeur, afin de suivre l'exécution de ma macro par F8
successifs
Le menu Fenêtre ne permet pas de le faire. Y a-t-il une solution ?

Sub DemasquerLesFeuillesMasquees()

ReDim NomDeLafeuille(ThisWorkbook.Sheets.Count)
ReDim SaProprieteVisible(ThisWorkbook.Sheets.Count)

For i = 1 To ThisWorkbook.Sheets.Count
'Conserver le nom des feuilles dans la variable NomDeLafeuille()
'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()
NomDeLafeuille(i) = ThisWorkbook.Sheets(i).Name
SaProprieteVisible(i) = ThisWorkbook.Sheets(i).Visible
'Mettre la propriété Visible de toutes les feuilles à Vrai
ThisWorkbook.Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For Each MaFeuille In Worksheets
For i = 1 To UBound(NomDeLafeuille)
If MaFeuille.Name = NomDeLafeuille(i) Then
MaFeuille.Visible = SaProprieteVisible(i)
Exit For
End If
Next
Next
End Sub

Merci pour tout,
Michel

5 réponses

Avatar
Michel Gaboly
Bonsoir,

Les 2 lignes ci-dessous

'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()

forment un commentaire qui était très probablement à l'origine sur
une seule ligne. Tout commentaire doit être précédé d'une apostrophe
(ou du mot-clef "Rem" qui remonte aux origines du langage Basic,
que personne ou presque n'utilise en VBA).

Si un commentaire fait + d'une ligne, il faut une apostrophe au début
de chaque ligne de commentaire.

Il faut donc enlever le retour chariot avant "SaProprieteVisible()"
pour n'avoir + qu'une ligne, ou si tu veux conserver 2 lignes, faire
précéder ce mot d'une apostrophe.

Voilà.



Bonsoir à toutes et tous,
Deux questions pour ce soir.

1) Voilà , j'ai récupéré sur le forum une macro qui fait bien mon affaire,
sauf que la seconde bogue sur "SaPropriétéVisible()" et je ne vois pas
pourquoi...
2) J'aimerais afficher simultanément la feuille de mon classeur et la
fenêtre de code de l'éditeur, afin de suivre l'exécution de ma macro par F8
successifs
Le menu Fenêtre ne permet pas de le faire. Y a-t-il une solution ?

Sub DemasquerLesFeuillesMasquees()

ReDim NomDeLafeuille(ThisWorkbook.Sheets.Count)
ReDim SaProprieteVisible(ThisWorkbook.Sheets.Count)

For i = 1 To ThisWorkbook.Sheets.Count
'Conserver le nom des feuilles dans la variable NomDeLafeuille()
'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()
NomDeLafeuille(i) = ThisWorkbook.Sheets(i).Name
SaProprieteVisible(i) = ThisWorkbook.Sheets(i).Visible
'Mettre la propriété Visible de toutes les feuilles à Vrai
ThisWorkbook.Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For Each MaFeuille In Worksheets
For i = 1 To UBound(NomDeLafeuille)
If MaFeuille.Name = NomDeLafeuille(i) Then
MaFeuille.Visible = SaProprieteVisible(i)
Exit For
End If
Next
Next
End Sub

Merci pour tout,
Michel


--
Cordialement,

Michel Gaboly
http://www.gaboly.com

Avatar
michel-hirard
Merci Michel pour ta réponse, tu as raison c'est un commentaire,
mais c'est la seconde macro qui bloque "DemasquerLesFeuillesMasquees()"
ligne: MaFeuille.Visible = SaProprieteVisible(i).
J'ai recopié les deux pour donner le contexte et cela peut interresser
quelqu'un
La réponse à la seconde question (affichage simultané de la feuille du
classeur et de la fenêtre de code )
m'interreserait également si tu as un conseil.

Michel,


"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Les 2 lignes ci-dessous

'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()

forment un commentaire qui était très probablement à l'origine sur
une seule ligne. Tout commentaire doit être précédé d'une apostrophe
(ou du mot-clef "Rem" qui remonte aux origines du langage Basic,
que personne ou presque n'utilise en VBA).

Si un commentaire fait + d'une ligne, il faut une apostrophe au début
de chaque ligne de commentaire.

Il faut donc enlever le retour chariot avant "SaProprieteVisible()"
pour n'avoir + qu'une ligne, ou si tu veux conserver 2 lignes, faire
précéder ce mot d'une apostrophe.

Voilà.



Bonsoir à toutes et tous,
Deux questions pour ce soir.

1) Voilà , j'ai récupéré sur le forum une macro qui fait bien mon
affaire,


sauf que la seconde bogue sur "SaPropriétéVisible()" et je ne vois pas
pourquoi...
2) J'aimerais afficher simultanément la feuille de mon classeur et la
fenêtre de code de l'éditeur, afin de suivre l'exécution de ma macro par
F8


successifs
Le menu Fenêtre ne permet pas de le faire. Y a-t-il une solution ?

Sub DemasquerLesFeuillesMasquees()

ReDim NomDeLafeuille(ThisWorkbook.Sheets.Count)
ReDim SaProprieteVisible(ThisWorkbook.Sheets.Count)

For i = 1 To ThisWorkbook.Sheets.Count
'Conserver le nom des feuilles dans la variable NomDeLafeuille()
'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()
NomDeLafeuille(i) = ThisWorkbook.Sheets(i).Name
SaProprieteVisible(i) = ThisWorkbook.Sheets(i).Visible
'Mettre la propriété Visible de toutes les feuilles à Vrai
ThisWorkbook.Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For Each MaFeuille In Worksheets
For i = 1 To UBound(NomDeLafeuille)
If MaFeuille.Name = NomDeLafeuille(i) Then
MaFeuille.Visible = SaProprieteVisible(i)
Exit For
End If
Next
Next
End Sub

Merci pour tout,
Michel


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
Michel Gaboly
Re,

Désolé ;-(((

Le plantage vient de le portée des 2 variables SaProprieteVisible et
NomDeLafeuille, qui sont probablement de niveau procédure :

Elles sont mise à jour dans la Sub DemasquerLesFeuillesMasquees,
mais inutilisables dans la Sub RemasquerLesFeuillesDemasquees

Il faut que tu leur doonnes une portée de niveau module (au minimum)
Pour cela, ajoute cette ligne en haut du module concerné :

Dim SaProprieteVisible(), NomDeLafeuille()

et cela fonctionnera.

Plus d'infos sur la portée ici :

http://www.gaboly.com/VBA/Portee.html


NB - Il est impératif de lancer une première fois
DemasquerLesFeuillesMasquees avant de lancer
RemasquerLesFeuillesDemasquees afin que les 2 variables soient
initialisées.


Pour la seconde question, il faut simplement redimensionner les
2 fenêtres Excel et VBA afin de pouvoir les visualiser en même temps.

Un recouvrement partiel n'est pas forcément génant si tu vois la partie
du document qui t'intéresse.




Merci Michel pour ta réponse, tu as raison c'est un commentaire,
mais c'est la seconde macro qui bloque "DemasquerLesFeuillesMasquees()"
ligne: MaFeuille.Visible = SaProprieteVisible(i).
J'ai recopié les deux pour donner le contexte et cela peut interresser
quelqu'un
La réponse à la seconde question (affichage simultané de la feuille du
classeur et de la fenêtre de code )
m'interreserait également si tu as un conseil.

Michel,

"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Les 2 lignes ci-dessous

'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()

forment un commentaire qui était très probablement à l'origine sur
une seule ligne. Tout commentaire doit être précédé d'une apostrophe
(ou du mot-clef "Rem" qui remonte aux origines du langage Basic,
que personne ou presque n'utilise en VBA).

Si un commentaire fait + d'une ligne, il faut une apostrophe au début
de chaque ligne de commentaire.

Il faut donc enlever le retour chariot avant "SaProprieteVisible()"
pour n'avoir + qu'une ligne, ou si tu veux conserver 2 lignes, faire
précéder ce mot d'une apostrophe.

Voilà.



Bonsoir à toutes et tous,
Deux questions pour ce soir.

1) Voilà , j'ai récupéré sur le forum une macro qui fait bien mon
affaire,


sauf que la seconde bogue sur "SaPropriétéVisible()" et je ne vois pas
pourquoi...
2) J'aimerais afficher simultanément la feuille de mon classeur et la
fenêtre de code de l'éditeur, afin de suivre l'exécution de ma macro par
F8


successifs
Le menu Fenêtre ne permet pas de le faire. Y a-t-il une solution ?

Sub DemasquerLesFeuillesMasquees()

ReDim NomDeLafeuille(ThisWorkbook.Sheets.Count)
ReDim SaProprieteVisible(ThisWorkbook.Sheets.Count)

For i = 1 To ThisWorkbook.Sheets.Count
'Conserver le nom des feuilles dans la variable NomDeLafeuille()
'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()
NomDeLafeuille(i) = ThisWorkbook.Sheets(i).Name
SaProprieteVisible(i) = ThisWorkbook.Sheets(i).Visible
'Mettre la propriété Visible de toutes les feuilles à Vrai
ThisWorkbook.Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For Each MaFeuille In Worksheets
For i = 1 To UBound(NomDeLafeuille)
If MaFeuille.Name = NomDeLafeuille(i) Then
MaFeuille.Visible = SaProprieteVisible(i)
Exit For
End If
Next
Next
End Sub

Merci pour tout,
Michel


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com



Avatar
michel-hirard
OK Michel,
Ecore une seule question qui est vraiment celle d'un néophyte
Ma macro bloque sur :
For i = 1 To UBound(NomDeLafeuille)
Vois-tu pourquoi ?

Merci encore,
Michel,

"Michel Gaboly" a écrit dans le message de
news:
Re,

Désolé ;-(((

Le plantage vient de le portée des 2 variables SaProprieteVisible et
NomDeLafeuille, qui sont probablement de niveau procédure :

Elles sont mise à jour dans la Sub DemasquerLesFeuillesMasquees,
mais inutilisables dans la Sub RemasquerLesFeuillesDemasquees

Il faut que tu leur doonnes une portée de niveau module (au minimum)
Pour cela, ajoute cette ligne en haut du module concerné :

Dim SaProprieteVisible(), NomDeLafeuille()

et cela fonctionnera.

Plus d'infos sur la portée ici :

http://www.gaboly.com/VBA/Portee.html


NB - Il est impératif de lancer une première fois
DemasquerLesFeuillesMasquees avant de lancer
RemasquerLesFeuillesDemasquees afin que les 2 variables soient
initialisées.


Pour la seconde question, il faut simplement redimensionner les
2 fenêtres Excel et VBA afin de pouvoir les visualiser en même temps.

Un recouvrement partiel n'est pas forcément génant si tu vois la partie
du document qui t'intéresse.




Merci Michel pour ta réponse, tu as raison c'est un commentaire,
mais c'est la seconde macro qui bloque "DemasquerLesFeuillesMasquees()"
ligne: MaFeuille.Visible = SaProprieteVisible(i).
J'ai recopié les deux pour donner le contexte et cela peut interresser
quelqu'un
La réponse à la seconde question (affichage simultané de la feuille du
classeur et de la fenêtre de code )
m'interreserait également si tu as un conseil.

Michel,

"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Les 2 lignes ci-dessous

'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()

forment un commentaire qui était très probablement à l'origine sur
une seule ligne. Tout commentaire doit être précédé d'une apostrophe
(ou du mot-clef "Rem" qui remonte aux origines du langage Basic,
que personne ou presque n'utilise en VBA).

Si un commentaire fait + d'une ligne, il faut une apostrophe au début
de chaque ligne de commentaire.

Il faut donc enlever le retour chariot avant "SaProprieteVisible()"
pour n'avoir + qu'une ligne, ou si tu veux conserver 2 lignes, faire
précéder ce mot d'une apostrophe.

Voilà.



Bonsoir à toutes et tous,
Deux questions pour ce soir.

1) Voilà , j'ai récupéré sur le forum une macro qui fait bien mon
affaire,


sauf que la seconde bogue sur "SaPropriétéVisible()" et je ne vois
pas




pourquoi...
2) J'aimerais afficher simultanément la feuille de mon classeur et
la




fenêtre de code de l'éditeur, afin de suivre l'exécution de ma macro
par




F8
successifs
Le menu Fenêtre ne permet pas de le faire. Y a-t-il une solution
?





Sub DemasquerLesFeuillesMasquees()

ReDim NomDeLafeuille(ThisWorkbook.Sheets.Count)
ReDim SaProprieteVisible(ThisWorkbook.Sheets.Count)

For i = 1 To ThisWorkbook.Sheets.Count
'Conserver le nom des feuilles dans la variable NomDeLafeuille()
'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()
NomDeLafeuille(i) = ThisWorkbook.Sheets(i).Name
SaProprieteVisible(i) = ThisWorkbook.Sheets(i).Visible
'Mettre la propriété Visible de toutes les feuilles à Vrai
ThisWorkbook.Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For Each MaFeuille In Worksheets
For i = 1 To UBound(NomDeLafeuille)
If MaFeuille.Name = NomDeLafeuille(i) Then
MaFeuille.Visible = SaProprieteVisible(i)
Exit For
End If
Next
Next
End Sub

Merci pour tout,
Michel


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com







Avatar
Michel Gaboly
Re,

Chez moi cela marche. As-tu noté qu'il est nécessaire que
DemasquerLesFeuillesMasquees ait été lancé en premier ?

Sinon, UBound(NomDeLafeuille) est égal à 0 (zéro) car non
encore initialisé, et cela devient

For i = 1 to 0
...

Mais cela ne devrait pas suffire à provoquer un plantage. Il
n'y a simplement aucun passage dans la boucle.

Voici le code avec lequel j'ai testé après avoir créé un classeur
avec 2 feuilles, masqué l'une d'elles et inséré un module conte-
nant le code


' Option Explicit
Dim SaProprieteVisible(), NomDeLafeuille()

Sub DemasquerLesFeuillesMasquees()

ReDim NomDeLafeuille(ThisWorkbook.Sheets.Count)
ReDim SaProprieteVisible(ThisWorkbook.Sheets.Count)

For i = 1 To ThisWorkbook.Sheets.Count
'Conserver le nom des feuilles dans la variable NomDeLafeuille()
'Conserver la valeur de la propriété .Visible dans la variableSaProprieteVisible()
NomDeLafeuille(i) = ThisWorkbook.Sheets(i).Name
SaProprieteVisible(i) = ThisWorkbook.Sheets(i).Visible
'Mettre la propriété Visible de toutes les feuilles à Vrai
ThisWorkbook.Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For Each MaFeuille In Worksheets
For i = 1 To UBound(NomDeLafeuille)
If MaFeuille.Name = NomDeLafeuille(i) Then
MaFeuille.Visible = SaProprieteVisible(i)
Exit For
End If
Next
Next
End Sub


Ce code résulte (à part le Dim SaProprieteVisible(), Nom-
DeLafeuille() d'un copier Coller en proveance de ton premier
message.

Pour pouvoir utiliser le module avec le classeur actif
et pas seulement le classeur contenant le code, il faut rem-
placer ThisWorkbook par ActiveWorkbook dans Demasquer-
LesFeuillesMasquees (6 occurrences). En fait, Sheets sans
qualificatif, équivaut à ActiveWorkbook.Sheets et suffit donc.

Par ailleurs, il est inutile d'avoir 2 boucles imbriquées,
et on peut se passer également de NomDeLafeuille, ce qui
donne :


' Option Explicit
Dim SaProprieteVisible()

Sub DemasquerLesFeuillesMasquees()
ReDim SaProprieteVisible(ActiveWorkbook.Sheets.Count)
For i = 1 To Sheets.Count
' Conserver la valeur de la propriété .Visible dans la variableSaProprieteVisible()
SaProprieteVisible(i) = Sheets(i).Visible
' Mettre la propriété Visible de toutes les feuilles à Vrai
Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For i = 1 To Sheets.Count
Sheets(i).Visible = SaProprieteVisible(i)
Next
End Sub


NB- Attention aux retours à la ligne provoqués par ton lecteur
de news.



OK Michel,
Ecore une seule question qui est vraiment celle d'un néophyte
Ma macro bloque sur :
For i = 1 To UBound(NomDeLafeuille)
Vois-tu pourquoi ?

Merci encore,
Michel,

"Michel Gaboly" a écrit dans le message de
news:
Re,

Désolé ;-(((

Le plantage vient de le portée des 2 variables SaProprieteVisible et
NomDeLafeuille, qui sont probablement de niveau procédure :

Elles sont mise à jour dans la Sub DemasquerLesFeuillesMasquees,
mais inutilisables dans la Sub RemasquerLesFeuillesDemasquees

Il faut que tu leur doonnes une portée de niveau module (au minimum)
Pour cela, ajoute cette ligne en haut du module concerné :

Dim SaProprieteVisible(), NomDeLafeuille()

et cela fonctionnera.

Plus d'infos sur la portée ici :

http://www.gaboly.com/VBA/Portee.html


NB - Il est impératif de lancer une première fois
DemasquerLesFeuillesMasquees avant de lancer
RemasquerLesFeuillesDemasquees afin que les 2 variables soient
initialisées.


Pour la seconde question, il faut simplement redimensionner les
2 fenêtres Excel et VBA afin de pouvoir les visualiser en même temps.

Un recouvrement partiel n'est pas forcément génant si tu vois la partie
du document qui t'intéresse.




Merci Michel pour ta réponse, tu as raison c'est un commentaire,
mais c'est la seconde macro qui bloque "DemasquerLesFeuillesMasquees()"
ligne: MaFeuille.Visible = SaProprieteVisible(i).
J'ai recopié les deux pour donner le contexte et cela peut interresser
quelqu'un
La réponse à la seconde question (affichage simultané de la feuille du
classeur et de la fenêtre de code )
m'interreserait également si tu as un conseil.

Michel,

"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Les 2 lignes ci-dessous

'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()

forment un commentaire qui était très probablement à l'origine sur
une seule ligne. Tout commentaire doit être précédé d'une apostrophe
(ou du mot-clef "Rem" qui remonte aux origines du langage Basic,
que personne ou presque n'utilise en VBA).

Si un commentaire fait + d'une ligne, il faut une apostrophe au début
de chaque ligne de commentaire.

Il faut donc enlever le retour chariot avant "SaProprieteVisible()"
pour n'avoir + qu'une ligne, ou si tu veux conserver 2 lignes, faire
précéder ce mot d'une apostrophe.

Voilà.



Bonsoir à toutes et tous,
Deux questions pour ce soir.

1) Voilà , j'ai récupéré sur le forum une macro qui fait bien mon
affaire,


sauf que la seconde bogue sur "SaPropriétéVisible()" et je ne vois
pas




pourquoi...
2) J'aimerais afficher simultanément la feuille de mon classeur et
la




fenêtre de code de l'éditeur, afin de suivre l'exécution de ma macro
par




F8
successifs
Le menu Fenêtre ne permet pas de le faire. Y a-t-il une solution
?





Sub DemasquerLesFeuillesMasquees()

ReDim NomDeLafeuille(ThisWorkbook.Sheets.Count)
ReDim SaProprieteVisible(ThisWorkbook.Sheets.Count)

For i = 1 To ThisWorkbook.Sheets.Count
'Conserver le nom des feuilles dans la variable NomDeLafeuille()
'Conserver la valeur de la propriété .Visible dans la variable
SaProprieteVisible()
NomDeLafeuille(i) = ThisWorkbook.Sheets(i).Name
SaProprieteVisible(i) = ThisWorkbook.Sheets(i).Visible
'Mettre la propriété Visible de toutes les feuilles à Vrai
ThisWorkbook.Sheets(i).Visible = True
Next i
End Sub

Sub RemasquerLesFeuillesDemasquees()
For Each MaFeuille In Worksheets
For i = 1 To UBound(NomDeLafeuille)
If MaFeuille.Name = NomDeLafeuille(i) Then
MaFeuille.Visible = SaProprieteVisible(i)
Exit For
End If
Next
Next
End Sub

Merci pour tout,
Michel


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com