Constitution de couplés sous conditions
Bonjour le Forum,
Je ne sais pas trop comment m'y prendre avec ce problème, je m'explique :
Je souhaiterai constituer des couplés à partir d'une série de nombre que j'ai appelé "ligne de traitement" et de 2 listes de nombres statiques (L1 et L2) .
On regarde chacun des 3 premiers nombres de la ligne de traitement dans quelle ligne ils appartiennent ( L1 ou L2 ) et on associe
le restant des nombres de la ligne de traitement faisant partie de la même ligne ( L1 ou L2 ) d'un des 3 nombres de la ligne de traitement.
J'ai conscience que mon explication est loin d'être clair, c'est pourquoi j'ai joins un fichier qui rentre plus dans le détail avec un exemple et un résultat final souhaité.
Le résultat final peut se faire avec des formules ou en VBA, à mon avis
Merci par avance, pour l'aide qui sera apportée,
Mamarus
Bonjour,
Il y a déjà un problème dans ton exposé : le 8 qui apparaît en résultat, en ne figurant pas dans la ligne de traitement ! ?
Cordialement.
Bonjour MFerrand,
Merci tout d'abord de t'être intéressé à mon sujet, tu as raison, le 8 n'a rien à y faire dans le résultat.
Cordialement,
Mamarus
Bonsoir,
Opérer par formules m'a semblé quelque peu compliqué et une fonction personnalisé m'a parue plus souple.
Du même coup la fonction pouvait fournir tous les résultats dans la foulée...
Function COUPLER3(ltr As Range, lst1 As Range, lst2 As Range)
Dim cpl(), n%, i%, j%, k%, ic%, lst As Range, dlst As Boolean
Application.Volatile
n = ltr.Cells.Count
ReDim cpl(1 To 3, n)
For i = 1 To 3
cpl(i, 0) = ltr.Cells(i)
For j = 1 To lst1.Cells.Count
If lst1.Cells(j) = cpl(i, 0) Then
Set lst = lst1: Exit For
End If
Next j
For j = 1 To lst2.Cells.Count
If lst2.Cells(j) = cpl(i, 0) Then
If lst Is Nothing Then
Set lst = lst2
Else
Set lst = Nothing: dlst = True
End If
Exit For
End If
Next j
If Not lst Is Nothing Then
cpl(i, 1) = "//": ic = 1
For k = i + 1 To ltr.Cells.Count
For j = 1 To lst.Cells.Count
If lst.Cells(j) = ltr.Cells(k) Then
ic = ic + 1: cpl(i, ic) = ltr.Cells(k)
End If
Next j
Next k
For k = ic + 1 To n
cpl(i, k) = ""
Next k
Else
If dlst Then
cpl(i, 1) = CVErr(xlErrRef)
Else
cpl(i, 1) = CVErr(xlErrNA)
End If
For k = 2 To n
cpl(i, k) = ""
Next k
End If
Set lst = Nothing: dlst = False
Next i
COUPLER3 = cpl
End FunctionUn peu longue mais on opère diverses vérification !
Sauf que les plages contiennent bien des nombres (mais dans ce cas, le renvoi #VALEUR! est de règle).
Si l'un des 3 nombres à coupler n'est trouvé dans aucune des listes, l'erreur #N/A sera renvoyée pour ce nombre.
Si l'un des 3 nombres à coupler figure dans les deux listes, l'erreur #REF! sera renvoyée.
La fonction est matricielle. Elle comporte 3 arguments de type plage : la liste de traitement, la liste statique 1, la liste statique 2.
Son utilisation implique la sélection d'une plage réponse de 3 lignes (3 nombres à coupler) et d'autant de colonnes qu'il y a de nombre dans la liste de traitement +1 (en effet, si pour le premier nombre couplé, tous ceux qui suivent appartiennent à la même liste que lui toutes ces colonnes pourront être occupées).
La sélection faite, on tape la fonction : =COUPLER3(ListeTraitement;ListeStatique1;ListeStatique2)
Et on valide par Ctrl+Maj+Entrée.
Les valeurs 0 qui complèteraient les cellules dépourvues de valeur sont éliminées par un remplissage systématique de "".
Cordialement.
Bonjour,
Merci pour le travail accompli, c'est ce que je recherchai exactement
bonne journée,
Mamarus