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

Macros et VBA Excel Discussion :

Calcul de pente sur données cycliques.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 1
    Par défaut Calcul de pente sur données cycliques.
    Bonjour,

    Après moultes tentatives infructueuses, je sollicite votre aide.
    Voilà, je dispose d'une série de mesure de températures qui varient quotidiennement, comme une sinusoide, mais dont les pentes peuvent changer.

    Je cherche à calculer automatiquement la pente ascendante de mes données et ce pour chaque cycle, cad entre la T° minimale du petit matin et maximale du début d'après-midi.

    Avant toute chose, je cherche à le réaliser pour un cycle.

    Si je sais repérer les valeurs min et max de ma portion de courbe pour le calcul de pente, je n'arrive pas en revanche à utiliser ces infos pour définir une plage dans les données pour en calculer la pente...

    J'ai vainement tenté un pente(si(... mais sans succès

    De même j'ai imaginé récupérer les coordonnées des cellules min et max encadrant ma plage et concaténer celle-ci pour utiliser la fonction pente mais sans succès non plus... auriez-vous une idée ? Grand merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Ci dessous un exemple de calcul de pentes ascendantes entre des données X/Y.
    Les résultats de calcul de pente s'affichent sur la même ligne que le maximum de la plage de calcul de la pente, en colonne "COL_PENTE".
    Les valeurs de température Min/Max du cycle sont repérés à l'aide de moyennes glissantes pour s'affranchir
    de bruit sur la mesure de T°C.

    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
    Option Explicit
     
    Const COLX As Integer = 2 'colonne des abscisses
    Const COLY As Integer = 3 'colonne des températures
    Const COL_PENTE As Integer = 4    'colonne d'affichage des pentes
    Const FIRST_LINE As Integer = 15  'première ligne de données
    Const NB_MOY_VAL As Integer = 3   'nombre de valeur surlesquel sont calculés la moyenne glissante
     
    Private Sub CommandButton1_Click()
         Dim LineMin As Long
         Dim LineMax As Long
         Dim LastLine As Long
         LastLine = Cells(65000, COLY).End(xlUp).Row
         Range(Cells(FIRST_LINE, COL_PENTE), Cells(LastLine, COL_PENTE)).ClearContents
         LineMin = FIRST_LINE
         LineMax = FIRST_LINE + 1
         While LineMin < LineMax
            LineMin = GetNextTMinLine(LineMin, LastLine)
            LineMax = GetNextTMaxLine(LineMin, LastLine)
            If LineMax <> LineMin Then
                Cells(LineMin, COL_PENTE).Value = "<--Min"
                Cells(LineMax, COL_PENTE).Value = "-->MAX : pente = " & WorksheetFunction.Slope(Range(Cells(LineMin, COLY), Cells(LineMax, COLY)), _
                                              Range(Cells(LineMin, COLX), Cells(LineMax, COLX)))
                LineMin = LineMax + 1
                LineMax = LineMax + 2
     
            End If
            DoEvents
         Wend
    End Sub
     
    Private Function GetNextTMinLine(ByVal lineBegin As Long, ByVal lineEnd As Long) As Long
        Dim r As Range
        Dim i As Long
        Dim Count As Long
     
        Set r = Range(Cells(lineBegin, COLY), Cells(lineBegin + NB_MOY_VAL - 1, COLY))
        Count = lineEnd - lineBegin - NB_MOY_VAL
     
        For i = 0 To Count
            If WorksheetFunction.Sum(r.Offset(i)) < WorksheetFunction.Sum(r.Offset(i + 1)) Then Exit For
        Next i
     
        GetNextTMinLine = IIf(lineBegin + i + NB_MOY_VAL / 2 > lineEnd, lineEnd, lineBegin + i + NB_MOY_VAL / 2)
    End Function
     
    Private Function GetNextTMaxLine(ByVal lineBegin As Long, ByVal lineEnd As Long) As Long
        Dim r As Range
        Dim i As Long
        Dim Count As Long
     
        Set r = Range(Cells(lineBegin, COLY), Cells(lineBegin + NB_MOY_VAL - 1, COLY))
        Count = lineEnd - lineBegin - NB_MOY_VAL
     
        For i = 0 To Count
            If WorksheetFunction.Sum(r.Offset(i)) > WorksheetFunction.Sum(r.Offset(i + 1)) Then Exit For
        Next i
     
        GetNextTMaxLine = IIf(lineBegin + i + NB_MOY_VAL / 2 > lineEnd, lineEnd, lineBegin + i + NB_MOY_VAL / 2)
    End Function

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2014, 15h58
  2. Réponses: 2
    Dernier message: 17/01/2012, 10h06
  3. [V6] Calcul sur données JoursEntre()
    Par Anonymously dans le forum Deski
    Réponses: 15
    Dernier message: 08/09/2011, 17h58
  4. Calcul sur données saisies dans un datagrid
    Par granchef dans le forum ActionScript 3
    Réponses: 12
    Dernier message: 07/09/2011, 12h51
  5. calcul de durée sur une suite de données
    Par madousn dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/06/2008, 10h04

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