Formule matricielle pour trouver date minimum <>0
Bonjour,
Attention, je pense que c'est assez compliqué...
Voici le problème que j'essaye de résoudre depuis plusieurs jours, horrible, je bloque sur la dernière étape, je pense que j'atteins ma limite de compétence...
J'ai dans un tableau un colonne de dates "Planning date", dont certaines sont vides, et trois colonnes "Position Source", "Position Destination" et "Produit":
- Position Source: valeurs de 1 à 7, elle déterminent une position source dans un réseau
- Position Destination: valeurs de 0 à 6, elle déterminent une position destination dans un réseau
- Produit: Nom du produit. Pour la position 1, chaque cellule a un nom du produit unique, pour les autres positions chaque cellule peut avoir un ou plusieurs noms de produits, séparés par une virgule.
- Planning date: Date déterminée manuellement pour la position 1,
Je cherche à déterminer la date minimum, parmi un ensemble de dates qui correspondent aux lignes répondant à certains critères:
- critère 1: la Position Source de ces lignes est inférieur de 1 à la Position Destination de la ligne actuelle
- critère 2: le Produit de ces lignes se retrouve dans le champ Produit de la cellule actuelle
J'ai utilisé une formule matricielle qui combine des instructions pour répondre à chaque critère:
1. Lignes dont la Position Source est inférieur de 1 à la Position Destination actuelle: IFERROR( -- ( [Position Source] = [@[Position Destination]] - 1 )
2. Lignes dont le Produit se retrouve dans le nom du Produit de la ligne actuelle: IFERROR( -- ( FIND( [Produit] ; [@[Produit] ; 1 ) <> 0 ) ; 0 )
Jusqu'ici tout va bien, le résultat de ces deux étapes donne une matrice de 1 (tous les critères sont respectés) et de 0 (l'un des critères deux n'est pas respecté) à X lignes et 1 colonne [ou l'inverse
3. Puis la même formule liste toutes les dates de colonne Planning, et la rapproche de la matrice précédente pour lister les dates dont les lignes correspondent aux deux critères: IFERROR( -- ( [Planning Date] ) ; 0 )
Le résultat intermédiaire de l'étape 3 est une matrice de dates (tous les critères sont respectés) et de zéros (l'un des critères n'est pas respecté), elle ressemble à ça: {0, 45047, 44682, 0, 43831, 0, 0, 44166, 45292, 0, 0}
Et le résultat intermédiaire après l'étape 3 ressemble à ça: {0, 0, 0, 0, 43831, 0, 0, 44166, 0, 0, 0} ce qui dans ce cas montre qu'il y a deux dates dont les lignes remplissent les trois critères.
Et maintenant le problème: Je n'arrive pas à extraire la date minimum de ce range.
Si j'utilise la fonction "Min", bien entendu Excel retourne 0, voici la formule...
IFERROR(
EOMONTH(
MIN(
IFERROR( -- ( [Position Source] = [@[Position Destination]] + 1 ) *
IFERROR( -- ( FIND( [Produit] ; [@[Produit] ; 1 ) <> 0 ) ; 0 ) *
IFERROR( -- ( [Planning Date] ) ; 0 )
) ' Fin de MIN
; 0 ) ' fin de EOMONTH
; "" ) 'fin de IFERROR
(à noter que je ne peux pas utiliser l'artifice de remplacer 0 par de grosses valeurs…)
J'essaye donc de combiner:
- la fonction SMALL(range, k) pour déterminer le kième plus petit nombre, ou range = {0, 0, 0, 0, 43831, 0, 0, 44166, 0, 0, 0}
- combinée à la fonction COUNTIF pour calculer ce fameux chiffre k en comptant le nombre de 0 du même range que je dois recalculer...
MAIS le problème est que Excel n'accepte pas que j'utilise COUNTIF dans la formule ci-dessous:
EOMONTH(
SMALL(
IFERROR( -- ( [Position Source] = [@[Position Destination]] - 1 ) *
IFERROR( -- ( FIND( [Produit] ; [@[Produit] ) ; 1 ) <> 0 ) ; 0 ) *
IFERROR( -- ( [Planning Date] ) ; 0 ) ;
COUNTIF(
IFERROR( -- ( [Position Source] = [@[Position Destination]] - 1 ) *
IFERROR( -- ( FIND( [Produit] ; [@[Produit] ; 1 ) <> 0 ) ; 0 ) *
IFERROR( -- ( [Planning Date] ) ; 0 ) ;
0
) ' fin du COUNTIF
) 'fin du SMALL
; 0 ) 'fin du EOMONTH
(CTRL + SHIFT à la fin)
Je joins un fichier de test, si vraiment vous pouviez m'aider
Merci par avance,
Hermann
J'ai finalement trouvé la solution sur votre forum, et elle est simple en plus
Pas besoin de calculer le k de la fonction SMALL, il doit être égal à 1.
Par contre il faut ajouter un IF au bon endroit:
IFERROR(
EOMONTH(
SMALL(
IF(
IFERROR( -- ( [Position Source] = [@[Position Destination]] + 1 ) *
IFERROR( -- ( FIND( [Produit] ; [@[Produit] ; 1 ) <> 0 ) ; 0 ) ;
[Planning Date] ) ; ' Fin de IF
1 ) ; ' Fin de SMALL
0 ) ; ' fin de EOMONTH
"" ) 'fin de IFERROR
Merci de votre aide précieuse !