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.
| 200 | 2.1 |
| 250 | 1.9 |
| 300 | 1.7 |
| 350 | 1.6 |
| 375 | 1.6 |
| 380 | 1.5 |
| 400 | 1.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 SubBonjour 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 SubUn grand merci à toi Bart, j'ai également découvert le IIf que je ne connaissais pas.