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
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.
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.
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'
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
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
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.
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.