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 :

Macro VBA Erreur Range


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur Support Piste
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Support Piste

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut Macro VBA Erreur Range
    Bonjour,

    D'avance, merci de votre aide car je sèche littéralement...

    Voila, j'ai réussi à créer une Macro afin de déterminer les coef A et C d'une équation Y=Ax+B et de le récupérer. Par contre cette macro fonctionne juste pour 1 ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub LinEstVBA() 'Juste 1 ligne'
    Dim C As Variant, x As Variant, Y As Variant
    x = Range("D1:H1")
    Y = Range("D2:H2")
    C = Application.LinEst(Y, x, True, True)
    Range("I2:J2") = C
    End Sub
    Par contre maintenant je souhaite faire le même calcul mais qu'il se fasse pour les lignes de la colonne. J'ai modifié la première macro mais je me retrouve avec un message d'erreur au niveau de la fonction Range, je pense que j'ai une erreur au niveau de la déclaration pour incrémentation d'une ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub LinEstVBA() 'Fichier Colonne'
    Dim C As Variant, x As Variant, Y As Integer, i As Long
    x = Range("D1:H1") 'Cst tjrs même valeur'
    Y = Range("D2:H2") ' incrémenter d'un ligne jusqu'à la fin du fichier'
    FinalRow = Range("D2:H2").End(x1up).Row
    For i = 1 To FinalRow
    .Range ("D" & i & ":H" & i)
    C = Application.LinEst(Y, x, True, True)
    Range("I2:J2" & i) = C
    Next i
    End Sub
    Nom : Erreur de compilation.png
Affichages : 765
Taille : 24,0 KoFeuil1.xlsm

    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour et bienvenue au forum

    Je reprends ce code que tu nous mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub LinEstVBA() 'Fichier Colonne'
    Dim C As Variant, x As Variant, Y As Integer, i As Long
    x = Range("D1:H1") 'Cst tjrs même valeur'
    Y = Range("D2:H2") ' incrémenter d'un ligne jusqu'à la fin du fichier'
    FinalRow = Range("D2:H2").End(x1up).Row
    For i = 1 To FinalRow
    .Range ("D" & i & ":H" & i)
    C = Application.LinEst(Y, x, True, True)
    Range("I2:J2" & i) = C
    Next i
    End Sub
    Je pense que tu n'as pas bien compris comment fonctionne le & et "".

    Pour i = 3, par exemple,
    Cela est égal à :
    Si tu veux la plage I3:J3, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("I" & i & ":J" & i) = C
    D'autre part, tu as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FinalRow = Range("D2:H2").End(x1up).Row
    Tu t'es trompé entre 1 et l :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FinalRow = Range("D2:H2").End(xlup).Row
    Ensuite, dans ta boucle, tu as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range ("D" & i & ":H" & i)
    2 choses :
    1. Pourquoi un point avant Range ? Ceci est utilisé dans la syntaxe With...End With, mais autrement, il ne faut pas mettre de point.
    2. Et même sans le point => que fais-tu à cet endroit là ? Tu ne fais que "citer" un Range sans rien appliquer dessus. Il faut que tu mettes une action.


    Enfin, dans ta boucle, il y a aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C = Application.LinEst(Y, x, True, True)
    Or Y correspond à la ligne 2. Est-ce que ça ne devrait pas être variable selon i aussi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Y = Range("D" & i & ":H" & i)
    dans la boucle.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur Support Piste
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Support Piste

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut
    Bonjour

    Merci pour votre aide.

    J'ai tout d'abord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C = Application.LinEst(Y, x, True, True)
    Ce code permet de calculer le coef directeur et l'ordonnée à l'origine de la fonctionne. Celui la fonctionne car il fonctionne avec la macro simple ligne.

    Concernant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range ("D" & i & ":H" & i)
    Le but est d'incrémenter de 1 ligne à chaque fois, c'est pour cela que la variable i est créer.
    Pour faire simple je fais un calcul avec Y= D2,E2,F2,G2,H2 puis après Y prend les valeurs des colonnes Y= D3,E3,F3,G3,H3 et ainsi de suite pour attendre la derniere ligne.

    Donc si j'ai bien compris le code vas devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub LinEstVBA() 'Fichier Colonne'
    Dim C As Variant, x As Variant, Y As Integer, i As Long
    x = Range("D1:H1") 'Cst tjrs même valeur'
    Y = Range("D" & i & ":H" & i) ' incrémenter d'un ligne jusqu'à la fin du fichier'
    FinalRow = Range("D2:H2").End(xlUp).Row
    For i = 1 To FinalRow
    C = Application.LinEst(Y, x, True, True)
    Range("I" & i & ":J" & i) = C
    Next i
    End Sub
    Maintenant j'ai le code erreur suivant
    Nom : Capture.JPG
Affichages : 532
Taille : 15,9 Ko

    Donc j'imagine que erreur de la valeur Y

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,
    Citation Envoyé par Josonik Voir le message
    Donc si j'ai bien compris le code vas devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub LinEstVBA() 'Fichier Colonne'
    Dim C As Variant, x As Variant, Y As Integer, i As Long
    x = Range("D1:H1") 'Cst tjrs même valeur'
    Y = Range("D" & i & ":H" & i) ' incrémenter d'un ligne jusqu'à la fin du fichier'
    FinalRow = Range("D2:H2").End(xlUp).Row
    For i = 1 To FinalRow
    C = Application.LinEst(Y, x, True, True)
    Range("I" & i & ":J" & i) = C
    Next i
    End Sub
    C'est pas encore ça.
    Poses-toi 2 questions :
    - Quelle est la valeur de i au moment où je calcule Y ?
    - Combien de fois je calcule Y ?

    D'autre part Range est un objet Excel qui possède de propriètés et des méthodes.
    Il est vivement conseillé de préciser laquelle on utilise.
    De même, il possède aussi un parent (la feuille), un grand-parent (le classeur) et un arrière grand parent (l'application).
    La moindre des choses c'est d'être sûr de pas se tromper de parent !

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonsoir …


    Tu ne précises pas la feuille de travail car tu as écrit ton code dans sa fenêtre VBA.
    Les déclarations de variable se doivent d’être propres pour mieux les contrôler !

    Je te laisse le soin de trouver ton erreur en te donnant ces lignes de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Est()
        Dim C(), X As Range, Y As Range, Dl As Long, l As Long  'C() pour un tableau
        Set X = Range("D1:H1")                                  'ligne commune
        Dl = [D1].End(xlDown).Row                               'ligne de fin de boucle
        [I:J] = ""                                              'nettoyage éventuel
        For l = 2 To Dl
          Set Y = Range("D" & l & ":H" & l)                     'seconde ligne en boucle
          C = Application.LinEst(Y, X, 1, 1)
          Range("I" & l & ":J" & l) = C
        Next
     End Sub

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur Support Piste
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Support Piste

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut
    Bonsoir

    Merci pour votre aide.

    J'ai une question concernant le lien de parenté de la fonction Range. Dans ma macro je n'ai pas besoin de préciser la feuille de travail car j'ai écrit le code directement dans sa fenêtre VBA, mais cela n’était pas le cas, je dois préciser le classeur et la feuille comme ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set x = .Workbooks("Classeur2.xlsx").Sheets("Feuil2").Range("D1:H1")
    Set Y = .Workbooks("Classeur2.xlsx").Sheets("Feuil2").Range("D" & i & ":H" & i)
    Question faut il mettre un point de .Workbooks

    Sinon après correction du code, voici le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub LinEstVBA() 'Fichier Colonne'
    Dim C As Variant, x As Range, Y As Range, i As Long, Dl As Long
    Set x = Range("D1:H1") 'Cst tjrs même valeur'
    Dl = [D1].End(xlDown).Row ' définition Début et fin de la colonne'
    For i = 2 To Dl ' définition de la plage de i'
    Set Y = Range("D" & i & ":H" & i) ' variable évolutive incrémentation de 1'
    C = Application.LinEst(Y, x, True, True)
    Range("I" & i & ":J" & i) = C
    Next i
    End Sub
    Il a l'air de fonctionner correctement maintenant, mais je dois regarder plus en détaille les valeurs.

    Merci pour votre aide.

    Et bonne soirée

Discussions similaires

  1. [OL-365] Macro VBA - Erreur d'exécution 430 sous condition
    Par 68cme dans le forum Outlook
    Réponses: 9
    Dernier message: 29/10/2019, 14h47
  2. Réponses: 5
    Dernier message: 18/04/2014, 07h49
  3. [WD-2010] Macro VBA Erreur 4120 Paramètre Incorrect
    Par jérémyp8 dans le forum VBA Word
    Réponses: 11
    Dernier message: 05/04/2013, 16h54
  4. [XL-2010] Macro VBA Erreur 4120 Paramètre Incorrect
    Par jérémyp8 dans le forum Excel
    Réponses: 1
    Dernier message: 27/03/2013, 11h32

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