Bonjour à tous ,
J'ai trouvé le problème original et donc je m'y suis intéressé.
Les hypothèses:
- j'ai laissé la base de données en plage ordinaire
- j'ai supprimé la colonne 1 de la base de donnée qui ne (me) sert à rien. La base de données ne contient plus que 7 colonnes de A à G (en cas d'une réelle nécessité d'une colonne contenant la concaténation, on peut la remettre mais en colonne H => la macro fonctionnera sans rien n'y changer)
Les paramètres de la fonction TempsValeurProche :
- Le premier paramètre est la référence ( exemple : A2 )
- Le deuxième paramètre est la base de données ( exemple BDD!A:G )
- Ce qui finalement donnerait :
=TempsValeurProche(A2;BDD!A:G)
En sortie, la fonction retourne la valeur Temps (7 ème colonne de la base de données) sauf :
- si la référence (SERIE + MODELE) est absent de la base. Dans ce cas on retourne #N/A
- si plusieurs lignes sont des possibles résultats. Dans ce cas, on retourne #REF! (ce dernier cas serait à affiner en fonction de l'égalité ou non de toutes les valeurs de temps trouvées)
Le code est dans Module1 :
Function TempsValeurProche(xref As String, xBDD As Range)
Dim s, t, i&, j&, k&, n&, m&, min@, v@
s = Split(xref, "-")
i = xBDD.Parent.UsedRange.Row + xBDD.Parent.UsedRange.Rows.Count - 1
t = xBDD.EntireColumn.Resize(i)
For i = 2 To UBound(t)
If t(i, 1) = s(0) And CStr(t(i, 2)) = s(1) Then n = n + 1: For j = 1 To UBound(t, 2): t(n, j) = t(i, j): Next
Next i
If n = 0 Then TempsValeurProche = CVErr(xlErrNA): Exit Function
For j = 3 To 6
min = CCur(String(14, "9")): m = 0
For i = 1 To n: v = Abs(t(i, j) - CSng(s(j - 1))): min = IIf(v < min, v, min): Next
For i = 1 To n
If Abs(t(i, j) - CSng(s(j - 1))) = min Then
m = m + 1: For k = 1 To UBound(t, 2): t(m, k) = t(i, k): Next
End If
Next i
If m = 1 Then TempsValeurProche = t(1, 7): Exit Function
n = m
Next j
If m = 1 Then TempsValeurProche = t(1, 7) Else TempsValeurProche = CVErr(xlErrRef)
End Function