Une routine vb ?

Résolu
Bonjour,
Bonjour,
j'ai un tableau de plusieurs centaines de lignes et quelques colonnes
la colonne A est renseignée par certains codes par ex :
ligne 1 col A : AAA
ligne 2 col A : AAA
ligne 3 col A : AAA
ligne 4 col A : BBB
ligne 5 col A : BBB
ligne 6 col A : CCC
ligne 7 col A : DDD
ligne 8 col A : DDD
ligne 9 col A : DDD
je voudrais pouvoir comptabiliser le nombre de codes (unitaires).
Dans cet exemple = 4 !
je ne sais pas comment rédiger une telle routine!
pouvez vous m'aider svp ?
merci

13 réponses

  1. Je suis parti du principe qu'il y avait une relation entre la cellule résultat et la colonne traitée (colonne traitée = colonne de la cellule résultat -2)
    'S'il y a une autre relation, à toi d'adapter sinon, ça ne sera pas possible ou alors via une macro

    Cdlmnt
    0
    1. merci beaucoup pour cette explication
      en fait je n'ai pas compris mais c'est sans doute parce que ça ne correspond pas à ce que je veux faire ?
      j'ai l'impression que dans ton exemple il y a un ordre de passage obligé au niveau des 3 cellules ?
      en tout état de cause dans mon tableau, j'ai 1 cellule en J3 qui me donne le résultat du traitement de la colonne H et une cellule J4 qui me donne le resultat du traitement de la colonne D.
      comment dois-je rediger ma formule ?
      0
      1. 1. Supposons qu'on se place en colonne 11 (colonne K) avec la formule
        K1=SOMMEPROD(1/NB.SI(plagedyn;plagedyn))
        2. La référence pour la définition des plages est plage et est définie en colonne 1 (colonne A) (décalage de 0 ligne et 0 colonne par rapport à A1)
        plage =DECALER(Feuil1!$A$1;0;0;NBVAL(Feuil1!$A:$A);1)
        Dans la formule qui définit la plage plagedyn, la formule est
        =DECALER(plage;0;COLONNE()-3;NBVAL(DECALER(plage;0;COLONNE()-3));1)
        3. donc "actuellement" (en K1) colonne vaut 11 et colonne()-3 vaut 8, et plagedyn est décalée à partir de la colonne 1 de 8 colonnes, donc plagedyn est en colonne 1+8 = 9 (soit colonne I)
        J'espère avoir été (suffisamment) clair

        Cdlmnt
        0
        1. merci ccm81
          je n'ai pas compris le COLONNE()-3 dans plagedyn !
          1/ est-ce le nombre de col possibles à traiter ici les col A, E, I (et independamment de leur position (E aurait pu être en col B .etc..)
          2/ ou est-ce le décalage entre les colonnes à traiter (je ne le pense pas : j'ai mis les colonnes mitoyennes et ça continue à fonctionner)
          donc ? ...
          merci pour une explication
          cdlt
          0
          1. Bonjour

            Possible, un exemple à adapter
            http://www.cjoint.com/c/FEckhGQzAYQ

            Cdlmnt
            0
            1. bonsoir,
              j'ai reussi à faire fonctionner ce que je voulais faire avec un combiné de michel_m et ccm81, à savoir
              a/ nommer la plage avec la fonction DECALER (avec nbval...)
              b/ compter mes occurences uniques dans la col A avec la formule suivante :
              "=SOMME(SI(plage_regrt<>"";1/NB.SI(plage_regrt;plage_regrt);""))"
              Mon nouveau problème :
              si je veux faire la même chose mais pour une autre colonne, faut-il que je nomme une nouvelle plage?
              En fait ne peut-on pas définir 1 seule plage mais qui contiendrait le tableau en entier (avec toutes ses colonnes) et ensuite parametrer la colonne concernée par son numero par exemple?
              ainsi la formule ci-dessus ressemblerait à (pour la 4eme col) :
              "=SOMME(SI(ENCOURS_plage_regrt,4<>"";1/NB.SI(ENCOURS_plage_regrt,4;ENCOURS_plage_regrt,4);""))
              je sais que ça ne fonctionne pas mais ce serait plus "dynamique"!
              merci
              0
              1. 1/ avant tout un commentaire d'ordre général :
                Je vois que j'ai affaire à de vrais spécialistes !
                Mais qu'est-ce que ces spécialistes ont à faire avec des gens de mon niveau ?
                ça ne leur apporte rien (en terme de connaissances)
                Il est vrai que nous sommes sur un forum dont un des objets est l'entre-aide, et je voulais remercier particulièrement les gens comme vous qui acceptent de dispenser de leur temps pour aider les autres "à tenter de s'améliorer" sur le sujet.
                Donc merci, merci et merci à michel_m, ccm81... et les autres .... !!!

                2/ (je ne perds pas le nord ! ...)
                a/ je reprends l'idée de ccm81 : mais où dois-je placer mon "decaler ..." dans le tableau ?
                b/ pour la matricielle : avec ou sans les accolades ça change quoi, je ne vois pas la différence
                merci
                0
                1. Bonjour

                  Pour compléter la proposition de Michel (salut à toi au passage), une non matricielle qui peut aller loin dans les lignes
                  Tu nommes dynamiquement la plage avec la formule
                  =DECALER(Feuil1!$A$1;0;0;NBVAL(Feuil1!$A:$A);1)
                  Puis la première formule de Michel devient
                  =SOMMEPROD(1/NB.SI(plage;plage))

                  Cdlmnt
                  0
                  1. Contributeur
                    Bonjour

                    avec la matricielle du matin, nombre de données <=100:

                     =SOMME(SI(A1:A100<>"";1/NB.SI(A1:A100;A1:A100);""))
                    Formule matricielle à valider par « ctrl+maj+entrée » (et non directement par « entrée »), le curseur clignotant dans la barre de formule. La formule est alors encadrée automatiquement par des accolades : { formule }


                    Si tu as des milliers de lignes, les formules matricielles sont très chronophages et il faut alors passer par du VBA (et non du vb)
                    Si c'est le cas, fais signe
                     Michel
                    0
                    1. bravo ! et merci !
                      j'avoue ne pas comprendre le fonctionnement de cette formule, mais ça marche ! c'est exactement ce que je voulais !

                      Question subsidiaire :
                      si mon tableau fait 15 lignes, la formule est celle décrite ci dessus (plage de A1 à A15).
                      Mais à chaque fois que je rajoute 1 ligne il faut que je réajuste "la plage" et que je modifie A15 en A16 ou A17 etc ... ?
                      Y a t-il une astuce pour ne pas avoir à modifier la plage à chaque fois que celle ci change de taille
                      merci

                      Cette question est d'ailleurs valable quelle que soit le type de formule!
                      0
                      1. Contributeur
                        bonjour

                        une formule suffira
                        =SOMMEPROD(1/NB.SI(A1:A15;A1:A15))
                         Michel
                        0