Formule matriciellePour calculer le total Prix*Qte en colonne D, la méthode
classique consiste à écrire la formule -Sélectionner D2:D7 On obtient une formule matricielle {=B2:B7*C2:C7} SommeProd()Les fonctions Nb.si() et Somme.Si()
sont limitées à une condition.
SommeProd((champ1=condition1)*(champ2=conditions2)*(.....)) ou SommeProd(--(champ1=condition1);--(champ2=conditions2);(.....)) Cette fonction effectue des opérations sur des matrices.
Sur l'exemple ci dessous, on compte le nombre de personnes
appartenant au service compta =SOMMEPROD((B2:B10="Compta")*(C2:C10="Q1")) Si les champs B2:B10 ont étés nommés Service et Qualif: =SOMMEPROD((Service="Compta")*(Qualif="q1")) ou =SOMMEPROD(--(Service="Compta");--(Qualif="Q1")) Pour obtenir la somme des salaires: ou =SOMMEPROD(--(Service="Compta");--(Qualif="q1");D2:D10) Remarque:Les fonctions BdSomme(), BdNbval(),.. sont plus rapides mais nécessitent un champ critère. Autre exempleSur cet exemple, on compte le nombre d'hommes qui ont un salaire>3000. =SOMMEPROD((Genre="H")*(Salaire>3000))
La somme des salaires est: =SOMMEPROD((Genre="H")*(Salaire>3000)*Salaire) Noms de champ DénombrementSur l'exemple, on veut le nombre de produits pour lesquels le CaRéel est supérieur au CaPrévu =SOMMEPROD((CaRéel>CaPrévu)*1) *1 transforme les valeurs booléennes en 0/1 Autres écritures:
Elimination du texte dans les zones numériquesTotal: =SOMMEPROD(--(Ref="x");Qte) Nb lignes: =SOMMEPROD(--(Ref="x")) Elimination du texte dans les zones dates=SOMME(SI(ESTNUM(Date);--(MOIS(Date)=D2))) Cumul par moisElimination de #N/ASur l'exemple, on veut faire la somme des montants. =SOMME((code=E2)*SI(ESTNA(montant);0;montant)) Constantes matricielles{2;3;4} représente un vecteur colonne. =SOMMEPROD({2;3;4}*{4;5;6}) donne le produit
scalaire( 2*4)+(3*4)+(4*6) Sur cet exemple, nous obtenons les 3 plus grandes valeurs d'un champ. =GRANDE.VALEUR(A2:A7;{1;2;3}) En A1, on a A,A+,A-,A,B,... On veut obtenir une valeur 7,8,6,.. =INDEX({7;8;6;4;5;3;1;2;0};EQUIV(A1;{"A";"A+";"A-";"B";"B+";"B-";"C";"C+";"C-"};0)) Donne une appréciation sur une note en B6 =RECHERCHEV(B6;{0."Nul";25."Très Moyen";50."Moyen";80."Très Bien"};2;VRAI) Un vecteur colonne {1;2;3;4;...10} peut être remplacé par: =LIGNE(1:10)
Un vecteur colonne variable se génère avec: =LIGNE(INDIRECT("1:"&LIGNES(champ))) Un vecteur ligne variable se génère avec: =COLONNE(INDIRECT("1:"&COLONNES(champ))) Pour générer janvier,février,...,Décembrejanvier -Sélectionner 12 cellules Pour générer dimanche,lundi,mardi,...-Sélectionner 7 cellules Pour générer A,B,C,... -Sélectionner 26 cellules verticales Calendrier annuelPour créer un calendrier annuel 2009 avec une seule formule matricielle: -Sélectionner un champ de 12 colonnes et 31 lignes Pour ne pas afficher le 31 des mois à 30 jours, utiliser la MFC ou =SI(MOIS(DATE(an;COLONNE(1:12);LIGNE(1:31)))=COLONNE(1:12);DATE(an;COLONNE(1:12);LIGNE(1:31));"") ExemplesVérifier que 2 listes contiennent les mêmes éléments=SI(SOMMEPROD(NB.SI(liste1;liste2))=NBVAL(liste1);"ok";"NoOk") Compter les occurences uniques=SOMMEPROD(1/NB.SI(A2:A8;A2:A8))
Si cellules vides dans le
champ: Occurences uniques numérique avec la fonction Frequence(données,intervalle)-Avec ou sans cellules vides dans le champ =NB(1/FREQUENCE(champ;champ)) -Si 0 dans le champ =NB(1/FREQUENCE(SI(champ>0;champ);champ)) Frequence
Ces formules matricielles deviennent lentes pour un nombre
d'éléments important (>1sec pour 4000
items). Function NbDiff(champ) Dans le tableur: =NbDiff(A1:A10000) Nombre d'items différents sur champs discontinus=itemsdiff((A2:A11;D2:D11)) Function ItemsDiff(champ As Range) Occurences uniques texte avec Frequence(données,intervalle)=NB(1/FREQUENCE(EQUIV(chmp;chmp;0);LIGNE(INDIRECT("1:"&LIGNES(chmp)))))
Si cellules vides dans le champ Occurences uniques numérique avec critère=NB(1/FREQUENCE(SI(critere="x";ch);ch))
Autres exemples Occurences uniques texte avec critère=NB(1/FREQUENCE(SI(critere="x";EQUIV(ch;ch;0));LIGNE(INDIRECT("1:"&LIGNES(ch)))))
Si le champ ch comporte des vides =NB(1/FREQUENCE(SI((critere="x")*(ch<>"");EQUIV(ch;ch;0));LIGNE(INDIRECT("1:"&LIGNES(ch))))) Avec fonction personnalisée Function ItemsDifferentsCritere(champ, champcritere, critere) Dans le tableur:=ItemsDifferentsCritere(A1:A4000;B1:B4000;"x") Pour plusieurs critères, sous forme matricielle (+ rapide) Function ItemsDifferentsCritereMat(champ As Range, champcritere
As Range, critere As Range) Exemple avec 2 critères NombreNnomsDifférents2Critères Autre exemple =NB(1/FREQUENCE(SI(GAUCHE(champ;2)="CP";EQUIV(champ;champ;0));LIGNE(INDIRECT("1:"&LIGNES(champ))))) Occurences uniques dates pour une semaine=NB(1/FREQUENCE(SI(Sem=D2;dates);dates))
Occurences uniques dates par Nom/Semaine=NB(1/FREQUENCE(SI((SEM=$E4)*(NOM=F$3);DATE);DATE)) NombreDatesNomSem
On veut le nombre d'occurences uniques Client-Référence En F2:=NB(1/FREQUENCE(SI(GAUCHE(ref;2)=$E2;EQUIV(client&ref;client&ref;0));LIGNE(INDIRECT("1:"&LIGNES(client)))))
Un nombre d'items très important peut conduire à des temps de calcul trop élevés. Dans ce cas, utiliser une requête SQL : Select Vendeur,COUNT(*) AS Ttal FROM (SELECT DISTINCT Vendeur,Cmd From MaBD) GROUP BY vendeur Occurences uniques avec 1 critere avec fonction personnaliséeAvec une fonction personalisée, le calcul du nombre d'occurences uniques est beaucoup plus rapide. Nb
Valeurs Uniques 1 critère Fonction
N b Valeurs Uniques 2 critères -Sélectionner F2:H18 Solution formule (plus lent) Occurences uniques sur une zone filtrée=SOMME(--(FREQUENCE(SI(SOUS.TOTAL(3;DECALER(Nom;LIGNE(INDIRECT("1:"&LIGNES(Nom)))-1;;1)); ou =SOMME(--(FREQUENCE(SI(SOUS.TOTAL(3;INDIRECT("A"&LIGNE(Nom)));EQUIV(Nom;Nom;0)); Le nombre ou mot le plus fréquent dans une listeNumérique: =MODE(champ) Le second mot le + fréquent Avec critère Temps pour 4000 items 2,75 s Fonction personnalisée (0,04s pour 4000 items) Function MotPlusFrequent(champ) Plus
Fréquent Critère Fréquence avec SQLSql = "SELECT vendeur,COUNT(*) AS ttal FROM mabd GROUP BY vendeur ORDER BY COUNT(*) DESC" Somme d'un champ sans les doublons=SOMME(SI(champ<>"";champ*(1/NB.SI(champ;champ)))) Doublon dans un champDonne VRAI s'il y a au moins un doublon dans le champ. =SOMMEPROD(--(NB.SI(champ;champ)>1))>0 Recherche mot dans un champ-Recherche le numéro de ligne d'un mot dans un champ =INDEX(resultat;MAX(SI(champ=G2;LIGNE(INDIRECT("1:"&LIGNES(champ)))))) Recherche
Mot Champ Si le mot existe plusieurs fois, pour obtenir toutes les lignes de résultat =SI(LIGNES($1:1)<=NB.SI(champ;$G$2);INDEX(resultat; Recherche avec 2 conditionsOn fait une recherche sur 2 critères (Nom+ Prénom) =INDEX(Villes;EQUIV(1;(Noms=F2)*(Prénoms=G2);0)) Remarque: Sommeprod() ne permet pas de
récupérer une valeur Alpha. Recherche
Plusieurs Conditions Autre exemple On recherche un tarif en fonction d'un article et d'un poids. =INDEX(tarif;EQUIV(1;(article=A2)*(poids>=B2);0)) Autre exemple On cherche le temps mini pour un club et une catégorie: =MIN(SI((Club=H2)*(Cat=I2);temps)) Recherche avec résultats multiplesOn recherche toutes les valeurs associées à un code. -Sélectionner E9 Recherche
tous texte Le dernier: =INDEX(result;MAX(SI(Code=E6;LIGNE(INDIRECT("1:"&LIGNES(Code)));0))) Le 2e : =INDEX(result;PETITE.VALEUR(SI(Code=E6;LIGNE(INDIRECT("1:"&LIGNES(Code))));2)) Si la table est triéeEn E9: =SI(LIGNES($1:1)<=NB.SI(Code;$E$6);INDEX(result;EQUIV($E$6;Code;0)+LIGNES($1:1)-1;0);"") Avec 2 conditions-Sélectionner F9 Le premier:=INDEX(Resultat;EQUIV(1;(code1=F7)*(code2=G7);0)) Filtre base de donnéesOn veut récupérer les lignes pour une catégorie (a3) Nom de champ: bd =Ventes!$G$7:$L$100 -Sélectionner A7:D11 Pour Excel<2007: -Sélectionner une cellule ou -Sélectionner une cellule Filtre
BD Recherche dans un champ discontinuOn veut récupérer le titre (AAA,BBB,CCC) qui correspond à la valeur maxi: En K2: Appartenance à un ensembleOn veut compter le nombre de lettres A,B,C =SOMMEPROD(NB.SI(A1:B10;inclus)) On veut la somme des montants pour les codes aa,bb,cc =SOMMEPROD(SOMME.SI(codes;tcodes;montant)) ou =SOMMEPROD((codes="aa")+(codes="bb")+(codes="cc"))*montant ou =SOMMEPROD((codes={"aa"."bb"."dd"})*montant) ou =SOMMEPROD(SOMME.SI(Codes;{"aa";"bb";"cc"};Montant)) Si le champ n'a qu'une colonne. Autre exemple =SOMME(NB.SI(A1:C6;{"aa";"bb";"cc"})) Autre exemple On veut le total scandinavie. =SOMMEPROD((Pays={"finlande"."suède"."norvège"})*montant)
Exemple multi-zones =SOMME(NB.SI(INDIRECT({"A2:A8";"C4:C10"});{"aa"."bb"."cc"})) Autre exemple multi-zones Donne le nombre de cellules des champs tab1 et tab2 contenant aa =SOMME(NB.SI(INDIRECT({"tab1";"tab2"});"aa")) Donne le nombre de cellules des champs tab1,tab2,tab3 contenant aa =SOMME(NB.SI(INDIRECT("tab" &{1;2;3});"aa")) Moyenne des champs C6:E6,H6,M6:N6,Q6 supérieurs à 0 =SOMME(SOMME.SI(INDIRECT({"C6:E6";"H6";"M6:N6";"Q6"});">0"))/ Autre exemple multi-zones Donne le nombre de a ou b dans les champs A1:L1;A2:L2;A4:L4;A8:L8 =SOMMEPROD(NB.SI(DECALER(A1:L1;{0.1.3.7};);{"a";"b"})) Donne le nombre de 3 dans A1,B1,D1,G1,L1;A2,B2,D2,G2,L2;A4,B4,D4,G4,L4;... =SOMMEPROD(NB.SI(DECALER(INDIRECT({"A1";"B1";"D1";"G1";"L1"});{0.1.3.7};);3)) Donne le nombre de a ou c dans D2:D4,G2:G4,J2:J4,.. =SOMMEPROD(NB.SI(DECALER(D2:D4;;(LIGNE(1:5)-1)*3);{"a"."c"})) Autre exemple multi-zones Nombres >7 et <=10: =INDEX(FREQUENCE((A1:A10;C4:C10);{7;10});2) Total par ensembleOn veut le total du CA de chaque service =SOMME(SOMME.SI(noms;SI(service=G2;NomsService);Ca)) Nombre d'occurences à l'intérieur d'une chaîneOn veut connaître le nombre de fois où aa,bb,cc apparaît dans la chaîne xx aa zz cc kk yy zz =SOMME(--ESTNUM(TROUVE({"aa";"bb";"cc"};A2;1))) Nombres compris entre 2 valeurs avec Frequence()=INDEX(FREQUENCE(A2:A10;{100;300});2) Rapprochement de nomsOn veut calculer la somme des CA de sociétés
dont les noms ne sont pas orthographiés de la même façon. En D2:=SOMME(SI(ESTNUM(CHERCHE(société;D2));ca)) ExclusionOn compte le nombre de lettres dans le champ A1:B9 en excluant A,B,C =NBVAL(champ)-SOMMEPROD(NB.SI(champ;Exclus)) On compte le nombre de cellules dans le champ A1:B9 en excluant A,B,C =SOMMEPROD(--(NB.SI(Exclus;champ)=0)) Total pour la famille des codes 1000xx et un client A=SOMMEPROD((GAUCHE(code;4)="1000")*(client="A")*montant) Si 1000 est à l'intérieur des codes: =SOMMEPROD(ESTNUM(CHERCHE("1000";code))*(client="A")*montant) Somme 1 ligne sur 2 avec texteSans texte ou Si le champ peut être déplacé ou =SOMMEPROD(--(MOD(LIGNE(INDIRECT("1:"&LIGNES(champ)))-1;2)=0);champ) Somme des nombres >0 ou =SOMMEPROD((MOD(LIGNE(INDIRECT("1:"&LIGNES(champ)))+1;2)=0)*(champ>0);champ) Si le champ contient des cellules avec des erreurs #NA,#DIV/0! =SOMME(SI(ESTNUM(champ);champ*(MOD(LIGNE(champ)-1;2)=0))) Somme de champ conditionnelleOn veut le total de Janvier,Février,Mars qui vérifient la condition ok. =SOMMEPROD(--(B2:F10="ok");C2:G10) Ci dessous on veut: Total CA ok: =SOMMEPROD(--(B2:H10="ok");C2:I10) Somme d'un champ pour un code=SOMME.SI(A3:G9;"code1";B3:H9) Somme conditionnelle avec entêtePour chaque ligne, on veut la somme des CA et la somme des Bonus. Total CA: =SOMMEPROD(--($B$2:$F$2="CA");B3:F3)
ou =SOMME.SI($B$2:$I$2;"ca";B3:G3)
Autre solution sans entête: =SOMMEPROD(MOD(COLONNE(B3:F3);2);B3:F3)
On veut la somme des colonnes avec l'entête CA et qui vérifient la condition ok. =SOMMEPROD((D1:H1="CA")*(B2:B10="ok");D2:H10) Les entêtes sont CA Janvier,CA Février,CA Mars =SOMMEPROD((GAUCHE(D1:H1;2)="CA")*(B2:B10="ok");D2:H10) Les entêtes sont Janvier,Février,Mars =SOMMEPROD((ESTNUM(DATEVAL("01/"&D1:H1)))*(B2:B10="ok");D2:H10) Sans entête: =SOMME(SOMME.SI(B2:B10;"ok";DECALER(D2:D10;;{0.2.4}))) Les entêtes sont CA et Bonus Total CA ok: =SOMMEPROD((C2:K2="CA")*(B3:J11="ok");C3:K11) Autre exemple multi-zones =SOMMEPROD(--($B$1:$G$1="valeur")*(rep="O");B2:G9)
Autre exemple On veut le total des nombres placés sous le mot Composant. Autre exemple On veut le total des ventes en tenant compte du taux de change. =SOMME(SI(titre="VTE";nombre*DECALER(nombre;3;))) Moyenne des colonnes en jaunes sans tenir compte des 0En S3: =MOYENNE(SI((entete="Note")*(B3:R3<>"");B3:R3)) Sans entête: Recherche multipleOn veut obtenir les noms des entreprises qui pratiquent l'activité en G2: =SI(ESTNUM(PETITE.VALEUR(SI(Activité=$G$2;LIGNE(Activité));LIGNE()-2)); Noms de champ Recherche d'un code dans un champOn veut la valeur associée à un code en utilisant les titres en B1:I1 =INDEX(donnees;MAX((donnees=K2)*LIGNE(donnees)*(titre="code"))-LIGNE(donnees)+1; Si plusieurs réponses Si les codes sont alphanumériques et uniques (ou si les codes ne peuvent exister dans la liste des valeurs): =SOMME.SI(B2:H11;K2;C2:I11) On recherche les valeurs associées à un nom dans un champToutes les valeurs Si une seule valeur Total Liste sans doublonsCas1:La liste initiale doit commencer en A2, C1
doit être libre et si on déplace le champ Champ1, Supprimer les 0 avec Outils/Options/Affichage/Valeur 0 Si A1 est vide (=INDEX(A:A;FAUX) en matriciel donne le contenu de A1)
Cas3: C1 doit être libre Explications
Avec une fonction personnalisée (Liste Sans Doublons) -Sélectionner C2:C13 Sans doublons trié numériqueEn C2: =MIN(SI((NB.SI($C$1:C1;champ)=0)*(champ>0);champ)) Calcul des totaux par nom =INDEX(BD!$A:$A;MIN(SI(nom<>"";SI(NB.SI(A$1:A1;nom)=0;LIGNE(nom);LIGNES(nom)+LIGNE(nom))))) =SI(A2<>"";SOMME.SI(nom;A2;montant);0) Liste sans doublons conditionnelleOn veut la liste sans doublons pour Cond="x" =INDEX($A:$A;MIN(SI(cond="x";SI(NB.SI(D$1:D1;champ)=0;LIGNE(champ);LIGNES(champ)+LIGNE(champ))))) Si A1 est vide On veut seulement les mots commençant par la lettre
C Autre exempleEn E5:
ou =INDEX(noms;MIN(SI(codes=$D$2;SI(NB.SI(E$4:E4;noms)=0;LIGNE(INDIRECT("1:"&LIGNES(noms)));LIGNES(noms))))) Présentation d'une BD en colonnesEn D2:=INDEX(service;MIN(SI(service<>"";SI(NB.SI($C2:C2;service)=0;EQUIV(service;service;0);LIGNES(service))))) En D4: =SI(LIGNES($1:1)<=NB.SI(service;D$2); Liste sans videsEn C2: ou =SI(LIGNES($1:1)<=NBVAL(champ); Si A1 est vide: ListeSansVide
Version triée Si le champ a plusieurs colonnes
Ordre colonnes Ordre lignes En ligne =SI(COLONNES($A:A)<=NBVAL(champ);
Pour obtenir le résultat en colonne
Avec fonction personnalisée FonctionSansVideTrié Liste conditionnelleOn veut la liste des items ayant X dans la colonne B. =SI(LIGNES($1:1)<=NB.SI(cond;"x"); =SI(LIGNES($1:1)<=NB.SI(cond;"x"); Si A1 est vide (élimine les doublons): Pour Excel>=2007 ListeCond
Pour récupérer le résultat dans une seule cellule. =ListeCondUneCellule(champ;cond;"x") Function ListeCondUneCellule(champDonnées As Range,
champCond As Range, cond) Autre exemple A1 doit être vide.
Autre exemple =SI(LIGNES($1:1)<=NB.SI(INDEX(cond;COLONNES($A:A););"x"); ou (si A1 est vide) Autre exemple En A10 Autre exemple On veut la liste des produits dont le code commence par 2. =SI(LIGNES($1:1)<=SOMMEPROD(--(GAUCHE(num;1)=$D$2));
Autres exemples ListeCond
2 critères Liste conditionnelle avec appartenance à un ensembleOn veut les lignes pour lesquelles les conditions sont X,Y ou Z =SI(LIGNES($1:1)<=SOMME(NB.SI(cond;ListeCond)); ou =SI(LIGNES($1:1)<=SOMME(NB.SI(cond;{"X";"Y";"Z"})); On veut les mots qui contiennent X,Y ou ZListeConditionnelleEnsemble =SI(LIGNES($1:1)<=SOMME(NB.SI(champ;"*"&cond&"*")); =SI(LIGNES($1:1)<=SOMME(NB.SI(champ;"*"&{"X";"Y";"Z"}&"*")); Extraction des lignes d'une BDEn A6: Mat BD Extrait Recherche de valeurs alpha associées à un nomOn recherche les langues pour un nom. -Sélectionner G5 Détail Pour 2 critères Avec une fonction personnalisée(cf fichier RechercheLangues) -Sélectionner G5:G11 Si la liste est triéeEn D5: =SI(LIGNES($1:1)<=NB.SI(Caté;$D$2);INDEX(Réf;EQUIV($D$2;Caté;0)-1+LIGNES($1:1));"") Autre exemple On veut les items qui commencent par ***
Liste conditionnelle avec condition variableOn ne fait apparaître que les noms pour la compétence choisie en A2. DVCascadeCompétences En A10: Liste conditionnelle pour un ensemble de codesOn veut extraire du tableau les lignes dont les codes appartiennent à l'ensemble des codes en A3:A5. En G2: =SI(LIGNES($G$2:$G2)<=SOMME(--(NB.SI(code;cond))); Liste conditionnelle ongletOn veut extraire sur un onglet nommé Physique les lignes de la matière Physique. L'onglet est copiable. En A1: En A3: Liste conditionnelle avec fonction personnalisée-Cette fonction est très rapide et utilisable comme
une fonction standard sans connaître VBA Liste différenceNoms de champ En D2: DiffListes
Liste communs=SI(LIGNES($1:1)<=SOMMEPROD(NB.SI(Liste2;Liste1)); Liste des ouvrages pour un mot cléEn F2: En G2:
Liste conditionnelle horizontale-Sélectionner D2 -Sélectionner E2 Transformation de colonnes en lignesAutre exemple En B8: Donne les phrases contenant le mot cherché En E2:
Pour extraire la liste des noms en rougeEn C2: Function couleurFond(champ As Range) Private Sub Worksheet_SelectionChange(ByVal Target As Range) Pour extraire la liste des noms en gras=SI(LIGNES($1:1)<=SOMME(--estgras(Items)); Function EstGras(champ As Range) Pour extraire la liste des factures en €En D2: Function EstEuroMat(champ As Range) Classement avec égalitéOn veut le classement par points décroissant. Il y a égalité. En E2:=GRANDE.VALEUR(points;LIGNES($1:1)) ClassementEgalité Autre exempleOn veut la liste des noms dans l'ordre décroissant des notes (sans les notes). -Sélectionner D2:D10 Classement
égalité =Notes-LIGNE(Notes)/10^10 permet de différencier les notes égales. Autre exempleTop 5 :On veut les 5 premiers. Il y a égalité. -Sélectionner D2:D6
Les 5 premiers, les 5 derniers, les autresEn E3: En E6: On veut les 3 premiers d'une catégorie - Il y a égalité --Sélectionner H2:H5
3 Premiers Caté
Rang sans tenir compte des doublonsEn C2: =SOMMEPROD((notes>=B2)/NB.SI(notes;notes)) Pour que les doublons n'aient pas le même rangEn C2: =RANG(B2;notes)+NB.SI($B$2:B2;B2)-1 ou =SOMMEPROD(--(B2<notes))+NB.SI($B$2:B2;B2) Rang pour une catégorie=SOMMEPROD(--(Catégorie=B2)*(C2<Note))+1 Transporteur le moins cher pour un départementPremière position=INDEX(transp;MIN(SI(C$2:C$10=MIN(SI(depart=$A15;C$2:C$10));LIGNE(INDIRECT("1:"&LIGNES(depart)))))) 2eme position=INDEX(transp;MIN(SI(C$2:C$10=PETITE.VALEUR(SI(depart=$A21;C$2:C$10);2);LIGNE(INDIRECT("1:"&LIGNES(depart)))))) Classement par transporteurChaînes de caractèresRecherche par la droite dans une chaîne de caractèresOn recherche la position du dernier caractère ','
pour récupérer la dernière partie 37.35 =DROITE(A1;EQUIV(",";STXT(A1;NBCAR(A1)-LIGNE($1:$255);1);0)) ou Compter le nombre de caractères appartenant à un ensembleA1 contient: xxBxxCxxxx : On veut le nombre de fois où apparaissent les caractères A,B ou C Chaque caractère (A,B,C) n'est compté qu'une fois s'il apparaît plusieurs fois: =SOMMEPROD(--(ESTNUM(CHERCHE({"A";"B";"C"};A1)))) --> 2 Si les caractères cherchés(ABC) sont
dans la cellule B1 Chaque caractère (A,B,C) est compté à chaque fois q'il apparaît: =SOMMEPROD(--(ESTNUM(CHERCHE(STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1);"ABC")))) On veut supprimer le texte après le dernier \chaine1\chaine2\chaine3\chaine4\Asupprimer pour obtenir chaine1\chaine2\chaine3\chaine4 =GAUCHE(A1;NBCAR(A1)-EQUIV("\";STXT(A1;NBCAR(A1)-LIGNE($1:$255);1);0)-1) ou =GAUCHE(A1;CHERCHE("|";SUBSTITUE(A1;"\";"|";NBCAR(A1)-NBCAR(SUBSTITUE(A1;"\";""))))-1) On veut récupérer la dernière partie (Ecran standard)A1: /Informatique/Périphériques de sortie/Moniteur/Ecran standard =DROITE(A1;EQUIV("/";STXT(A1;NBCAR(A1)-LIGNE($1:$255);1);0)) A1: /Informatique/Périphériques de sortie/Moniteur/Ecran standard/ =SUBSTITUE(DROITE(A1;EQUIV("/";STXT(A1;NBCAR(A1)-LIGNE($1:$255);1);0));"/";"") ou =SUBSTITUE(STXT(A1;CHERCHE("|";SUBSTITUE(A1;"/";"|";NBCAR(A1)-NBCAR(SUBSTITUE(A1;"/";""))-1))+1;99);"/";"") Extraction des chaînes de chaine1\chaine2\chaine3\chaine4Chaîne avant le dernier \ ou =GAUCHE(A1;NBCAR(A1)-EQUIV("\";STXT(A1;NBCAR(A1)-LIGNE($1:$255);1);0)-1) Chaîne après le dernier \ ou =DROITE(A1;EQUIV("\";STXT(A1;NBCAR(A1)-LIGNE($1:$255);1);0)) On veut récupérer 8,741.59H 0000000190364654 Internal Message JEAN JEAN 8,741.59
Settled =DROITE(SUBSTITUE(A1;" Settled";"");EQUIV("
";STXT(SUBSTITUE(A1;" Settled";""); Ci dessous, on récupère l'avant dernière occurence H 0000000190364654 Internal Message JEAN JEAN 8,741.59
xxxx =STXT(GAUCHE(A1;CHERCHE("|";SUBSTITUE(A1;"
";"|";NBCAR(A1)-NBCAR(SUBSTITUE(A1;" ";""))-0))); On veut la dernière date de C2 si B2 est barré=SI(NON(estbarré(B2));"";SI(ESTERREUR(CHERCHE(",";C2));C2;DROITE(C2;EQUIV(","; Dans un module (Alt+F11 puis Insertion/Module) Function EstBarré(c) Récupération du nom et du prénom=GAUCHE(A4;EQUIV(VRAI;EXACT(STXT(A4;LIGNE($1:$255);3);MAJUSCULE(STXT(A4;LIGNE($1:$255);3)));0)) =STXT(A4;EQUIV(VRAI;EXACT(STXT(A4;LIGNE($1:$255);3);MAJUSCULE(STXT(A4;LIGNE($1:$255);3)));0)+1;999) Si les noms et prénoms sont dans un ordre quelconque En B7:=SI(CODE(STXT(A7;2;1))>=97; En C7:=SI(CODE(STXT(A7;2;1))>=97; Mise en ordre nom/prénomDans la liste originale, les noms/prénoms sont dans un ordre quelconque. En B7:=SI(CODE(STXT(A7;2;1))>=97;A7; En C7:=SI(CODE(STXT(A7;2;1))>=97; Découpage d'une adresseEn A1: 28 rue du grand Faubourg 33015 La Rochelle Découpe
adresse Rue Code postal Ville En VBA: Function CodePostal(chaine) Function Rue(chaine) Function Ville(chaine) Si l'adresse se présente ainsiDurand Alain 14280 Paris Le code postal s'obtient par =STXT(A1;EQUIV(VRAI;ESTNUM(--(STXT(A1;LIGNE($1:$255);1)));0);5) Donne le premier nombre de 5 chiffres d'une chaîne1432,rue de Milan 78180 Montigny (12345) =STXT(A1;EQUIV(1;ESTNUM(--(STXT(A1;LIGNE($1:$255);5)))* Renvoie VRAI si une chaîne contient au moins un chiffreA1 contient aaa123bbbb =NB(--(STXT(A1;LIGNE($1:$255);1)))>0 Renvoie VRAI si la chaîne en A1 contient au moins un chiffre. Donne la partie numérique d'une chaîne (1 seule occurrence)A1 contient XYZ123. On veut 123. =STXT(A1;EQUIV(VRAI;ESTNUM(--(STXT(A1;LIGNE($1:$255);1)));0);99) A1 contient Tph 0130556677 France. On veut 0130556677. =STXT(A1;EQUIV(VRAI;ESTNUM(CNUM(STXT(A1;LIGNE($1:$255);1)));0);NB(--(STXT(A1;LIGNE($1:$255);1)))) A1 contient Total de Toto : 256.25 xxx. Pour obtenir 256.25 =STXT(A1;EQUIV(VRAI;ESTNUM(CNUM(STXT(A1;LIGNE($1:$255);1)));0); =CNUM(SUBSTITUE(STXT(A1;EQUIV(VRAI;ESTNUM(CNUM(STXT(A1;LIGNE($1:$255);1)));0); A1 contient MR DANIEL 1210 DUPOND. On veut les 4 caractères 1210. =STXT(A1;EQUIV(VRAI;ESTNUM(CNUM(STXT(A1;LIGNE($1:$255);1)));0);4) A1 contient ABN AMRO BANK NV 3.375% 21/01/2014. On veut 3,375. =SUBSTITUE(STXT(A1;EQUIV(VRAI;ESTNUM(CNUM(STXT(A1;LIGNE($1:$232);1)));0); A1 contient Equipe design Plans d'exécution et estimé 40 jours Lun 12-10-29 Ven 12-12-21. On veut 40 =STXT(A1;EQUIV(VRAI;ESTNUM(--(STXT(A1;LIGNE($1:$255);1)));0);CHERCHE("jour";A1)- A1 contient abcd55 ef-ghi 2 5 7 1 3 4 14 13 =STXT(A1;NBCAR(A1)-EQUIV(FAUX;ESTNUM(--(STXT(SUBSTITUE(A1;"
";"0");NBCAR(SUBSTITUE(A1;" ";"0"))-LIGNE($1:$255);1)));0)+1;99) A1 contient 3 Apprenti Sorcier 208 =GAUCHE(A1;CHERCHE(" ";A1)-1) -->3 S'il n'y a pas d'espace =GAUCHE(A1;EQUIV(VRAI;NON(ESTNUM(--(STXT(A1;LIGNE($1:$255);1))));0)-1)
--> 3 Transformation rue=STXT(A1;EQUIV(FAUX;ESTERREUR(TROUVE(STXT(A1;LIGNE($1:$255);1);"ABCDEFGHIJKLMNOPQRSTUVWXYZ"));0);999)& Nombre de majuscules en A1=SOMMEPROD(((CODE(STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1))>=65)* Elimine le numérique en début de chaîne=SUPPRESPACE(STXT(A1;EQUIV(FAUX;ESTNUM(--(STXT(A1;LIGNE($1:$255);1)));0);999)) Caractères invalidesOn veut connaître le nombre de caractères invalides en B2 =SOMMEPROD(--(ESTERREUR(CHERCHE(STXT(B2;LIGNE($1:$255);1);A2)))) Séparation numérique=GAUCHE(A2;EQUIV(VRAI;ESTNUM(CNUM(STXT(A2;LIGNE($1:$255);1)));0)-2) =STXT(A2;EQUIV(VRAI;ESTNUM(CNUM(STXT(A2;LIGNE($1:$255);1)));0);99) Séparation majuscule=STXT(A1;1;EQUIV(VRAI;EXACT(STXT(A1;LIGNE($2:$255);1);MAJUSCULE(STXT(A1;LIGNE($2:$255);1)));0)) =STXT(A1;EQUIV(VRAI;EXACT(STXT(A1;LIGNE($2:$255);1);MAJUSCULE(STXT(A1;LIGNE($2:$255);1)));0)+1;999) Compter les AB + CD dans le champ A1:A5AB|AB|CD|SD|AB
=SOMMEPROD((NBCAR(A1:A5)-NBCAR(SUBSTITUE(A1:A5;{"AB"."CD"};"")))/2) Recherche du mot après la dateOn veut extraire le mot après la date 040310 (Shell) Paiement Carte 040310 Shell 2562 Montereau =GAUCHE(STXT(A1;EQUIV(VRAI;ESTNUM(CNUM(STXT(A1;LIGNE($1:$255);1)));0)+7;999); Position de la première lettre majuscule dans une chaîneChaîne en A1: abc123MNP =MIN(SI(ESTERREUR(TROUVE(CAR(LIGNE($65:$90));A1));"";TROUVE(CAR(LIGNE($65:$90));A1))) Nombre de caractères communs entres 2 chaînes (en A2 et B2)=SOMMEPROD(NBCAR(B2)-NBCAR(SUBSTITUE(B2;STXT(A2;LIGNE($1:$255);1);""))) DatesNombres de jours ouvrés entre 2 dates (samedi jour ouvré)Les dates sont en A2 et B2 =SOMMEPROD((JOURSEM(LIGNE(INDIRECT(A2&":"&B2));2)<7)*(NB.SI(fériés;LIGNE(INDIRECT(A2&":"&B2)))=0)) Nombre de jours ouvrés entre 2 dates en A2,B2 (sans samedi,dimanche, jours fériés, vacances)=SOMMEPROD((JOURSEM(LIGNE(INDIRECT(A2&":"&B2));2)<6)*(NB.SI(fériés;LIGNE(INDIRECT(A2&":"&B2)))=0)* Nombre de jours entre 2 dates (différents de mercredi et dimanche )Les dates sont en A1 et B1 =SOMMEPROD(--ESTNA(EQUIV(JOURSEM(LIGNE(INDIRECT(A1&":"&B1)));{1;4};0))) Samedis non férié entre 2 dates en B1 et b2=SOMMEPROD((JOURSEM(LIGNE(INDIRECT(B1&":"&B2));2)=6)*(NB.SI(fériés;LIGNE(INDIRECT(B1&":"&B2)))=0)) Dimanches non férié entre 2 dates en B1 et b2=SOMMEPROD((JOURSEM(LIGNE(INDIRECT(B1&":"&B2));2)=7)*(NB.SI(fériés;LIGNE(INDIRECT(B1&":"&B2)))=0)) Nb de jours fériés entre 2 dates en B1 et B2=SOMMEPROD(NB.SI(fériés;LIGNE(INDIRECT(B1&":"&B2)))) Nombre de vendredis entre 2 dates (A1,B1)=ENT((B1-JOURSEM(B1-5)-A1+8)/7) Nombre de dimanches dans le mois=SOMMEPROD(--(JOURSEM(LIGNE(INDIRECT(DATE(an;Mois;1)&":"&DATE(an;Mois+1;0)));2)>6)) Nombre de samedis et dimanches dans le mois=SOMMEPROD(--(JOURSEM(LIGNE(INDIRECT(DATE(an;Mois;1)&":"&DATE(an;Mois+1;0)));2)>5)) Jour ouvré précédentLa date est en A2 =MAX((JOURSEM(A2-LIGNE(1:6);2)<6)*(NB.SI(Fériés;A2-LIGNE(1:6))=0)*(A2-LIGNE(1:6))) Avec la macro complémentaire Utilitaire analyse:=SERIE.JOUR.OUVRE(A2;-1;Fériés) =MAX((JOURSEM(A2-LIGNE(1:6);2)={1.2.4.5})*(NB.SI(Fériés;A2-LIGNE(1:6))=0)*(A2-LIGNE(1:6))) Prochain jour ouvréLa date est en A2 =MIN(SI((JOURSEM(A2+LIGNE(1:6);2)<6)*(NB.SI(fériés;A2+LIGNE(1:6))=0)<>0;(A2+LIGNE(1:6)))) Liste des vendredis entre 2 dates (A1 et A2)-Sélectionner n cellules
Liste des Samedis/Dimanches et jours fériés d'une annéeEn A3: SamediDimancheFériésAnnée Liste des dimanches et jours fériés du mois choisi-Sélectionner 9 cellules Liste des jours fériés de l'année qui sont des Samedi ou Dimanche-Sélectionner 5 cellules =SI(ESTNUM(PETITE.VALEUR(SI((JOURSEM(LIGNE(INDIRECT(DATE(an;Mois;1)&":"&DATE(an;Mois+1;0))))=1)+ x jours ouvrés plus tard (samedi, dimanche fériés)A2 contient la date et B2 le nombre de jours ouvrés à ajouter =PETITE.VALEUR(SI((JOURSEM(A2+LIGNE(1:50);2)<6)*(NB.SI(fériés;A2+LIGNE(1:50))=0);A2+LIGNE(1:50));B2) x jours ouvrés plus tard (mercredi,samedi,dimanche fériés)A2 contient la date et B2 le nombre de jours ouvrés à ajouter =PETITE.VALEUR(SI((JOURSEM(A2+LIGNE(1:50);2)={1.2.4.5})*(NB.SI(fériés;A2+LIGNE(1:50))=0);A2+LIGNE(1:50));B2) x jours ouvrés plus tard (dimanche férié)A2 contient la date et B2 le nombre de jours ouvrés à ajouter =PETITE.VALEUR(SI((JOURSEM(A2+LIGNE(1:50);2)<7)*(NB.SI(fériés;A2+LIGNE(1:50))=0);A2+LIGNE(1:50));B2) x jours ouvrés avant (samedi,dimanche fériés)A2 contient la date et B2 le nombre de jours ouvrés à retrancher =GRANDE.VALEUR(SI((JOURSEM(A2-LIGNE(1:50);2)<6)*(ESTNA((EQUIV(A2-LIGNE(1:50);fériés;0))));A2-LIGNE(1:50));B2) Liste des Jours ouvrés d'une année1er jour en D2: =MIN(SI((JOURSEM(DATE(an;1;0)+LIGNE($1:$7);2)<6)*(NB.SI(fériés;DATE(an;1;0)+LIGNE($1:$7))=0); 2e jour en D3: =SI(D2<>"";SI(MIN(SI((JOURSEM(D2+LIGNE($1:$7);2)<6)*(NB.SI(fériés;D2+LIGNE($1:$7))=0); Liste des Jours ouvrés entre 2 datesD2: =MIN(SI((JOURSEM(B1+LIGNE($1:$7);2)<6)*(NB.SI(fériés;B1+LIGNE($1:$7))=0);B1+LIGNE($1:$7))) F2: =MIN(SI((JOURSEM(B1+LIGNE($1:$7);2)<6)*(JOURSEM(B1+LIGNE($1:$7);2)<>3)*(NB.SI(fériés;B1+LIGNE($1:$7))=0);B1+LIGNE($1:$7))) Liste des jours ouvrés entre 2 dates (B1 et B2) sans vacances =PETITE.VALEUR(SI((JOURSEM(LIGNE(INDIRECT($B$1&":"&$B$2));2)<6)*
(NB.SI(fériés; Liste des jours ouvrés du mois choisiSélectionner 25 cellules =SI(ESTNUM(PETITE.VALEUR(SI((JOURSEM(LIGNE(INDIRECT(DATE(an;Mois;1)&":"&DATE(an;Mois+1;0)));2)<6)* Liste des jours fériés entre 2 dates-Sélectionner C2:M2 Nombre de jours fériés entre 2 dates =SOMME(--ESTNUM(SI((NB.SI(fériés;LIGNE(INDIRECT(A2&":"&B2)))>0);LIGNE(INDIRECT(A2&":"&B2))))) On recherche un mois dans un texteIl faut extraire le mois présent dans le texte en A1 (mars). Le 23 mars 1995 =INDEX(TEXTE(DATE(;LIGNE(1:12);1);"mmmm");EQUIV(1;NB.SI(A1;"*"&TEXTE(DATE(;LIGNE(1:12);1);"mmmm")&"*");0)) On recherche un jour dans un texteIl faut extraire le jour présent dans le texte en A1 (jeudi). Le jeudi 14 mars 2012 =INDEX(TEXTE(DATE(;1;LIGNE(1:7));"jjjj");EQUIV(1;NB.SI(A1;"*"&TEXTE(DATE(;1;LIGNE(1:7));"jjjj")&"*");0)) Nb de jours depuis le dernier contrôleEn B3: Planning à partir d'une BDEn C5: Tri matriciel-Sélectionner D2:D8 Tri
matriciel alpha
Recherche dans un champ multi-zonesOn veut le nom associé au plus grand nombre du champ livre. Si on utilise la ligne de titre B2:I2=INDEX(NOMS;MAX((donnees=MAX(donnees*(titre="livre")))*LIGNE(donnees)*(titre="LIVRE"))-LIGNE(donnees)+1) Noms de champ Si plusieurs réponses=SI(GRANDE.VALEUR((donnees=MAX(donnees*(titre="livre")))*LIGNE(donnees)*(titre="LIVRE");LIGNES($1:1))>0; Sans utiliser la ligne de titres=INDEX(NOMS;EQUIV(MAX(LIVRE);DECALER(INDIRECT("b3:b11");; Recherche de valeurs alpha associées avec transpositionOn veut obtenir la liste des valeurs alpha associées à un nom. MatricielTranspose -Sélectionner B9:B13 MFC pour cacher les #Nombre: Tri avec doublonsOn veut une copie triée du tableau en A1:D5. Il
y a des doublons. Tri personnaliséOn veut un tri personnalisé dans l'ordre U D V T
Q ou =STXT("UDVTQ";PETITE.VALEUR(TROUVE(A2:E2;"UDVTQ");COLONNE(INDIRECT("1:"&COLONNES(A2:E2))));1) Fonction personnalisée matricielleOn veut compter le nombre de cellules rouges contenant Chat =SOMMEPROD((couleurfond(B2:B10)=3)*(B2:B10="chat")) ou =SOMMEPROD((couleurfond(B2:B10)=couleurfond(D2))*(B2:B10="chat")) Fonction
couleur Function couleurFond(champ As Range) Pour MAJ Somme des cellules d'un champ hors dates=SOMMEPROD(--(NON(estdate(champ)));champ) Function EstDate(champ As Range) Extrait de Compte en fonction du mois choisi-En D5 Recherche sur une partie de code-La table contient des codes aa,bb,cc,... Le code cherché est bb rouge Pour obtenir le prix =INDEX(prix;EQUIV(1;EQUIV(code&"*";A2;0);0)) ou =SI(SOMME(NB.SI(A2;"*"&Code))=0;"Inconnu";INDEX(prix;EQUIV(1;NB.SI(A2;code&"*");0)))) Rech Partie
Code
On recherche une reférence abrégée à partir d'une référence commercialePour PRODUIT AA ROUGE, il faut retrouver la référence abrégée PRODUIT AA puis AAAAA. =INDEX(COMPOSANT;EQUIV(1;EQUIV(RefAbr&"*";A4;0);0))
On recherche un code dans un texteIl faut retrouver le code présent dans le texte (ASA,APA,DPD) =INDEX(Codes;EQUIV(1;EQUIV("*"&Codes&"*";A2;0);0)) ou =INDEX({"ASA";"APA";"DPD"};EQUIV(1;EQUIV("*"&{"ASA";"APA";"DPD"}&"*";A2;0);0)) Autre exemplePour FIDJI BLACK/RED VENERE T.48, on recherche la référence associée à BLACK/RED En B2: =INDEX(ref;EQUIV(1;NB.SI(A2;"*"&couleur&"*");0)) Autre exemple Total des montants sans doublons=SOMMEPROD((code<>"x")*(NoDos<>DECALER(NoDos;1;))*montant)
Somme des points des participants qui ont un indicateur de présence renseigné à Ok=SOMME((Données="Ok")*(nature="presence")*(DECALER(nature;1;)="points")*(Noms=DECALER(Noms;1;))*
Union de 2 zones-Sélectionner E2:E19
Remarque sur l'écriture des formules matricielles (tri matriciel)On veut obtenir en D2:D1000 le champ A2:A1000 trié 1ere méthode: La formule matricielle est écrite une seule fois dans un champ -Sélectionner D2:D1000 Pour 1.000 éléments, si on modifie une cellule le temps de recalcul est < 1sec 2eme méthode :La formule est écrite dans la cellule D2 puis recopiée =SI(LIGNES($1:1)<=NBVAL(champ);INDEX(champ;EQUIV(P ETITE.VALEUR(NB.SI(champ;"<"&champ);LIGNES($1:1)); Pour 1000 éléments, si on modifie une cellule, le temps de recalcul est >10 sec En plus du gain de temps lorsque la formule est écrite une seule fois dans un champ, il y a un gain de place mémoire. Dictionary pour remplacer Sommeprod()Comment améliorer Sommeprod() lorsque cette fonction - travaille sur des champs de taille importante Sur l'exemple en PJ, avec une fonction perso matricielle, on passe d'un temps de recalcul de 3 sec à 0,05 sec pour 4.000 lignes =SOMMEPROD((dates=A2)*(numero=B2)) ou =CombienFois(numero; dates) Sur l'exemple ci dessous, pour une BD de 60.000
lignes et 2x400 formules, Somme d'une BD par catégorieOn veut la somme du CA pour le secteur primaire (secteurs A,B,C) =SOMME(SI(ESTNUM(EQUIV(Secteur;SecteurPri;0));CAHT))
|