klin89
XLDnaute Accro
Bonjour le forum,
Je me résous à vous exposer mon problème faute d'une solution trouvée
Dans le tableau, les colonnes A et b contiennent des valeurs (nombres décimaux ou entiers) non triés.
En colonne C, j'aimerais renvoyer pour chaque valeur de le colonne A, la valeur de la colonne B supérieure à A en étant la plus proche.
C'est ce que réalise la macro ou la formule matricielle située en colonne E
Or j'essaie à travers cette autre code et la méthode Evaluate, de me passer de la boucle imbriquée du précédent code en y insérant la formule, mais je n'y arrive pas
Peut-être fais-je fausse route, pouvez-vous venir à mon aide
klin89
Je me résous à vous exposer mon problème faute d'une solution trouvée
Dans le tableau, les colonnes A et b contiennent des valeurs (nombres décimaux ou entiers) non triés.
En colonne C, j'aimerais renvoyer pour chaque valeur de le colonne A, la valeur de la colonne B supérieure à A en étant la plus proche.
C'est ce que réalise la macro ou la formule matricielle située en colonne E
VB:
=SI(A2="";"";SI(MIN(SI(B$2:B$14>A2;B$2:B$14))=0;"";MIN(SI(B$2:B$14>A2;B$2:B$14))))
VB:
Sub test()
Dim a, i As Long, ii As Long
Dim minValue As Double, flag As Boolean
With Sheets("Feuil1")
a = .Range("A1").CurrentRegion.Value
For i = 2 To UBound(a, 1)
If IsNumeric(a(i, 1)) And Not IsEmpty(a(i, 1)) Then
minValue = 0
flag = False
For ii = 2 To UBound(a, 1)
If IsNumeric(a(ii, 2)) And a(ii, 2) > a(i, 1) Then
If Not flag Or a(ii, 2) < minValue Then
minValue = a(ii, 2)
flag = True
End If
End If
Next
If flag Then a(i, 3) = minValue
End If
Next
.Range("G1").Resize(UBound(a, 1), UBound(a, 2)).Value = a
End With
End Sub
Or j'essaie à travers cette autre code et la méthode Evaluate, de me passer de la boucle imbriquée du précédent code en y insérant la formule, mais je n'y arrive pas
VB:
Sub test()
Dim a, b, i As Long, ii As Long
'SI(MIN(SI(B$2:B$14>A2;B$2:B$14))=0;"";MIN(SI(B$2:B$14>A2;B$2:B$14)))
With Sheets("Feuil1").Range("A1").CurrentRegion
a = .Value
'b represente la colonne 2
b = Application.Transpose(Application.Index(.Value, Evaluate("row(2:" & .Rows.Count & ")"), 2))
'b = Application.Index(.Value, Evaluate("row(2:" & .Rows.Count & ")"), 2)
For i = 2 To UBound(a, 1)
If IsNumeric(a(i, 1)) And Not IsEmpty(a(i, 1)) Then
a(i, 3) = Application.Evaluate("IF(MIN(IF(" & b & ">" & a(i, 1) & "," & b & "))=0,"""",MIN(IF(" & b & ">" & a(i, 1) & "," & b & ")))")
End If
Next
.Range("G1").Resize(UBound(a, 1), UBound(a, 2)).Value = a
End With
End Sub
klin89
Pièces jointes
Dernière édition: