Home – Le CFO masqué › Forums › VBA › Sélectionner onglets pairs ou impairs
- This topic has 17 replies, 2 voices, and was last updated 7 years, 4 months ago by
Philgood.001.
-
AuthorPosts
-
31 March 2017 at 21 h 59 min #34367
Philgood.001
ParticipantBonjour,
Je cherche désespérément sur Google la fonction suivante, mais sans succès :
Aller au 4è onglet (en partant de la gauche) et sélectionner tous les onglets pairs (par N° d’Index).
L’idée est de faire 3 boutons sur le bandeau Excel :
– 1 bouton pour sélectionner les onglets à l’index pair
– 1 bouton pour sélectionner les onglets à l’index impair
– 1 bouton pour sélectionner tous les ongletsEn fait, j’ai des tableaux de reporting répartis sur 2 x 12 mois + idem pour les graphiques correspondants (total 48 onglets + 3 onglets de tests).
(Je ne peux pas mettre les graphiques sur les onglets des tableaux correspondants car il y a une macro d’impression pour les tableaux et l’ajout des graphiques correspondants sur les mêmes onglets parasitent la macro d’impression des tableaux.)
L’objectif est donc d’avoir chaque fois l’onglet de tableaux + l’onglet de graphique à côté, et de pouvoir sélectionner en un clic tous les onglets de l’un ou de l’autre pour appliquer les mêmes modifications en une seule fois.J’espère que vous aurez la solution, je suis surpris de ne rien avoir trouvé d’existant…
Bon we.
Merci.
1 April 2017 at 4 h 09 min #34369Philgood.001
ParticipantPS : Je tiens à préciser que je ne veux pas indiquer le nombre d’onglets à inclure dans le code. Celui-ci doit s’adapter au nombre d’onglets au fur et à mesure des variations.
En effet, chaque année je rajouterai 12 nouveaux onglets, et je ne veux pas avoir à modifier chaque fois le code, d’autant plus que mes collègues ne maîtrisent pas du tout le VBA…Merci.
4 April 2017 at 3 h 07 min #34394Francis Paquet
ParticipantBonjour,
Je vous propose le code VBA suivant (pour sélectionner les onglets pairs au dessus de 3):
Sub SelectPair() Dim i As Integer, iCount As Integer Dim strSheetSelected() As String For i = 4 To Sheets.Count If i Mod 2 = 0 Then ' C'est un index pair If Sheets(i).Visible = xlSheetVisible Then ReDim Preserve strSheetSelected(iCount) strSheetSelected(iCount) = Sheets(i).Name iCount = iCount + 1 End If End If Next i Sheets(strSheetSelected).Select End Sub
Pour les onglets impairs changer la condition pour IF i Mod 2 = 1 then.
Pour tous les onglets, enlever le premier IF (IF i Mod 2 = 0 then).Voilà,
Francis
12 April 2017 at 19 h 14 min #34482Philgood.001
ParticipantBonjour Francis,
Désolé pour ma réponse tardive…
Votre code est excellent, ultra léger et donc ultra rapide.
Je prends!!!Merci à vous.
A bientôt.
16 April 2017 at 5 h 26 min #34507Philgood.001
ParticipantRe-bonjour Francis,
Vu le code hyper-light que tu as trouvé la semaine dernière, je me permets d’abuser de tes compétences… et de ta patience :
Aurais-tu une variante pour :– masquer les onglets pairs
– masquer les onglets impairs
– tout démasquerdans une version aussi light que la précédente.
J’en ai bien un (ci-dessous) mais avec 24 onglets, je me rends compte que la formule est lourde pour le CPU :
Sub MASQUER_PAIRS() Dim Sht As Worksheet For Each Sht In ActiveWorkbook.Sheets 'tout déselectionner Sht.Select Replace:=True Next Sheets(Sheets.Count).Select Replace:=True ind = 1 For Each Sht In ActiveWorkbook.Sheets If ind Mod 2 = 0 And ind > 5 Then 'si pair Sht.Select Replace:=False End If ind = ind + 1 Sheets(Sheets.Count - 1).Activate Sheets(1).Visible = False Sheets(2).Visible = False Sheets(3).Visible = False Sheets(4).Visible = False Sheets(5).Visible = False Next Sht ActiveWindow.SelectedSheets.Visible = False End Sub
Sub MASQUER_IMPAIRS() Dim Sht As Worksheet For Each Sht In ActiveWorkbook.Sheets 'tout déselectionner Sht.Select Replace:=True Next Sheets(Sheets.Count).Select Replace:=True ind = 1 For Each Sht In ActiveWorkbook.Sheets If ind Mod 2 <> 0 And ind > 5 Then 'si impair Sht.Select Replace:=False End If ind = ind + 1 Sheets(1).Visible = False Sheets(2).Visible = False Sheets(3).Visible = False Sheets(4).Visible = False Sheets(5).Visible = False Next Sht ActiveWindow.SelectedSheets.Visible = False Sheets(6).Select End Sub
Sub TOUT_DEMASQUER() Dim Feuille As Object For Each Feuille In ActiveWorkbook.Sheets Feuille.Visible = xlSheetVisible Next Sheets(6).Select End Sub
Merci à toi Francis.
Bon we.
16 April 2017 at 13 h 18 min #34508Francis Paquet
ParticipantBonjour,
Le code devrait être, tout simplement:
Pour masquer les onglets pairsSub MasquerPair() Dim i As Integer For i = 4 To Sheets.Count If i Mod 2 = 0 Then ' C'est un index pair Sheets(i).Visible = xlSheetHidden End If Next i End Sub
Pour les onglets impair faire le IF i mod 2 = 1 then
Pour démasquer, votre approche est bonne.Francis
16 April 2017 at 21 h 29 min #34511Philgood.001
ParticipantBonjour Francis,
Vous êtes un chef!
Exactement ce que je cherchais! Avec votre code, le masquage est instantané. Le mien le faisait en 2 étapes : d’abord la sélection des onglets puis le masquage de ces derniers.
(enfin le mien… disons le code que j’ai récupéré ailleurs sur le net…).Du coup pour la formule de démasquage, j’ai repris votre base et l’ai modifiée pour obtenir ceci :
Sub TOUT_DEMASQUER() Dim i As Integer For i = 1 To Sheets.Count Sheets(i).Visible = xlSheetVisible Next i Sheets(1).Select Sheets(6).Select End Sub
Mais il me fait défiler tous les onglets du 1er au dernier, tout comme la formule que j’avais initialement. Auriez-vous une idée pour un démasquage aussi instantané que les 2 formules de masquages que vous m’avez proposées?
Merci à vous Francis.
A bientôt.
17 April 2017 at 1 h 08 min #34512Francis Paquet
ParticipantBonjour,
Il est difficile de faire mieux. Vous pourriez toutefois tenter une commande comme
IF Sheets(i).Visible <> xlSheetVisible THEN Sheets(i).Visible = xlSheetVisible
Cela sauverait un peu de CPU…
Francis
21 April 2017 at 21 h 42 min #34597Philgood.001
ParticipantBonjour Francis,
Merci pour la 2è proposition, mais en effet ça ne change rien, notamment quant à la vitesse.
Je garde donc la 1ère version, plus simple à comprendre pour le noob que je suis en VBA…
Merci beaucoup pour votre aide depuis le début.
Je reviendrai peut-être vers vous bientôt, mais cette fois-ci concernant une formule INDIRECT Excel qui me fait des misères.
Mais j’essaie d’abord de trouver seul, sinon toc toc!Merci encore.
Philgood.001
23 April 2017 at 2 h 00 min #34611Philgood.001
ParticipantBonjour Francis,
Bon finalement après plusieurs tentatives sans succès, voici ma 2è problématique toujours liée au même tableau:
J’ai mes onglets suivants nommés comme suit:
01.16 Tab – 01.16 Gra – 02.16 Tab – 02.16 Gra – 03.16 Tab – 03.16 Gra – …
Ça continue sur 2017 et c’est amené à faire de même pour les années à suivre, tout ça sur le même classeur.
Le but du jeu est de faire un rappel du contenu de la cellule F45 de l’onglet Tab du mois précédent (ex: 02.16 Tab) dans la cellule G45 de l’onglet Tab du mois suivant (ex: 03.16 Tab), mais en utilisant une formule générique, donc non nominative.
J’ai bien trouvé une formule proposée par http://boisgontierjacques.free.fr/pages_site/indirect.htm mais elle impose de créer un champ en prélude.
Or je voudrais le même principe mais en plus simple à savoir sans ajouter de champ, uniquement avec une formule de cellule, sans macro bien sûr, ni passer par un onglet “Récap” couramment proposé pour l’utilisation de la fonction INDIRECT dans ce type de problématique.
Vu ton niveau d’expertise, je tente ma chance…
Je préviens, je sollicite également mdo100 de http://forum.formuleexcel.com/!
Merci pour ton assistance.
A très bientôt et très bon vote!
Philgood.001
6 May 2017 at 3 h 26 min #34996Philgood.001
ParticipantBonjour Francis,
Bon, je pense que je vous pense que je vous ai lassé avec mes questions sans fin.
Je comprends.
Merci beaucoup pour votre aide. Je vais conserver ces codes bien au chaud.
Bon we à vous et à bientôt!
Philgood.001
6 May 2017 at 20 h 54 min #34997Francis Paquet
ParticipantBonsoir,
Désolé du délai de réponse, mais j’étais à l’extérieur. Je en crois pas que cela puisse se faire sans VBA (c’est très facile à faire en VBA…). Indiquer le nome de la feuille à la cellule F45, ça se fait bien en Excel. Indiquer le nom de la feuille précédente dans la cellule G45, ça, ça demande du VBA…
Francis
11 May 2017 at 12 h 19 min #35211Philgood.001
ParticipantBonjour Francis,
Merci pour les infos. Je vais garder la formule actuelle pour l’instant.
J’ai une dernière question toujours sur ce classeur :
Sur chaque onglet, j’ai un bouton “Imprimer” (qui avant d’imprimer, cache certaines colonnes puis imprime puis ré-affiche lesdites colonnes). Du coup j’ai le même code sur 24 onglets (pour l’instant…).
Mais si je veux modifier le code par ex., je dois le faire pour chaque onglet, et ce 24 fois!!!Y-a-t-il donc une solution qui permette de centraliser la formule d’impression quelque part et de ne créer que des renvois standardisés sur chaque onglet vers la formule générale d’impression?
J’avais pensé mettre la formule dans “ThisWorkBook” et mettre un renvoi dans chaque “Sheets”.
Qu’en penses-tu? Par contre pour le code je ne sais pas faire…Merci encore à toi.
A bientôt.
Philgood.001.
11 May 2017 at 15 h 33 min #35251Francis Paquet
ParticipantBonjour,
Vous ne devriez avoir qu’une seule procédure dans un module.
Quand vous êtes dans la feuille A, que vous appuyez sur le bouton Imprimer dans cette feuille et que la macro contient du code qui réfère à la feuille active, le code ne va s’exécuter que pour la feuille active…
Le bouton dans chaque feuille peut appeler toujours la même macro qui est dans un module général, c’est aussi simple que ça.
Francis
11 May 2017 at 16 h 51 min #35253Philgood.001
ParticipantBonjour Francis,
Merci pour ton retour rapide.
En effet je suis d’accord avec toi s’il s’agit d’un bouton en mode “Formulaire”.
Mais j’ai oublié de préciser que pour des raisons esthétiques et pratiques, je préfère utiliser un bouton “ActiveX” dont je pourrai personnaliser la couleur. Et dans ce cas, ta proposition ne fonctionne pas.
Comment faire pour simplifier de la même façon qu’avec le mode “Formulaire”?Merci à toi Francis.
Philgood.001.
-
AuthorPosts
- You must be logged in to reply to this topic.