Bonsoir cholor34,
Tu trouveras sur ce lien un nouveau fichier avec deux propositions, la première dans l'onglet "Résultat 1", qui est la formule précédente mais adaptée pour ce nouvel onglet "Résultat 1", les données de base sont placées dans l'onglet "Base", et une seconde proposition dans l'onglet "Résultat 2" en passant par des colonnes intermédiaires, sans utilisation de formules matricielles et qui sera peut-être plus facile à adapter :
http://www.cijoint.fr/cjlink.php?file=cj201102/cij7sUZDEJ.xlsConcernant la formule matricielle utilisée dans ce fichier:

La formule placée dans l'onglet "Résultat 1" va puiser dans l'onglet "Base" et devient par exemple en B1:
- Code: Tout sélectionner
=DECALER(Base!$A$1;MIN(SI(ESTVIDE(Base!D1:D20);LIGNE(Base!D1:D20)))-1;;;)&DECALER(Base!$B$1;MIN(SI(ESTVIDE(Base!D1:D20);LIGNE(Base!D1:D20)))-1;;;)
En décomposant cette formule, voyons déjà cette partie là:
- Code: Tout sélectionner
MIN(SI(ESTVIDE(Base!D1:D20);LIGNE(Base!D1:D20)))
LIGNE(Base!D1:D20) en matricielle renvoie une matrice de 1 à 20 comme ceci : {1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}
Toujours en matricielle, la formule ESTVIDE(Base!D1:D20) renvoie elle aussi une matrice composée de valeurs VRAI ou FAUX. Si la cellule analysée est vide, la résultat est VRAI, dans le cas contraire le résultat est FAUX. Dans la cellule de notre exemple la matrice renvoyée est :
{FAUX;VRAI;FAUX;FAUX;FAUX;FAUX;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI;VRAI}
La fonction SI() utilisée ici: SI(ESTVIDE(Base!D1:D20);LIGNE(Base!D1:D20)) teste le résultat de la matrice renvoyée pas ESTVIDE(), si ce résultat est VRAI, on retient l'élément correspondant dans la matrice LIGNE(), si le résultat est FAUX on ne prend pas cet élément et on reste sur FAUX.
Dans notre exemple, la matrice renvoyée par cette fonction SI() est : {FAUX;2;FAUX;FAUX;FAUX;FAUX;7;8;9;10;11;12;13;14;15;16;17;18;19;20}
On voit que toutes les cellules remplies dans la colonne D de l'onglet base correspondent à un FAUX. La ligne d'entête est remplie, la matrice renvoie FAUX, la ligne suivante est vide, la deuxième position de la matrice est égale à 2, etc ...
Enfin, la fonction MIN() va lire cette matrice et renvoyer la valeur minimum qu'elle contient, en l'occurrence 2.
Maintenant que l'on sait que la première cellule vide de la colonne D se trouve ligne 2, il faut aller chercher la valeur de cette ligne 2 en colonne A, c'est là qu'intervient la fonction DECALER().
La formule utilisée est celle-ci:
- Code: Tout sélectionner
DECALER(Base!$A$1;MIN(SI(ESTVIDE(Base!D1:D20);LIGNE(Base!D1:D20)))-1;;;)
si je remplace le calcul par le résultat 2 obtenu ci-dessus, cette formule est en réalité:
- Code: Tout sélectionner
DECALER(Base!$A$1;(2)-1;;;)
C'est à dire que je me place sur la cellule A1 de l'onglet base, je descends de 2 cellules, moins une à cause de l'entête, je ne change pas de colonne (la valeur par défaut est zéro dans ces cas là), la hauteur de mon champ est 1 tout comme la largeur (1 étant la valeur par défaut, elle n'est pas renseignée, mais j'aurais tout aussi bien pu écrire DECALER(Base!$A$1;(2)-1;0;1;1) ).
J'arrive donc sur la cellule A2 de l'onglet Base, qui contient la lettre A, c'est bien ce que renvoie cette formule.
Même raisonnement pour aller chercher la valeur située en colonne B sur la ligne 2.
Ici la formule utilisée revient à écrire DECALER(Base!$B$1;(2)1;;;), j'aurais pu dre aussi DECALER(Base!$A$1;(2)-1;1;;), le résultat est 1 soit la valeur se trouvant dans la cellule B2 de l'onglet Base.
Au final, il suffit de concaténer les deux résultats, c'est le signe & qui équivaut à la fonction CONCATENER() qui s'en charge et renvoie donc le résultat "A1"
Voilà pour les explications de cette première formule, j'espère qu'elles pourront t'aider, mais comme les formules matricielles ne sont pas toujours faciles à utiliser, voici une autre proposition (dans l'onglet Résultat 2)

Dans cet exemple, les colonnes A B et C contiennent les formules intermédiaires. En A2 et copiée vers le bas et vers la droite:
- Code: Tout sélectionner
=SI(ET(Base!C2="";NB.SI(A$1:A1;"<>0")=1);Base!$A2&Base!$B2;0)
Cette formule renvoie 0 (zéro) sauf si la condition est remplie, c'est à dire que la lige correspondante de l'onglet Base est vide et que les cellules de la colonne A en partant de la première ligne jusqu'à la ligne supérieure ne contiennent pas autre chose que zéro. Il n'y a donc qu'une seule valeur par colonne.
En cellule E1 et copiée vers la droite la formule est :
- Code: Tout sélectionner
=RECHERCHE("xxxx";A2:A20)
Elle va chercher une valeur texte colonne A et ne peut en trouver qu'une, qu'elle affiche donc.
Au cas où il n'y aurait que des zéros dans cette zone, la fonction RECHERCHE() renverrait #N/A.
Pour éviter cette situation inesthétique il suffit de tester cette erreur et d'écrire comme formule:
- Code: Tout sélectionner
=SI(ESTNA(RECHERCHE("xxxx";A2:A20));"";RECHERCHE("xxxx";A2:A20))
Voilà pour cette seconde formule, plus simple et qui rejoint du coup un exemple proposé à FAB précédemment.
En espérant que cela pourra t'aider,
bien cordialement,
D