Contact: 514-605-7112 / info@lecfomasque.com

Sélectionner onglets pairs ou impairs

Ce sujet a 17 réponses, 2 participants et a été mis à jour par  Philgood.001, il y a 1 an et 2 mois.

15 sujets de 1 à 15 (sur un total de 18)
  • Auteur
    Messages
  • #34367

    Philgood.001
    Participant

    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.

    #34369

    Philgood.001
    Participant

    PS : 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.

    #34394

    francispaquet
    Participant

    Bonjour,

    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

    #34482

    Philgood.001
    Participant

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

    #34507

    Philgood.001
    Participant

    Re-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émasquer

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

    #34508

    francispaquet
    Participant

    Bonjour,

    Le code devrait être, tout simplement:
    Pour masquer les onglets pairs

    Sub 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

    • Cette réponse a été modifiée le il y a 1 an et 10 mois par  francispaquet.
    #34511

    Philgood.001
    Participant

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

    #34512

    francispaquet
    Participant

    Bonjour,

    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

    #34597

    Philgood.001
    Participant

    Bonjour 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

    • Cette réponse a été modifiée le il y a 1 an et 10 mois par  Philgood.001.
    #34611

    Philgood.001
    Participant

    Bonjour 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

    • Cette réponse a été modifiée le il y a 1 an et 9 mois par  Philgood.001.
    #34996

    Philgood.001
    Participant

    Bonjour 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

    #34997

    francispaquet
    Participant

    Bonsoir,

    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

    #35211

    Philgood.001
    Participant

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

    • Cette réponse a été modifiée le il y a 1 an et 9 mois par  Philgood.001.
    • Cette réponse a été modifiée le il y a 1 an et 9 mois par  Philgood.001.
    #35251

    francispaquet
    Participant

    Bonjour,

    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

    #35253

    Philgood.001
    Participant

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

15 sujets de 1 à 15 (sur un total de 18)

Vous devez être connecté pour répondre à ce sujet.