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 :

Copie de formule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Dessinateur BE
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Dessinateur BE
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut Copie de formule
    Bonjour
    Je débute en VBA pour excel . j’ai créé une macro qui importe un tableau (type nomenclature donc le Nb de lignes varies) format excel avec plusieurs lignes les 4 premières lignes servent de mise en forme et je besoin de recopier un formule de type recherche situé dans la cellule J4 pour toutes les lignes suivante jusqu’à la dernière ligne remplie de la colonne B
    voici mon code mais la formule s’arrête de se recopier à la ligne 9
    merci de votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Range("J4").Select
        ActiveCell.FormulaR1C1 = _
            "=IF(RC[-5]<>"""",VLOOKUP(RC[-5],'[03_Prix d''achat moyen par macro.xlsm]recap'!R2C1:R1048576C9,4,0),VLOOKUP(RC[-9],'[03_Prix d''achat moyen par macro.xlsm]recap'!R2C1:R1048576C9,4,0))"
        Range("J4").Select
         Selection.AutoFill Destination:=Range("J4:J" & Range("B1048576").End(xlUp).Row)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est parce que vos tableaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    03_Prix d''achat moyen par macro.xlsm]recap'!R2C1:R1048576C9
    et l'autre sont en références relatives. Chaque fois que vous décalez d'une ligne, votre référenciel descend d'une ligne. A un moment donné, il n'y a plus de données dans le référentiel.

    Pour mieux comprendre, nommez votre aire dans votre feuille Recap (par exemple "TableauPrix1")et recréez après une macro avec l'éditeur de macro en saisissant manuellement votre cellule avec RECHERCHEV. Puis corrigez votre code avec le résultat obtenu.

    Le fait de nommer la zone TableauPrix1 va automatiquement mettre des références absolues. Vous auriez pu mettre également des $ à vos références de cellules, mais la zone nommée donnera plus de clarté à votre code.

    Cordialement.

  3. #3
    Membre averti
    Homme Profil pro
    Dessinateur BE
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Dessinateur BE
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut Merci à Eric KERGRESSE
    Voici le code obtenu grâce à vous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Range("J4").Select
          ActiveCell.FormulaR1C1 = _
            "=IF(RC[-5]<>"""",VLOOKUP(RC[-5],'[03_Prix d''achat moyen par macro.xlsm]recap'!TableauRecapPrix,4,0),VLOOKUP(RC[-9],'[03_Prix d''achat moyen par macro.xlsm]recap'!TableauRecapPrix,4,0))"
        Range("J4").Select
         Selection.AutoFill Destination:=Range("J4:J" & Range("A1048576").End(xlUp).Row)
    une autre question est il possible de noter autrement la commande Range("A1048576") pour ne pas avoir de limite de ligne
    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par wilcamp1 Voir le message
    une autre question est il possible de noter autrement la commande Range("A1048576") pour ne pas avoir de limite de ligne
    Par exemple dans votre code, vous testez la dernière ligne de votre colonne A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.AutoFill Destination:=Range("J4:J" & Range("A1048576").End(xlUp).Row)
    Pour s'affranchir des nombres de lignes différents selon les versions d'Excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.AutoFill Destination:=Range(cells(4,10),cells(Cells(Activesheet.Rows.count,10)"J4:J" & Cells(ActiveSheet.Rows.Count,1).End(xlUp).Row)
    Cette notation n'est pas très sympa car difficile à lire et avec des styles de notation différents. Pour ma part, j'utilise la notation Range pour les zones nommées car c'est très facile et très lisible Range("NOM"). Dans les autres cas j'utilise la notation Cells(Y,X).

    Par ailleurs, pour faciliter la maintenance des applications, j'utilise des noms de variables explicites et je décompose mes lignes de code. Dans votre exemple, j'aurais écrit votre code de la manière suivante et n'engage que moi :

    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
    Sub MiseEnPlaceFormulesRechercheV()
     
    Dim LigneTitreNomFeuille As Long
    Dim DerniereLigneNomFeuille As Long
    Dim ColonneAModifier As Long
     
        LigneTitreNomFeuille = 3
        DerniereLigneNomFeuille = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
        ColonneAModifier = 10
     
        Cells(LigneTitreNomFeuille + 1, ColonneAModifier).FormulaR1C1 = _
                "=IF(RC[-5]<>"""",VLOOKUP(RC[-5],'[03_Prix d''achat moyen par macro.xlsm]recap'!TableauRecapPrix,4,0),VLOOKUP(RC[-9],'[03_Prix d''achat moyen par macro.xlsm]recap'!TableauRecapPrix,4,0))"
     
        Range(Cells(LigneTitreNomFeuille + 1, ColonneAModifier), Cells(DerniereLigneNomFeuille, ColonneAModifier)).FillDown
     
     
    End Sub

    A partir de ce moment, il devient complètement évident de rendre paramétrique la procédure pour améliorer la lisibilité et simplifier le code principal ou si elle doit être mise en oeuvre très souvent.

    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
    Sub TesterMiseEnPlaceFormulesRechercheV()
     
    Dim LigneTitreNomFeuille As Long
    Dim ColonneAModifier As Long
    Dim ColonneReferenceAtester As Long
    Dim ColonneReferenceSiVide As Long
     
        LigneTitreNomFeuille = 3
        ColonneAModifier = 10
        ColonneReferenceAtester = 5
        ColonneReferenceSiVide = 1
     
        Call MiseEnPlaceFormulesRechercheV(LigneTitreNomFeuille, ColonneAModifier, ColonneReferenceAtester, ColonneReferenceSiVide)
     
    End Sub
     
     
     
    Sub MiseEnPlaceFormulesRechercheV(LigneTitre As Long, ColonneFormule As Long, ColonneATester As Long, ColonneSiVide As Long)
     
    Dim DerniereLigneTableauAModifier As Long
     
         DerniereLigneTableauAModifier = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
         Cells(LigneTitre + 1, ColonneFormule).FormulaR1C1 = _
                "=IF(RC[" & ColonneATester - ColonneFormule & "]<>"""",VLOOKUP(RC[" & ColonneATester - ColonneFormule & "],'[03_Prix d''achat moyen par macro.xlsm]recap'!TableauRecapPrix,4,0),VLOOKUP(RC[" & ColonneSiVide - ColonneFormule & "],'[03_Prix d''achat moyen par macro.xlsm]recap'!TableauRecapPrix,4,0))"
     
        Range(Cells(LigneTitre + 1, ColonneFormule), Cells(DerniereLigneTableauAModifier, ColonneFormule)).FillDown
     
     
    End Sub
    Si mes réponses vous ont apporté satisfaction et résolu votre problème, ne pas oublier de cliquer et sur .


    Cordialement.
    Dernière modification par Invité ; 09/05/2013 à 07h53.

  5. #5
    Membre averti
    Homme Profil pro
    Dessinateur BE
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Dessinateur BE
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut Bonjour Eric KERGRESSE
    Je pense avoir compris votre dernier code mais la valeur renvoyée n'est pas celle de la feuille recap mais celle de la cellule qui se trouve en J3 de ma feuille de nomenclature pouvez vous me détailler les lignes de votre code.
    surtout la ligne call
    et pourquoi mettre 2 codes
    1 TesterMiseEnPlaceFormulesRechercheV()
    2 MiseEnPlaceFormulesRechercheV
    merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par wilcamp1 Voir le message
    et pourquoi mettre 2 codes
    1 TesterMiseEnPlaceFormulesRechercheV()
    2 MiseEnPlaceFormulesRechercheV
    La macro MiseEnPlaceFormulesRechercheV est paramétrique, c'est à dire qu'il lui faut des données en entrée pour fonctionner. Ces éléments lui sont donnés par la macro TesterMiseEnPlaceFormulesRechercheV.

    Nb : Si vous essayez le lancer la macro MiseEnPlaceFormulesRechercheV directement par Excel (Alt-F8), vous verrez une fenêtre s'ouvrir et vous ne pourrez pas l'utiliser.

    Quant à la mise en place de la formule, il faut que la feuille active soit la feuille Recap. Il faut donc modifier la macro Test en ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Sheets("Recap").activate
    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
    Sub TesterMiseEnPlaceFormulesRechercheV()
     
    Dim LigneTitreNomFeuille As Long
    Dim ColonneAModifier As Long
    Dim ColonneReferenceAtester As Long
    Dim ColonneReferenceSiVide As Long
     
        Sheets("Recap").activate
     
        LigneTitreNomFeuille = 3
        ColonneAModifier = 10
        ColonneReferenceAtester = 5
        ColonneReferenceSiVide = 1
     
        Call MiseEnPlaceFormulesRechercheV(LigneTitreNomFeuille, ColonneAModifier, ColonneReferenceAtester, ColonneReferenceSiVide)
     
    End Sub

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

Discussions similaires

  1. Problème de copie de formules
    Par manou90 dans le forum Excel
    Réponses: 5
    Dernier message: 29/02/2020, 17h01
  2. Copie de formules dans des cellules
    Par jeff007 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/01/2008, 05h54
  3. Excel - copie avec formule contenant $
    Par turbo74 dans le forum Excel
    Réponses: 10
    Dernier message: 18/12/2007, 17h07
  4. {VBA Excel}Copie de formule d'où je veux
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 16/08/2007, 11h15
  5. Copie de formules
    Par remi77 dans le forum Excel
    Réponses: 3
    Dernier message: 13/03/2007, 10h24

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