XL 2016 Masquer Démasquer onglets - bug macro

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

  • Masquer demasquer test.xlsm
    461.1 KB · Affichages: 5
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.

Staple1600

XLDnaute Barbatruc
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
 

Staple1600

XLDnaute Barbatruc
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
 

Dranreb

XLDnaute Barbatruc
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'
 

Staple1600

XLDnaute Barbatruc
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
 

jmfmarques

XLDnaute Accro
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. :)
 

jmfmarques

XLDnaute Accro
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
 

ALE37

XLDnaute Junior
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!
 

ALE37

XLDnaute Junior
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.
 

Dranreb

XLDnaute Barbatruc
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.
 

Discussions similaires

Statistiques des forums

Discussions
312 115
Messages
2 085 456
Membres
102 891
dernier inscrit
cocowild