XL 2016 Masquer Démasquer onglets - bug macro

  • Initiateur de la discussion Initiateur de la discussion ALE37
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

ALE37

XLDnaute Junior
Bonjour le Forum, j'ai un fichier sur lequel j'ai écrit une macro qui me permet de masquer ou démasquer certains onglets.
Tout fonctionne très bien sauf quand je rajoute dans l'éditeur de macro un onglet supplémentaire à masquer ou démasquer.
Dans le cas présent il s'agit de l'onglet "TABLE". La macro Bug sur "SHEETS("SUIVI").SELECT ?? Pourquoi celà pose t'il problème ?
Que manque t il dans l'instruction ? Peut on faire plus simple ?

Sub masquer_demasquer()
Application.ScreenUpdating = False
Dim osh As Object '1seule opération pour masquer ou démasquer tous les onglets sauf....
For Each osh In ThisWorkbook.Sheets
If osh.Name <> "SUIVI" Then osh.Visible = Not osh.Visible
If osh.Name <> "SYNTHESE" Then osh.Visible = Not osh.Visible
If osh.Name <> "ANTERIORITE" Then osh.Visible = Not osh.Visible
If osh.Name <> "TABLE" Then osh.Visible = Not osh.Visible
Next osh
Sheets("SUIVI").Select
End Sub

D'avance merci de votre aide!
 

Pièces jointes

Solution
Bonjour @jmfmarques,
C'est en tout cas exactement comme ça que j'imaginais l'écriture.
Mais pour moi le code d'origine semble vouloir faire exactement l'inverse.
En effet les feuilles ayant un des 4 noms voient leur propriété Visible basculée 3 fois, donc basculée au bout du compte, les autres 4 fois donc inchangée à la fin.
Bonjour

Si j'étais moi, je ferai un truc du genre
Mais si j'étais moi, je méfierai 😉
VB:
Sub Masquer_Demasquer()
Dim ws As Worksheet, NO_SEE$
Application.ScreenUpdating = False
NO_SEE = "SUIVISYNTHESEANTERIORITETABLE"
For Each ws In Worksheets
ws.Visible = Not ws.Visible = (InStr(1, NO_SEE, ws.Name) > 0)
Next
End Sub
 
Bonjour Ale, Staple,
Ale, dans l'état votre macro ne peut qu'avoir un problème.
Vous masquez puis sélectionnez la feuille SUIVI .
Si vous voulez vraiment finir la macro avec la feuille SUIVI affichée, alors ne la masquez pas.
 
Re, Bonsoir Sylvanu (oui, je prends de l'avance)

Alors si il faut SUIVRE, suivons 😉
VB:
Sub Masquer_D_emasquer()
Dim ws As Worksheet, NO_SEE$
Application.ScreenUpdating = False
NO_SEE = "SYNTHESEANTERIORITETABLE"
For Each ws In Worksheets
ws.Visible = Not ws.Visible = (InStr(1, NO_SEE, ws.Name) > 0)
Next
End Sub
 
Bonjour.
Information: Pour tester l'égalité de deux Boolean c'est normalement l'opérateur 'Eqv", non '='. De plus il dispenserait des parenthèses, car tous les opérateurs arithmétiques et relationnels lui sont prioritaires. Pour '<>' c'est 'Xor'
 
Re

Donc en suivant le conseil de Dranreb (merci)
VB:
Sub Masquer_Demasquer_EQV()
Dim ws As Worksheet, NO_SEE$
Application.ScreenUpdating = False
NO_SEE = "SYNTHESEANTERIORITETABLE"
For Each ws In Worksheets
ws.Visible = Not ws.Visible Eqv InStr(1, NO_SEE, ws.Name) > 0
Next
End Sub
 
Bonjour
Pure question de logique
Dans ce code, qui est une succession d'expressions conditionnelles distinctes :
For Each osh In ThisWorkbook.Sheets
If osh.Name <> "SUIVI" Then osh.Visible = Not osh.Visible
If osh.Name <> "SYNTHESE" Then osh.Visible = Not osh.Visible
If osh.Name <> "ANTERIORITE" Then osh.Visible = Not osh.Visible
If osh.Name <> "TABLE" Then osh.Visible = Not osh.Visible
Next osh
Sheets("SUIVI").Select

Il suffit (par exemple et entre autres) que la feuille "TABLE" soit visible au départ pour que la feuille "SUIVI" parcourue après la feuille "TABLE" (par définition <> "TABLE") devienne non visible (not osh.visible).
C'est donc dans les idées, qu'il convient de remettre un peu d'ordre. 🙂
 
ET ? ben ... si l'on s'en tient à ce que semble vouloir faire le code, on ne "bascule" d'un état à l'autre que les feuilles autres que celles nommées "SUIVI", "SYNTHESE", "ANTERIORITE" et "TABLE"
--->>
VB:
select case osh.name

  case "SUIVI", "SYNTHESE", "ANTERIORITE", "TABLE"

  case else

    osh.visible = not osh.visible

end select
 
Re

Donc en suivant le conseil de Dranreb (merci)
VB:
Sub Masquer_Demasquer_EQV()
Dim ws As Worksheet, NO_SEE$
Application.ScreenUpdating = False
NO_SEE = "SYNTHESEANTERIORITETABLE"
For Each ws In Worksheets
ws.Visible = Not ws.Visible Eqv InStr(1, NO_SEE, ws.Name) > 0
Next
End Sub

Bonsoir Stapple, Sylvanu et Dranreb, ce sont des solutions que je ne connaissais pas. Je viens effectivement de tester. Celà fonctionne trés bien en effet. Merci pour votre aide!
 
ET ? ben ... si l'on s'en tient à ce que semble vouloir faire le code, on ne "bascule" d'un état à l'autre que les feuilles autres que celles nommées "SUIVI", "SYNTHESE", "ANTERIORITE" et "TABLE"
--->>
VB:
select case osh.name

  case "SUIVI", "SYNTHESE", "ANTERIORITE", "TABLE"

  case else

    osh.visible = not osh.visible

end select
Bonsoir Jmfmarques, c'est une histoire de logique qui m'a fait défaut. Merci pour m'avoir remis les idées en ordre. Cette solution corrige mon code de départ. Je vais tester également.
 
Bonjour @jmfmarques,
C'est en tout cas exactement comme ça que j'imaginais l'écriture.
Mais pour moi le code d'origine semble vouloir faire exactement l'inverse.
En effet les feuilles ayant un des 4 noms voient leur propriété Visible basculée 3 fois, donc basculée au bout du compte, les autres 4 fois donc inchangée à la fin.
 
Notre forum d’entraide est 100 % gratuit et le restera.
Aucune formation payante, aucun fichier à acheter, rien à vendre. Mais comme tout site, nous devons couvrir nos frais pour continuer à vous accompagner.
Soutenez-nous en souscrivant à un compte membre : c’est rapide, vous choisissez simplement votre niveau de soutien et le tour est joué.

Je soutiens la communauté et j’accède à mon compte membre

Discussions similaires

Réponses
14
Affichages
534
Réponses
5
Affichages
369
Réponses
1
Affichages
465
Retour