Selection et compte dans excel

Résolu
Bonjour,

A B C D E F G H I J
1 RU RP RP M M M M M RP RP
2 RP N N N N M RP RP RP N
3 RU RP RP M M M M RP RP RP
4 RU RP RP M M M M RP RP RP

1) Ma question est comment faire pour sélectionner en automatique chaque série de 3 R* et pas +. Ne pas sélectionner ni compter si + de 3 R* a la suite.
2) les comptabiliser et mettre le résultat dans une cellule à coté du tableau.

Merci beaucoup.
Configuration: Windows XP Internet Explorer 6.0

14 réponses

  1. Bonsoir Michel,

    Alors là moi je dis BRAVO, c'est génial. En manipulant les modules sur Access j'avais toujours réussi à me débrouiller, mais là CHAPEAU. Je vais essayer de comprendre ton raisonnement ainsi que l'écriture dans le module, mais vraisemblablement c'est d'un autre niveau sur Excel. Je crois que j'ai encore beaucoup à apprendre malgré mes 47 ans. Est-ce que "VBA pour Excel pour les nuls" permet de bien s'en sortir dans les modules ?

    Encore X fois Bravo, je t'envie de maitriser ce langage et la programmation.
    0
    1. Bonjour Michel,

      Je téléchargerais le ficher ce soir en rentrant, merci et bonne journée.
      0
      1. Contributeur
        Comme le problème m'a branché...
        ci joint proposition
        https://www.cjoint.com/?ksv3RaqD3P

        On ne prend en compte qu'une série de 3 jours R* (pas plus, pas moins)
        la série est comptabilisée dans le mois qui termine la série
        0
        1. Bonsoir Michel,

          Je suis désolé de t'avoir fait perdre ton temps, mais j'avais déjà dit plus haut qu'il fallait considérer que tout se trouvai sur une seule ligne. Les périodes à cheval sont aléatoires, c'est la continuité du roulement de l'année précédente qui fait qu'une période de trois repos tombe à cheval ou pas sur deux mois.
          Quand à la période supérieure à 3 jours, je vais l'appeler vacance, elle n'est pas une période de repos. Donc je ne la compte pas.

          Encore une fois désolé, j'essaierais à l'avenir d'être plus clair.

          Tan-pis.
          0
          1. Contributeur
            Bonjour,

            Je ne voudrais pas paraître trop exigent, mais il ya des modifs à apporter. Je ne me suis pas assez bien exprimé depuis le début.
            ce qui me fait un travail bénévole de 3-4 heures pour nada, merci.

            les deux deniers jours de janvier et le premier de février doivent aussi être comptés dans les 3 R*, ça va peut-être corser le programme
            ca va pas corser le programme mais tout refaire... avec une variable-tableau de dimension 366 x 4 et mise en forme conditionnelle sur la feuille excel, soit encore environ 3 à 4 heures de boulot bénévole avec certainement des heures en plus car la demande est incomplète et/ou floue:

            1/sur quel mois compte t on la période à cheval sur 2 mois ?
            2/ les périodes supérieur à 3 R* comme celle du 13 février au 19, doivent être ignorés.
            : si cela veut dire on ignore passé 3 jours c'est fait. Sinon ???

            Voilà, imagine que tu es donné cela à faire à titre onéreux à un professionnel, bonjour la chorale dans le bureau de la Direction.

            Désolé
            0
            1. Super, Michel ça prend forme.

              Je ne voudrais pas paraître trop exigent, mais il ya des modifs à apporter. Je ne me suis pas assez bien exprimé depuis le début.

              Ex: les deux deniers jours de janvier et le premier de février doivent aussi être comptés dans les 3 R*, ça va peut-être corser le programme et aussi les périodes supérieur à 3 R* comme celle du 13 février au 19, doivent être ignorés.

              sinon j'ai réussi a faire fonctionner....

              Encore Merci pour ton investissement....
              0
              1. Contributeur
                au cas où:
                voila ce qui 'il y a à coller dans ton classeur

                Sub compter_troisR()
                Dim col As Byte, suite As Byte, lig As Byte, derlig As Byte
                Dim nbre_R As Byte, cptr As Byte, anc_col As Byte, trois_R As Byte
                
                'initialisation
                col = 255
                suite = 1
                lig = 5
                derlig = Range("B65536").End(3).Row
                Application.ScreenUpdating = False
                'Nettoie le tableau
                reinitialiser
                
                'parcourt les lignes
                For lig = 5 To derlig Step 3
                    nbre_R = Application.CountIf(Range(Cells(lig, 2), Cells(lig, 32)), "R*")
                    'parcours les colonnes ayant un "R*"
                        For cptr = 1 To nbre_R
                            anc_col = col
                            col = Rows(lig).Find("R*", Cells(lig, col), xlValues, xlWhole).Column
                             'si les les R* ne sont pas jointifs
                             If col <> anc_col + 1 Then
                                suite = 1
                            End If
                            'si les R* sont jointifs on additionne le nombre de jointifs
                             If col = anc_col + 1 Then
                                suite = suite + 1
                            End If
                            'si le nomre de jointif est = 3
                            If suite = 3 Then
                                Range(Cells(lig, col - 2), Cells(lig, col)).Interior.ColorIndex = 35
                            End If
                    '        si le nombre de jointifs est inf à 4
                             If suite < 4 Then
                                trois_R = trois_R + Int(suite / 3)  'int(suite/3)=0 tant que suite est <3
                            End If
                        Next cptr
                Cells(lig, 33) = trois_R
                trois_R = 0
                Next lig
                End Sub
                
                Sub reinitialiser()
                Range(Cells(5, 2), Cells(255, 32)).Interior.ColorIndex = xlNone
                Range("AG5:AG255").ClearContents
                End Sub
                
                0
                1. Merci de répondre aussi vite, mais je ne pourrais consulter ton classeur que ce soir car je suis au boulot et je n'ai pas accès a cjoint.com. Je te donnerais des nouvelles une fois les manips faites.

                  Merci encore et bonne journée.......
                  0
                  1. Contributeur
                    Bonjour,
                    Pour colorier les troisR* j'ai été obligé de passer d'une fonction à une procédure...
                    ci joint proposition
                    https://www.cjoint.com/?kpldy7XGW1

                    pour installer
                    1/sur mon classeur, tu vas dans VBE ( c'est le m^me qu'avec Access) par alt+F11
                    dans la partie code: ctrl+A puis Ctrl+C (on sélectionne tout puis on demande copier)

                    2/dans ton classeur
                    tu vas dans VBE
                    insertion-module
                    Ctrl=V (coller)

                    3/pour le bouton
                    outils-personnaliser-formulaire
                    tu choisis le bouton et dessine le avec la petite croix
                    tu l'affecte à la macro "compter_troisR"

                    0
                    1. Contributeur
                      re,

                      Je viens de regarder ton classeur; il y a beaucoup de choses à améliorer notamment de le rendre perpétuel avec les jours de la semaine calculés par formule (il suffit de mettre des formules pour le 1° du mois...)
                      dis moi si ca t'intéresse, j' attends ta réponse avant de commencer
                      Pour les couleurs, il faut que je regarde mais on devrait pouvoir...
                      0
                      1. Bonjour Michel,

                        En faite se n'est qu’une copie de la première feuille d'un gros classeur ou tout se fait automatiquement.

                        Si tu veux je te fais parvenir le classeur complet mais il fait 1.03 Mo.

                        C’est un fichier qui permet de calculer les roulements de 5 équipes en 3x8.

                        Donc se que je désir apporter comme amélioration c'est de faire ressortir les périodes de trois repos et de les comptabiliser (car c'est réglementé) afin de pouvoir les modifier si nécessaire.
                        (Ne pas comptabiliser les périodes de plus de trois repos).

                        Merci pour ton aide sur se projet
                        0
                    2. Contributeur
                      Re,
                      Excusez-moi, mais j'avais à faire...

                      J'ai essayé vainement par une formule matricielle (ma question pour une solution VBA était une précaution car des demandeurs ne veulent pas de VBA et j'en ai marre d'avoir une réponse sèche...)

                      donc proposition avec une fonction personnalisée:

                      Function trois_R(plage As Range) As Byte
                      'initialisation
                      lig = plage.Row
                      nbre_R = Application.CountIf(plage, "R*")
                      col = 256
                      suite = 1
                      
                      'parcours les colonnes ayant un "R*"
                      For cptr = 1 To nbre_R
                          anc_col = col
                          col = Rows(1).Find("R*", Cells(lig, col), xlValues, xlWhole).Column
                      
                          'si les les R* ne sont pas jointifs
                          If col <> anc_col + 1 Then
                              suite = 1
                          End If
                          'si les R* sont jointifs on additionne le nombre de jointifs
                          If col = anc_col + 1 Then
                              suite = suite + 1
                          End If
                          ' si le nombre de jointifs est inf à 4
                          If suite < 4 Then
                              trois_R = trois_R + Int(suite / 3)  'int(suite/3)=0 tant que suite est <3
                          End If
                      Next
                      End Function
                      0
                      1. Bonsoir, Michel

                        Je suis désolé mais je ne sais pas comment utiliser la fonction. Pourrais tu me donner la marche a suivre.

                        Je suis beaucoup plus alaise avec Access...

                        Je te joins une page de mon fichier pour que tu comprennes mon problème.

                        https://www.cjoint.com/?kotEvhUZhs

                        Ce serait bien de pouvoir repérer tous ces R* par 3 avec une couleur de fond, si c'est facile à intégrer dans la fonction.....

                        Merci
                        0
                    3. Salut tout le monde,

                      Quelques propositions, formules et mise en forme conditionnelle
                      peut s'adapter en colonne, mais comme le dit notre ami Vaucluse en diagonale bonjour les maux de tête et le poids du fichier, à voir la proposition de Michel_m en VBA

                      https://www.cjoint.com/?knxjdz3NRG

                      A+
                      Mike-31

                      Un problème sans solution est un problème mal posé  (Einstein)
                      0
                      1. Contributeur
                        Bonsoir
                        une solution peut être pas trop compliquée, si il faut compter les 3R successifs en ligne
                        http://www.cijoint.fr/cjlink.php?file=cj200910/cij5eYoSUC.xls
                        Ca doit pouvoir s'adapter aussi à un calcul en colonne, mais on aura du mal avec les diagonales!
                        :-)
                        Cordialement
                        0
                        1. Contributeur
                          Bonjour

                          il faut compter ligne par ligne ?
                          si oui ligne1 on aurait 1 (1 serie de 3 R* à la suite) ? j'ai compté 1 par ligne de 1 à 3 et 2 pour la ligne 4...?

                          OU.... tout le tableau y compris à cheval sur 2 lignes: j'ai alors compté 6 series...?
                          OU....

                          Une solution par VBA te conviendrait elle ?
                          0
                          1. Bonjour Michel,

                            Le résultat est 1 série ligne 1; 2 série ligne de 1 à 2; 1 série ligne 3; 1 série ligne 4 => Donc 5 série

                            C'est un tableau mais on peut imaginer que tout se trouve sur une seule ligne....

                            Il ne faut pas compter ni selectionner si + de 3 r*...

                            La soluce VB me convient..

                            merci pour votre aide.....
                            0