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 :

Régression linéaire & boucle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut Régression linéaire & boucle
    Bonjour!

    Tout nouveau en programmation VBA, je me heurte à quelques difficultés probablement mineures... En fait j'ai une colonne de 70 données qui représentent plusieurs mesures d'affilée. Je veux faire une régression linéaire pour chaque groupe cohérent de données. Ci-dessous le code "sur-commenté". Pour le coup, il me fait une incompatibilité de type au niveau du Cells("G" & y).Formula = _ "=INDEX(LINEST(A,B),1)". Ceci dit, je ne suis sûr non plus qu'il ait bien compris ma définition des plages A et B...

    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
     
     
    Sub regression()
     
    With ActiveWorksheet
     
    Dim x As Integer
    Dim y As Integer
    Dim z As Integer
    Dim l As Single
    Dim k As Single
    Dim A As Object
    Dim B As Object
     
    ' démarrage des compteurs à 1
     
    y = 1
    l = 1
    k = 1
     
    ' début de la boucle, en supposant qu'on a une colonne de 70 données de capteur
     
    For x = 1 To 70
     
    ' z sera à chaque fois le numéro de ligne de la première cellule de la plage utilisée pour la régression
     
        z = x
     
    ' l-k représente le pas qui permet de distinguer deux colmatages successifs.
        ' Tant que cet écart n'est pas dépassé, je considère que les cellules font partie de la même droite
     
        Do While Abs(l - k) < 1
     
        l = Cells(x, 5).Value
        k = Cells(x + 1, 5).Value
        x = x + 1
     
        Loop
     
    ' le programme sort de la boucle lorsqu'il a trouvé le x qui correspond au changement de droite
       ' on crée une plage contenant les cellules concernées,A pour les abscisses, B pour les ordonnées
     
     Set A = Range("E" & z & ":E" & (x - z))
     Set B = Range("F" & z & ":F" & (x - z))
     
    ' on inscrit dans les deux colonnes suivantes les valeurs de la droite de régression
     
    Cells("G" & y).Formula = _
            "=INDEX(LINEST(A,B),1)"
     
    Cells("H" & y).Formula = _
            "=INDEX(LINEST(A,B),2)"
     
       y = y + 1
     
    Next
     
    End With
     
     
    '
    End Sub
    Bref, je suis ouvert à toute suggestion ou réflexion qui me permettrait de me désenbourber!

    Bien cordialement,

    Aubencheulobois

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    Bonjour

    ce n'est pas grave, pour la fonction Cells il faut lui donner le numero de la colonne et non sa lettre

    A=1, B=2 etc...

    à remplacer par bonne continuation

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut Merci!
    Effectivement, ça crevait les yeux... Ca résout déjà en grande partie mon problème, un grand merci! Du coup ma boucle tourne effectivement, j'ai repéré une erreur logique quand le z = x = 61, le Cells indique sur une ligne nulle... J'y suis allé comme un bourrin (temporairement, car ce n'est physiquement pas représentatif) en rajoutant z = x - 1... J'affinerai ensuite!

    Sinon, j'ai pu constater que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set A = Range(Cells(5, z), Cells(5, (x - z + 1)))
    Set B = Range("F" & z & ":F" & (x - z + 1))
    ces deux formules passent toutes les deux. Y-a-t'il une différence structurelle?

    Autre question, ce coup-ci: la macro fonctionne effectivement et m'inscrit bien dans les cellules G1 et H1 la formule "=INDEX(LINEST(A,B),1)" mais il ne comprend pas que A et B sont des plages de cellules... J'ai loupé un épisode?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    ces deux formules passent toutes les deux. Y-a-t'il une différence structurelle?
    Effectivement, il n'y a que la manière de l'écrire qui change, sinon le résultat est strictement identique. Suivant le code à écrire l'une ou l'autre est plus pratique.

    Autre question, ce coup-ci: la macro fonctionne effectivement et m'inscrit bien dans les cellules G1 et H1 la formule "=INDEX(LINEST(A,B),1)" mais il ne comprend pas que A et B sont des plages de cellules... J'ai loupé un épisode
    Effectivement, ce sont les lettres A et B qui sont écrite et non leurs correspondance car elles sont entre "", de plus comme ce sont des objets il faut présiser que l'on veut récuperer l'adresse de ces plages.

    je n'ai pas eu le temps de tester cette modification mais ça devrait être bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Cells(7 & y).Formula = _
            "=INDEX(LINEST(" & A.Address & "," & B.Address & "),1)"
     
    Cells(8 & y).Formula = _
            "=INDEX(LINEST(" & A.Address & "," & B.Address & "),2)"
    bon courage

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut Résolu!
    Merci beaucoup pour ton aide zyhack! Cela marche très bien! Il ne me reste plus que quelques petits problèmes logiques à résoudre, mais rien de bien sorcier!

    Ci-dessous le code finalement obtenu pour ceux que ça intéresse. Faire attention à ne pas inverser les paramètres dans la régression: linest(y,x) et non linest(x,y)! Plus réincrémenter le compteur k et l après la boucle.


    Merci bien!

    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
    Sub regression()
     
    With ActiveWorksheet
     
     
    Dim x As Integer
    Dim y As Integer
    Dim z As Integer
    Dim l As Single
    Dim k As Single
    Dim A As Object
    Dim B As Object
     
    y = 1
    l = 1
    k = 1
     
    For x = 1 To 2000
     
        z = x
     
        Do While Abs(l - k) < 1
     
        l = Cells(x, 5).Value
        k = Cells(x + 1, 5).Value
        x = x + 1
     
        Loop
     
     Set A = Range("E" & z & ":E" & x - 1)
     Set B = Range("F" & z & ":F" & x - 1)
     
        l = Cells(x, 5).Value
        k = Cells(x + 1, 5).Value
     
    Cells(y, 7).Formula = _
            "=INDEX(LINEST(" & B.Address & "," & A.Address & "),1)"
     
    Cells(y, 8).Formula = _
            "=INDEX(LINEST(" & B.Address & "," & A.Address & "),2)"
     
     
       y = y + 1
     
    Next
     
    End With
     
     
    '
    End Sub

Discussions similaires

  1. Régression linéaire, loi F, t, normale et Khi-2
    Par philben dans le forum Contribuez
    Réponses: 3
    Dernier message: 20/08/2020, 14h22
  2. Module qui permet de faire des régression linéaire ?
    Par Anti-T dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 04/09/2009, 13h28
  3. Tracé de courbe + Régression linéaire
    Par AC88mm dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/05/2007, 14h27
  4. Réponses: 2
    Dernier message: 22/12/2006, 20h24
  5. [NaN] Calcul d'une régression linéaire
    Par GLDavid dans le forum Langage
    Réponses: 1
    Dernier message: 24/10/2006, 12h55

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