Macro pour une interpolation avec un nombre de cellules variable

Dogde

XLDnaute Nouveau
Bonjour !

J'aurais besoin d'aide sur une macro: j'ai une colonne de valeurs sauf que de temps en temps, je n'ai pas la valeur et le mot 'NAN' apparait donc dans la cellule.

J'aimerais creer une macro qui, des que NAN apparait, fasse une interpolation entre la cellule d'au dessus et celle d'en dessous pour pouvoir approximer une valeur dans la cellule NAN.

Le probleme est que de temps en temps, plusieurs NAN se suivent il faut donc faire une interpolation avec la case au dessus du 1er et celle en dessous du dernier.

Il faudrait donc creer une sorte de compteur, et je pensais essayer une boucle While mais je n'arrive pas a l'ecrire...

J'ai attache un fichier avec une colonne de valeurs.

Merci pour votre aide!
 

Pièces jointes

  • NAN.xlsx
    35.4 KB · Affichages: 53

Dranreb

XLDnaute Barbatruc
Re : Macro pour une interpolation avec un nombre de cellules variable

Bonjour.
Cette procédure installe des formules de valeurs intermédiaires entre la cellule d'au dessus de la plage verticale sélectionnée et celle d'au dessous.
VB:
Sub PoserInterm()
Dim NbL As Long, Z As String
NbL = Selection.Rows.Count: Z = "R[" & NbL & "]C"
Selection.Rows(1).FormulaR1C1 = "=R[-1]C+(" & Z & "-R[-1]C)/ROWS(RC:" & Z & ")"
If NbL > 1 Then Selection.Rows(2).Resize(NbL - 1).FormulaR1C1 = "=2*OFFSET(RC,-1,0)-OFFSET(RC,-2,0)"
End Sub
Cordialement.
 

Dogde

XLDnaute Nouveau
Re : Macro pour une interpolation avec un nombre de cellules variable

Bonjour, merci pour ta reponse !

Ou doit on changer les colonnes dans ton code ? En vrai, j'ai 5 colonnes differentes qui doivent etre interpolees aux endroits ou 'NAN' apparait. Il n'y a pas non plus mention de NAN, tu fais ca par rapport a une valeur minimale ?

Voici le code que j'avais commence, basique et aui ne marche pas:

Code:
For i = 4 To 25923
    If Worksheets("Sheet1").Range("AC" & i) = "NAN" Then
    j = i - 1
Exit For
    
For l = j + 1 To 25923
    If Worksheets("Sheet1").Range("AC" & l) <> "NAN" Then
    k = l
Exit For

Range("AC & j:AC & k ").Select
Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
    Trend:=True

Le soucis ets l'ecriture de l'interpolation et de le faire sur tout la colonne.
 

Dranreb

XLDnaute Barbatruc
Re : Macro pour une interpolation avec un nombre de cellules variable

Comme ça peut être:
VB:
Option Explicit
'

Sub InterpolerColonnes()
Dim Cel As Range
For Each Cel In Feuil1.[A4:E4]
   InterpolerNonNum Cel
   Next Cel
End Sub
'

Sub InterpolerNonNum(ByVal Cel As Range)
Dim CelDéb As Range, CelFin As Range, Cel As Range, NbL As Long
Application.Calculation = xlCalculationManual
Do Until IsEmpty(Cel.Value)
   If Not IsNumeric(Cel.Value) Then
      If NbL = 0 Then Set CelDéb = Cel
      NbL = NbL + 1
   ElseIf NbL > 0 Then
      PoserInterm CelDéb.Resize(NbL)
      NbL = 0
      End If
   Set Cel = Cel.Offset(1)
   Loop
If NbL > 0 Then PoserInterm CelDéb.Resize(NbL)
Application.Calculation = xlCalculationAutomatic
End Sub
'

Sub PoserInterm(Optional ByVal Plage As Range)
If Plage Is Nothing Then Set Plage = Selection
Dim NbL As Long, Z As String
NbL = Plage.Rows.Count: Z = "R[" & NbL & "]C"
Plage.Rows(1).FormulaR1C1 = "=R[-1]C+(" & Z & "-R[-1]C)/ROWS(RC:" & Z & ")"
If NbL > 1 Then Plage.Rows(2).Resize(NbL - 1).FormulaR1C1 = "=2*OFFSET(RC,-1,0)-OFFSET(RC,-2,0)"
End Sub
Remarque: je ne connaissais pas la méthode DataSéries.
À +
 

Dogde

XLDnaute Nouveau
Re : Macro pour une interpolation avec un nombre de cellules variable

Bonjour,

Merci pour ton code ca a l'air de marcher en supprimant la decleration de Cel as Range dans la deuxieme subroutine (deja declare dans le nom de la subroutine) !

Par contre je ne comprend pas trop ou est la reference au 'NAN', c'est avec Nbl ?

Sinon je cherchais a ce qu'un message previenne l'utilisateur de l'existence des ces NAN afin qu'il choisisse d'interpoler ou non. Voici le code que j'ai fait:

Code:
Sub test()

'Verif DO
Dim i As Integer
Dim bool As Boolean

For i = 4 To 25923
    If Worksheets("Sheet1").Range("A" & i).Value = "*NAN*" or Worksheets("Sheet1").Range("B" & i).Value = "*NAN*" Then
    bool = True
    Exit For
Next i

If bool = True Then MsgBox "A value is missing in DO from line & i & please use the macro Interpolate"""
If bool = True Then Exit Sub

End Sub


Mais qund j'execute, ca ne fait rien, pas d'erreur ni de message alors qu'il y a des 'NAN' dans ces colonnes.
Merci
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Macro pour une interpolation avec un nombre de cellules variable

Bonjour.
Exact, la déclaration de Cel, vestige d'une 1ère version faite avant de savoir qu'il y aurait plusieurs colonnes, était en trop.
Je ne teste pas "NAN", spécialement: je teste que ce n'est pas numérique. Ça revient au même non ? Ce n'est pas interdit de le faire aussi s'il y autre chose de non vide que "NAN" ou du numérique, puisque ce n'était pas précisé. Et puis ça marcherait aussi pour "nan","Nan","NAN "," nan" etc. C'est bien nan ? Euh non ?
À +
 

Dranreb

XLDnaute Barbatruc
Re : Macro pour une interpolation avec un nombre de cellules variable

Like "*NAN*" aurait eu plus de chance de marcher.
Et ne comparez pas un Boolean, c'est absurde: il se suffit à lui même comme expression derrière If.
Déjà pour comparer deux Boolean c'est "Eqv" et non "=". Mais:
True Eqv True c'est True,
False Eqv True c'est False, par conséquent si X est Boolean:
X Eqv True c'est X. Et donc aussi:
X = True c'est X !
If X Then ' c'est tout. Pareil, pas If X = False Then, mais:
If Not X Then

Il n'a jamais été dit dans l'aide que derrière If il faut toujours une comparaison. Il ne faut même pas forcément toujours une expression Boolean: du numérique est aussi accepté (0 considéré False)

De toutes façon vous auriez intérêt à utiliser la méthode Find sur la plage pour trouver vos "NAN".
Elle renvoit Nothing quand il n'y en a pas.

Cordialement.
 

Dogde

XLDnaute Nouveau
Re : Macro pour une interpolation avec un nombre de cellules variable

Ok merci,

J'ai utilise quelquechose de type boolean afin de pouvoir faire apparaitre la zone de message. Je n'ai pas eu de problemes avec les '=', je ne savais donc pas que cela ne s'ecrivait pas comme ca.

Cdt,
 

Dranreb

XLDnaute Barbatruc
Re : Macro pour une interpolation avec un nombre de cellules variable

Oh, mais vous n'êtes pas le seul ! Je vois cette grossière ânerie tout le temps, même parfois de la part d'XLDnautes confirmés, et ça commence à m'énerver sérieusement. Mais ce n'est pas de votre faute si c'est pour vous que mon agacement transparaît à travers mes explications !
Cordialement.
 

Dogde

XLDnaute Nouveau
Re : Macro pour une interpolation avec un nombre de cellules variable

Je vais donc y faire attention ....
En modifiant de cette maniere:
Code:
Sub test()

'Verif DO
Dim i As Integer
Dim bool As Boolean

For i = 4 To 25923
If Worksheets("Sheet1").Range("C" & i).Value Like "*NAN*" Then
    bool = True
    Exit For
End If
Next i

If bool Then MsgBox "A value is missing in DO from line " & vbLf _
& i & " please use the macro Interpolate"""
If bool Then Exit Sub


End Sub

Cela marche. Apres le then j'ai essaye de mettre bool Eqv True ou juste bool mais cela me met une erreur du type 'Compile error, expected sub, function or property'.

De plus j'ai essaye d'etendre le code a plusieurs colonnes mais je ne connais pas l'ecriture (Worksheets("Sheet1").Range("C" & i:"AW" & i).Value ou Worksheets("Sheet1").Range({C:AW} & i).Value).

J'ai aussi essaye de cette maniere (meme si du coup, je n'ai pas la ligne dans le message):

Code:
Sub test()

'Verif DO
Dim i As Integer
Dim bool As Boolean
Dim cel As Range

For Each cel In Sheet1.[C4:AW4]
If cel.Value Like "*NAN*" Then
    bool = True
    Exit For
End If
Next cel

If bool Then MsgBox "A value is missing in DO"
If bool Then Exit Sub


End Sub

Mais bizarrement, cela fait comme tout a l'heure le code tourne mais ne fait rien.
 

Dranreb

XLDnaute Barbatruc
Re : Macro pour une interpolation avec un nombre de cellules variable

Non pour l'affectation à un Boolean, c'est bien toujours "=". Ce sont juste les opérateurs des Boolean qui leurs sont propres: And, Or, Xor, Eqv, Imp, et Not, et ont une priorité basse par rapports aux opérateurs arithmétiques qu'il est incorrect d'utiliser pour les Boolean.
Dans votre dernier code vous n'examinez que les cellules de la ligne 4.
Pourquoi n'enregistreriez vous pas une nouvelle macro pour engendrer l'essentiel du code nécessaire pour localiser une cellule contenant "NAN" ? Ce sera plus simple au final. La méthode Find qui y sera utilisée rendra Nothing s'il n'y en a pas.
À +
 

Dogde

XLDnaute Nouveau
Re : Macro pour une interpolation avec un nombre de cellules variable

Merci, je n'avais pas fait attention ....

En fait il y a plusieurs verifications qui sont effectuees sur les donnees et ce bout de code en fait parti.
De plus, je veux donner le choix a l'utilisateur d'interpoler les valeurs manquantes ou de verifier par lui meme.

Avec l'ecriture avec 'cel' pouvez vous m'indiquer comment donner une indication sur la colonne et la ligne ou 'NAN' est present ?

Merci encore,
 

Dranreb

XLDnaute Barbatruc
Re : Macro pour une interpolation avec un nombre de cellules variable

Bonjour.
Après le Set Cel = ActiveveSheet.Cells.Find(What:="*NAN*" etc.
et le If Not Cel Is Nothing Then,
Cel.Row donne sa ligne,
Cel.Column donne sa colonne.
P.S. Et Cel.Select le sélectionne, c'est peut être le mieux pour le montrer, non ?
Cordialement.
 
Dernière édition:

Dogde

XLDnaute Nouveau
Re : Macro pour une interpolation avec un nombre de cellules variable

Merci pour tout!

Je n'ai pas de probleme d'execution, lorsqu'il y a une cellule 'NAN', la macro s'arrete et selectionne la cellule (meme si c'est la derniere lue, cela prend a peu pres 30 secondes. Par contre, lorsqu'il n'y a aucun 'NAN', la macro s'execute mais ne s'arrete pas ...

Quand je l'arrete manuellement, le code s'arrete au If:

Code:
Dim cel As Range

For Each cel In Sheet1.[C:AW]
If cel.Value Like "*NAN*" Then
    bool = True
    Exit For
End If
Next cel

If bool Then MsgBox "A value is missing please use the macro interpolate"
If bool Then cel.Select
If bool Then Exit Sub

Pareil pour l'interpolation, si je la lance sans aucun 'NAN' cela ne s'arrete pas ...
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 930
Membres
103 984
dernier inscrit
maliko67