IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Remplacer les cases vides par des valeurs interpolées linéairement (automatisation)


Sujet :

Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 21
    Points : 20
    Points
    20
    Par défaut Remplacer les cases vides par des valeurs interpolées linéairement (automatisation)
    Bonjour,

    je dispose d'un ensemble de données assez énorme avec 6 feuillets comportant une centaine de lignes et 300 colonnes.

    Chaque ligne correspond à une certaine valeur étudiée au cours du temps (le temps étant les colonnes). Les valeurs n'ayant pas pu être enregistrées à chaque pas de temps, j'ai des "trous" dans ma matrice qui me posent des problèmes lors de calcul de moyenne, etc.

    Je souhaiterais donc combler ces "trous" grâce à une interpolation linéaire des valeurs précédentes et suivantes. Je recherche une solution sans VB et le plus rapide possible (donc automatique) vue le nombre de séries dont je dispose.

    J'ai commencé à le faire manuellement et c'est très astreignant !

    J'espère qu'Excel dispose d'une fonction simple pour faire ce genre de choses.

    Merci pour votre aide

    Madeline

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Pour faire cela sans VB je ne vois d'autre méthode que de créer une nouvelle feuille au meme format puis sur chaque cellule mettre une formule du style
    Si la cellule est vide alors formule specif sinon valeur de la cellule

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Merci.
    J'ai finalement opté pour la solution VBA.
    Elle n'est certainement pas optimisée (1ère fois que je fais du VBA et pas le temps d'approfondir pour faire un joli code) mais elle marche. Je la donne pour les personnes qui auraient ce besoin urgent également.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    Function FindNextHole(ByVal sheet As String, ByVal line As Integer, ByVal CurrentCol As Integer, ByVal EndOfLineCol As Integer) As Integer
            'Recherche de la première case vide
            Dim col As Integer
            col = CurrentCol
            Do While Not IsEmpty(Worksheets(sheet).Cells(line, col)) And col <= EndOfLineCol
                col = col + 1
            Loop
            FindNextHole = col
    End Function
     
    Function FindNextVal(ByVal sheet As String, ByVal line As Integer, ByVal CurrentCol As Integer, ByVal EndOfLineCol As Integer) As Integer
            'Recherche de la première case non vide
            Dim col As Integer
            col = CurrentCol
            Do While IsEmpty(Worksheets(sheet).Cells(line, col)) And col <= EndOfLineCol
                col = col + 1
            Loop
            FindNextVal = col
    End Function
     
    Function FillCellsWithInterpolatedValues(ByVal sheet As String, ByVal line As Integer, ByVal ColFirstVal As Integer, ByVal ColEndVal As Integer) As Boolean
            Dim step As Double
            Dim FirstVal As Double
            Dim NbEmptyCells As Integer
            FirstVal = Worksheets(sheet).Cells(line, ColFirstVal)
            NbEmptyCells = ColEndVal - ColFirstVal - 1
            step = (Worksheets(sheet).Cells(line, ColEndVal) - FirstVal) / NbEmptyCells
            For i = 1 To NbEmptyCells
                Worksheets(sheet).Cells(line, ColFirstVal + i) = FirstVal + step * i
            Next
     
            FillCellsWithInterpolatedValues = True
    End Function
     
    Function InterpolateSheet(ByVal sheetName As String) As Boolean
     
        For ligne = 2 To 101
     
            Dim ok As Boolean
            Dim col As Integer
            Dim lookedCol As Integer
            col = 6
            lookedCol = FindNextVal(sheetName, ligne, col, 140)
            If lookedCol < 1 Or lookedCol > 140 Then
                Exit Function
            End If
            col = lookedCol
            lookedCol = FindNextHole(sheetName, ligne, col, 140)
            If lookedCol > 140 Then
                Exit Function
            End If
            col = lookedCol - 1
     
            Do While col < 140
                lookedCol = FindNextVal(sheetName, ligne, col + 1, 140)
                If lookedCol > 140 Then
                    Exit Do
                End If
                ok = FillCellsWithInterpolatedValues(sheetName, ligne, col, lookedCol)
                lookedCol = FindNextHole(sheetName, ligne, lookedCol, 140)
                If lookedCol > 140 Then
                    Exit Do
                End If
                col = lookedCol - 1
            Loop
     
        Next ligne
     
    End Function
     
     
    Sub MyInterpolation()
        InterpolateSheet ("Varus Forcé")
        InterpolateSheet ("Valgus Forcé")
        InterpolateSheet ("Naturel")
        InterpolateSheet ("Contact")
        InterpolateSheet ("Rotation Interne")
        InterpolateSheet ("Rotation Externe")
    End Sub
    Merci

    Madeline

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer les champs vides par des 0
    Par feldi dans le forum PL/SQL
    Réponses: 8
    Dernier message: 16/11/2011, 20h56
  2. Remplacer les controles ajax par des controles ASP
    Par Contact2012 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 12/09/2008, 11h26
  3. Réponses: 5
    Dernier message: 13/12/2006, 16h08
  4. Remplacer les retour chariot par des <br/>
    Par novices dans le forum Langage
    Réponses: 1
    Dernier message: 21/08/2006, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo