Min/Max approchant pour interpolation linéaire

Salut tout le monde,

Je code en VBA pour réaliser une interpolation linéaire automatique, en Excel classique pas de soucis particulier avec les formules mais je bug sur la transcription en VBA.

2002.1
2501.9
3001.7
3501.6
3751.6
3801.5
4001.5

Si je tape une valeur et que cette valeur est égale a une valeur dans la colonne A ça prends la valeur du tableau. Exemple je tape 350 il ira chercher la valeur 1.7.

Si je tape une valeur intermédiaire, je voudrais récupérer la valeur juste en dessous et la valeur juste au dessus pour l'interpolation linéaire. Exemple: 325 je dois récupérer 300 et 350. Sur Excel j'ai réalisé cela facilement avec =MIN(SI(A1:A7>J1;A1:A7)) et =MAX(SI(A1:A7<J1;A1:A7)) mais je n'arrive pas a transposer ces formules en VBA. Quelqu’un saurait-il m'aider ?

Merci.

bonjour Heelflip,

si vos valeurs se trouvent en C10:D16

Sub recherce()
     Dim c, i, MaValeur
     Set c = Range("C10:C16")                'votre plage
     MaValeur = 325
     i = Application.Match(MaValeur, c, 1)  '= EQUIV en fonction excel
     If IsNumeric(i) Then
          MsgBox "valeur 1 : " & c.Cells(i, 1) & "   " & c.Cells(i, 2) & IIf(MaValeur < 400, vbLf & "valeur 2 : " & c.Cells(i + 1, 1) & "   " & c.Cells(i + 1, 2), "")
     Else
          MsgBox "erreur"
     End If
End Sub

Bonjour Bart,

Je ne connais pas trop la fonction EQUIV mais de ce que je connais elle cherche une valeur donnée dans une plage, pas une valeur min ou max qui s'en approche si ?

Cordialement.

bonjour,

vous connaissez =RECHERCHEV(325;C10:D16;1) pour rechercher la valeur la plus proche mais plus petite que 325 et de vous donner la valeur de la 2ième colonne.
=EQUIV(325;C10:C16;1) est pareil mais elle vous donne la position dans la plage, donc ici position 3. Vos données sont triés, donc le suivant, donc position 4 sera la valeur la plus proche mais plus grande que 325.

avec Set c = Range("C10:C16") et i=3,

c.Cells(i, 1) sera Range("C10:C16").cells(3,1) = C12

c.Cells(i, 2) sera Range("C10:C16").cells(3,2) = D12

c.Cells(i+1, 1) sera Range("C10:C16").cells(4,1) = C13

c.Cells(i+1, 2) sera Range("C10:C16").cells(4,2) = D13

Si ce n'est pas cela que vous voulez ou si vous ne le comprenez pas, veuillez poster votre fichier avec ce que vous avez maintenant.

Bon j'ai regardé le code et modifié quelques trucs, cela semble fonctionner. J'ai supprimé le IsNumeric car je passe par un Userform ou on ne peut taper qu'un nombre. et j'ai ajouté une condition Supérieure ou égale à la plus petite valeur de la plage et Inférieure ou égale à la plus grande.

Voici ce que cela donne. en version simplifiée. Plus qu'a intégrer ça dans mon code final.

Sub FT()

     Dim c, i, MaValeur
     Set c = Range("A1:A7")                'votre plage
     MaValeur = Range("F1")
     i = Application.Match(MaValeur, c, 1)  '= EQUIV en fonction excel
     If MaValeur >= 200 And MaValeur <= 400 Then
          MsgBox "valeur 1 : " & c.Cells(i, 1)
          MsgBox "valeur 2 : " & c.Cells(i + 1, 1)
     Else
          MsgBox "erreur"
     End If

End Sub

Un grand merci à toi Bart, j'ai également découvert le IIf que je ne connaissais pas.

Rechercher des sujets similaires à "min max approchant interpolation lineaire"