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

  • Votes
  • Date
  • Date décroissante
  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
    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 ?
      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
        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
          1. Bonjour

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

            Cdlmnt
            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
              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
                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
                  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
                    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!
                      1. Contributeur
                        bonjour

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