✅ Macro Sélectionner onglets pairs ou impairs


#1

Bonjour,

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 onglets

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


#2

Bonjour @Philgood.001,

Si j’ai bien compris et en imaginant que les onglets soient nommés de “01…à…12” pour l’exemple, les ongles de tableaux Impairs et les onglets de graphiques Pairs

Sélection des onglets Impairs associés à un bouton.

Sub Impair()

Sheets(Array("01", "03", "05", "07", "09", "11")).Select
    
End Sub

Sélection des onglets Pairs associés à un bouton.

Sub Pair()

Sheets(Array("02", "04", "06", "08", "10", "12")).Select

End Sub

Sélection des onglets Pairs Impairs associés à un bouton.

Sub Impair_Pair()

Sheets(Array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12")).Select

End Sub

Pour l’exemple, jusqu’à 12 onglets, adapter les macros pour 48 onglets.

Cela convient-il ?

Cordialement.


#3

Bonjour,

J’avais déjà vu cette formule quelque part.

En fait je me rends compte que j’ai oublié de préciser qque chose d’important :

Je ne veux pas indiquer le nombre d’onglets à inclure dans le code (ou citer les index 1 par 1). Celui-ci doit s’adapter automatiquement 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…

Toutes mes excuses pour cet oubli :pensive:

Merci.


#4

RE @Philgood.001,

Je vois que tu ne réserve pas ta demande à ce forum, sans doute pressé par l’urgence vitale de la situation.

Et la réponse qui t’as été faite sur l’autre forum est cinglante, je cite “Ben … toi non plus, apparemment

Je n’en rajouterais pas ! Et donc je passe mon tour :rage:.

Bonne chance sur les autres forums.


#5

Bonjour mdo100,

Je ne m’attendais pas à une telle réponse en venant chercher de l’aide?

  1. "Je vois que tu ne réserve pas ta demande à ce forum, sans doute pressé par l’urgence vitale de la situation."
    En effet, vu la complexité apparente de ma demande et afin de me donner un maximum de chances d’obtenir la réponse qui convient, j’ai posté la même question sur plusieurs forums.
    Je ne vois pas où est le problème? Tu es vexé?
    Aurait-il fallu que je pose ma question uniquement sur ce forum? Un peu obtus comme vision des choses…

  2. "d’autant plus que mes collègues ne maîtrisent pas du tout le VBA…"
    En effet c’est le cas, et ce n’est pas une critique à leur égard mais une simple réalité.

  3. "Et la réponse qui t’as été faite sur l’autre forum est cinglante, je cite "Ben … toi non plus, apparemment"
    Je n’en rajouterais pas ! "
    Et en effet, moi non plus je n’y connais pas grand chose. Cela fait 2-3 mois seulement que je me suis lancé en VBA en autodidacte, et à raison de quelques we seulement.
    Là non-plus je ne vois pas où est le problème?
    S’il faut être un expert pour poser des questions, alors il n’y a aucune question à poser puisque les experts maîtrisent par définition. Et donc ce forum ne servirait alors à rien…

Dommage, ta 1ère réponse était intéressante et laissait présager la solution finale.

Malgré tout, je suis toute ouïe si d’autres contributeurs ont une solution à proposer.

Merci.


#6

Re @Philgood.001,

Sache que sur tous les forums, ce sont des personnes passionnées d’Excel et surtout BÉNÉVOLES et qu’il est regrettable pour chacun de commencer a travailler sur une demande d’aide et de voir que la même demande soit sur plusieurs forums (tous aussi compétents l’uns des autres) sans que cela soit signalé par le demandeur.
Et moi j’aime aider, ce qui fait que je suis sur plusieurs forums pour y apporter dans les limites de mes compétences l’aide nécessaire à chaque demandeur d’aide.

Je pense que tu peux comprendre ça ! Non :wink:

Maintenant je vois que sur l’autre forum, malgré les réponses que tu as obtenues, cela ne te convient pas.

Alors je te propose ceci, les codes VBA sont sensiblement les mêmes que dans mon premier message, pour 51 feuilles.

Je ne vois pas comment faire autrement, regarde si cela peut te convenir et donne aux moins des nouvelles, si c’est bon pour toi où si tu as eu d’autres réponses ailleurs, meilleur que ma solution.

Voir fichier ICI==> Philgood.001 V1.xlsm (63,0 Ko)

Bonne soirée.


#7

Bonsoir mdo100,

Désolé de revenir si tard…

Pour te répondre sans aucune animosité mais avec pragmatisme :slight_smile: :

Ah bon! La logique d’un forum est d’aider les internautes qui en ont besoin. Or, pour se donner un maximum de chances d’avoir une réponse qui corresponde le plus possible à ce que l’on attend, il semble logique de poster sur plusieurs forums pour multiplier ses chances.
C’est comme de jouer plusieurs grilles de loto pour se donner plus de chances de gagner…

Et puis que j’obtienne 5 réponses sur 5 sites différents ou 5 réponses sur ce même forum, ça change quoi?
Si plusieurs internautes me répondent sur ce même forum, tu leur dis quoi? Qu’ils devaient s’abstenir parce-que tu avais répondu en 1er?

Donc si j’avais précisé que j’avais posté à plusieurs endroits, tu ne m’aurais pas répondu?..
Alors que ta réponse sera peut-être la meilleure à mon goût?

Ça, pour quelqu’un qui veut aider, je ne vois pas trop ce que ça fait là?..
Reprendre une “réponse cinglante” selon tes dires, à ton compte pour justifier de ne pas m’aider, je veux bien que tu m’expliques…
Parce-que qq’un tacle tu ne veux plus répondre? Tu as peur d’être stigmatisé à ton tour?

En gros, tu n’apprécies pas qu’on demande de l’aide aux autres mais tu sais bien reprendre les réponses des autres quand ça te chante…

Désolé pour le pavé mais ça devait être dit. :slight_smile:

Maintenant, concernant le fichier que tu m’as laissé, je ne suis pas en mesure de m’en occuper aujourd’hui. Je traiterai ça ce we.
Quelque soit le résultat de tout ça, je tiens quand même à te remercier pour ta participation et de t’être malgré tout creusé les méninges pour me proposer une solution.

Évidemment, je te tiendrai au courant de la formule retenue comme tous les autres contributeurs, que ce soit sur ce forum ou les autres.

Merci à toi. A bientôt. :+1:


#8

Bonjour mdo100,

Merci à toi pour ton aide.

In fine, je vais appliquer la solution proposée par patty5046 via CCM.

Elle est simple à comprendre pour un newbie comme moi.

Cependant, je vais garder certains codes ou morceaux de codes que tu m’as proposés.
Ils pourront me servir une autre fois.

Merci à toi et bon we.

Voici donc les 3 codes en question proposés par Patty5046 qui correspondent parfaitement à ma demande:

Sub SELECT_ONGLETS_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
 
  Next Sht
 
End Sub

Sub SELECT_ONGLETS_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

Next Sht

End Sub


Sub SELECT_TOUT()

Dim Sht As Worksheet

For Each Sht In ActiveWorkbook.Sheets 'tout déselectionner
Sht.Select Replace:=True

Next

Ind = 0

For Each Sht In ActiveWorkbook.Sheets 'tout sélectionner depuis 6

Ind = Ind + 1

If Ind > 5 Then
    Sht.Select Replace:=False

End If

Next

End Sub

Pour info dans les 3 codes, le décalage a bougé de 2 onglets vers la droite.
Donc on commence au 6è onglet au lieu du 4è.

Merci à toi et à bientôt!!!

Je passe en résolu.


#9

Bonjour @Philgood.001,

Je viens d’essayer les codes de Patty5046, et je constate que quand on clique sur “Pairs” la dernière feuille Impaire est sélectionnée, de même quand on clique sur “Impairs” la dernière feuille paire est sélectionnée.

Mais peut-être que c’est ce que tu a demandé sur CCM.

En tout cas merci d’avoir partagé tes informations sur le “Forum Formule Excel:wink:

Moi j’avais travaillé avec ce que t’as proposé joe.levrai sur un autre forum et j’attendais de tes nouvelles pour te communiquer l’amélioration que j’y avais apporté pour sélectionner les Pairs, Impairs, Tout.

Je vois que la tension est retombé entre nous et que tu es correcte puisque tu as partagé une des solutions qui t’as été donnée par ailleurs, ça fait plaisir.

Alors voici ce que j’ai fais avec la parti du code de joe.levrai : ce qui répond exactement à ta demande du début, mais en tenant compte du dernier point a savoir commencer à partir de la feuille 6.

Voici les codes:

Sub SELECT_Pair(Optional Pair As Boolean = True)

Dim Debut As Long
    Debut = 7 + CInt(Pair)
    With ThisWorkbook
        .Sheets(Debut).Select Replace:=True
        For i = Debut + 2 To .Sheets.Count Step 2
            .Sheets(i).Select Replace:=False
        Next i
    End With
    
End Sub

Sub Pair()

    SELECT_Pair

End Sub

Sub SELECT_Impair(Optional Impair As Boolean = True)

Dim Debut As Long
    Debut = 8 + CInt(Impair)
    With ThisWorkbook
        .Sheets(Debut).Select Replace:=True
        For i = Debut + 2 To .Sheets.Count Step 2
            .Sheets(i).Select Replace:=False
        Next i
    End With
    
End Sub

Sub Impair()

    SELECT_Impair

End Sub

Sub Tout()

Sheets(7).Select
For i = 7 To Sheets.Count
Sheets(i).Select False
Next

End Sub

Et voici un fichier essai ==> Philgood.001 V2.xlsm (30,7 Ko)

J’espère que cela te sera utile, en tout cas tu as plusieurs solutions aux choix.

Bon dimanche.
Cordialement.


#10

Bonjour mdo100,

Désolé de te répondre si tard et merci pour ton implication.

J’ai bien testé ton code. Il fonctionne nickel sur ton fichier, mais dès que je le recopie sur mon module, ça beugue!

Code erreur :

“Erreur d’exécution ‘9’ :
L’indice n’appartient pas à la sélection”

Le beug est valable que pour le PAIR et IMPAIR.
Par contre ça fonctionne bien pour TOUT.

Une précision qui a peut-être son importance, j’ai écrit le code sur le fichier “PERSONAL” du dossier XLSTART.
Alors qu’en le copiant sur 1 module du doc en question, ça fonctionne sans problème…

Merci pour ta persévérance!


#11

Bonjour @Philgood.001,

Peut-être est-ce du au fait que ton fichier “PERSONAL” du dossier XLSTART comporte moins de 7 feuilles.
Faire un essai avec ton fichier “PERSONAL” supérieur à 7 feuilles.

A voir :interrobang:

Bon dimanche.
Cordialement.


#12

Bonjour mdo100,

J’ai fait comme tu m’as dit et maintenant j’ai ça =

“Erreur d’exécution ‘1004’:
La méthode Select de la classe Worksheet a échoué.”

En fait je me demande s’il n’y a pas un problème avec le code (par contre je ne comprends pas pourquoi ça ne pose pas de problème dans le module du doc en question…):

    With ThisWorkbook
        .Sheets(Debut).Select Replace:=True
    For i = Debut + 2 To .Sheets.Count Step 2
        .Sheets(i).Select Replace:=False
    Next i

Le point avant “Sheets” est-il utile?
Quand je les retire (x2 = 1 sur chaque ligne), il n’y a plus de message d’erreur, la macro se lance bien mais il ne sélectionne que les 3 premiers onglets…
Que ce soit en mode Pair ou Impair. Or il n’y a rien dans le code qui limite le process qu’aux 3 premiers onglets…
J’ai tenté en supprimant le “+2” dans:

For i = Debut + 2 To .Sheets.Count Step 2

mais sans changement. Là je ne vois pas.

Si tu en as marre, je comprendrai. J’ai au moins le code de Francis du CFO de fonctionnel.

Merci à toi.


#13

Bonjour @Philgood.001,

[quote=“Philgood.001, post:12, topic:487”]
Si tu en as marre, je comprendrai.[/quote]

Non au contraire, ça m’intéresse, mais je suis comme toi, j’ai des limites en programmation VBA.
Je ne suis pas sur le forum CFO, mais je viens d’aller y faire un tour pour retrouver la réponse que t’as fait Francis , c’est vrai qu’il est très bien construit et simple.

Mais dans ce cas, as-tu bien suivi ses conseilles pour les feuilles "Impaires & Tout".
Voici son code pour les 3 cas de figure "Pair & Impair & Tout".

Voici ce que cela donne:

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

Sub SelectImpair()
Dim i As Integer, iCount As Integer
Dim strSheetSelected() As String

    For i = 4 To Sheets.Count
        If i Mod 2 = 1 Then   '  C'est un index Impair
            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

Sub SelectTout()
Dim i As Integer, iCount As Integer
Dim strSheetSelected() As String

    For i = 4 To Sheets.Count
       If Sheets(i).Visible = xlSheetVisible Then
                ReDim Preserve strSheetSelected(iCount)
                strSheetSelected(iCount) = Sheets(i).Name
                iCount = iCount + 1
            End If
    Next i
    
    Sheets(strSheetSelected).Select

End Sub

Est-ce que cela résout ton problème ?

Cordialement.


#14

Bonjour [mdo100]
(http://forum.formuleexcel.com/u/mdo100),

Merci pour ta patience.

Concernant le code de Francis, c’est celui dont je te parlais, que j’avais retenu.
Et il fonctionne parfaitement comme tu as pu voir.

Du coup je m’attaque maintenant à autre chose, une formule INDIRECT d’Excel qui me donne du fil à retordre…

Mais tout comme je l’ai dit à Francis, si malgré ma persévérance je n’y arrive pas, je tenterai ma chance aussi avec toi… Si ça te dit bien sûr.

En attendant merci à toi pour ta participation jusque-là et peut-être à bientôt!

Philgood.001


#15

Bonjour mdo100,

Bon après moultes essais, 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.

Si tu trouves, t’es un as!

Je préviens, je sollicite également Francis du CFO masqué!

Merci pour ta participation.

A très bientôt et très bon vote!

Philgood.001


#16

Bonjour mdo100,

Bon j’imagine que tu t’es lassé, je peux comprendre.

Pour te remercier mais aussi pour les autres visiteurs, voici la même chose pour le masquage/démasquage d’onglets pairs ou impairs:

Sub MASQUER_PAIRS()
Dim i As Integer

    For i = 5 To Sheets.Count
        
        If i Mod 2 = 0 Then   '  C'est un index pair
            Sheets(i).Visible = xlSheetHidden
        End If
        
    Next i
    
    Sheets(1).Select
    Sheets(7).Select

End Sub

——————————————————————————————–

Sub MASQUER_IMPAIRS()
Dim i As Integer

    For i = 6 To Sheets.Count
        
        If i Mod 2 = 1 Then   '  C'est un index impair
            Sheets(i).Visible = xlSheetHidden
        End If
        
    Next i
    
    Sheets(1).Select
    Sheets(6).Select

End Sub

——————————————————————————————–

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

Code fourni par Francis du CFO masqué!

Merci à toi pour toutes tes propositions.

A très bientôt.

Bon we et bon vote!

Philgood.001.


#17

Hello @Philgood.001,

Je me lasse pas d’Excel, mais si je ne t’ai pas répondu, c’est pas faute d’avoir chercher une solution et j’ai toujours ta dernière demande sous le coude.

Mais ta demande est extrêmement compliquée et je ne suis pas un “as” :disappointed_relieved: elle concerne une feuille sur deux, c’est là toute la difficulté de ta demande.
Je vois que Francis sur l’autre forum n’a pas trouvé de solution non plus, sinon je suis certain qu’il te l’aurai donné.

Il ne faut pas avoir d’a priori sur notre détermination a vouloir trouver des solutions pour toutes et tous, cependant, il nous arrive d’être en échec.

Peut-être que @DocteurExcel s’il voit ce message, pourrait trouver une solution.

En ce qui concerne le masquage/démasquage d’onglets pairs ou impairs tu n’en avait pas fait la demande sur le forum, j’avais un code similaire à celui que tu as mis ci-dessus, mais c’est cool :+1: de l’avoir partagé sur le forum.

Bon week-end et bon vote :envelope_with_arrow: à toi aussi.

Amicalement.


#18

Hello mdo100!

Content de te revoir!

En fait je pense que tu as mal compris ma demande, ou que je me suis mal exprimé:

Il s’agit en fait d’une fonction INDIRECT non nominative, mais sans date dans les onglets (ou ici une date personnalisée = 01.16 Tab/Gra …):

Le but est de dire à Excel d’aller chercher la valeur de la cellule G45 dans le 2è onglet précédent (mais sans le nommer).
Tout ça en utilisant une simple formule Excel INDIRECT mais sans ajouter de champ ni utiliser de macro ni passer par un onglet “Récap” couramment proposé pour l’utilisation de la fonction INDIRECT.

La formule de http://boisgontierjacques.free.fr/pages_site/indirect.htm est bonne mais elle est plus compliquée qu’une simple formule Excel car elle nécessite l’utilisation d’un champ.

A tes neurones de jouer s’ils ont des idées…

Merci à toi.

Bon we. A bientôt.

Philgood.001.


#19

Re-hello mdo100!

J’ai une autre question toujours sur le même 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.


#20

Re-hello mdo100,

Au fait, as-tu une idée pour ma question sur la fonction INDIRECT stp?

Merci pour ta participation active, grâce à toi j’ai pu bien avancer sur mon doc.

A bientôt.

Philgood.001.