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. Contributeur
    bonjour

    une formule suffira
    =SOMMEPROD(1/NB.SI(A1:A15;A1:A15))
     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

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

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

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