Une routine vb ?

Résolu/Fermé
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017 - 29 avril 2016 à 11:01
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017 - 3 mai 2016 à 18:07
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
A voir également:

13 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 29/04/2016 à 13:53
bonjour

une formule suffira
=SOMMEPROD(1/NB.SI(A1:A15;A1:A15))
 Michel
0
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017
Modifié par sam130242 le 29/04/2016 à 21:22
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 30/04/2016 à 07:56
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
30 avril 2016 à 10:46
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017
30 avril 2016 à 17:06
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
30 avril 2016 à 17:33
Bonjour

2. Le but est de nommer la plage à traiter, et décaler permet de la rendre évolutive
où dois je placer mon "décaler"
Onglet Formule/Nom definir/
Nom tu mets plage
Fait référence à
Tu mets la formule = DECALER(.....
https://support.microsoft.com/fr-fr/office/d%c3%a9finir-et-utiliser-des-noms-dans-les-formules-4d0f13ac-53b7-422e-afd2-abd7ff379c64?ui=fr-fr&rs=fr-fr&ad=fr#bmcreate_a_name_by_using_the_create_nam

Cdlmnt
0
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017
2 mai 2016 à 00:57
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
2 mai 2016 à 12:17
Bonjour

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

Cdlmnt
0
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017
2 mai 2016 à 13:46
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 2/05/2016 à 14:02
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
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017
Modifié par sam130242 le 2/05/2016 à 14:26
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
3 mai 2016 à 16:29
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
sam130242 Messages postés 72 Date d'inscription samedi 9 avril 2016 Statut Membre Dernière intervention 2 janvier 2017
3 mai 2016 à 18:07
merci!
cdlt
0