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 :

Recopie cellules en fonction des autres cellules [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Points : 72
    Points
    72
    Par défaut Recopie cellules en fonction des autres cellules
    Bonjour,

    J'ai crée un code qui copie/colle les valeurs de certaines colonnes du fichier "fichier_commandes.xlsm" vers le fichier "Import.xlsx".

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    Private Sub Import_Click()
     
        Workbooks.Open Filename:="X:\Import.xlsx"
        Range("A1:L10000").Select
        Selection.ClearContents
        Range("O1:O10000").Select
        Selection.ClearContents
        Range("Q1:R10000").Select
        Selection.ClearContents
     
        Windows("fichier_commandes.xlsm"). _
            Activate
        With Sheets("Commandes").Range("$A$1:$AB$10000")
            .AutoFilter Field:=8, Criteria1:="PXT"
            .AutoFilter Field:=18, Criteria1:="VRD"
            .AutoFilter Field:=5, Criteria1:="<>"
        End With
     
        Sheets("Commandes").Select
        Range("B2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
        Windows("Import.xlsx").Activate
        Range("B1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Windows("fichier_commandes.xlsm"). _
            Activate
        Range("C2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Windows("Import.xlsx").Activate
        Range("C1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("E1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("Q1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Windows("fichier_commandes.xlsm"). _
            Activate
        Range("L2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Windows("Import.xlsx").Activate
        Range("G1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Windows("fichier_commandes.xlsm"). _
            Activate
        Range("K2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Windows("Import.xlsx").Activate
        Range("H1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Windows("fichier_commandes.xlsm"). _
            Activate
        Range("Y2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Windows("Import.xlsx").Activate
        Range("I1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("O1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("R1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
     
        Windows("fichier_commandes.xlsm"). _
            Activate
        Range("Z2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Windows("Import.xlsx").Activate
        Range("J1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Windows("fichier_commandes.xlsm"). _
            Activate
        Range("AA2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Windows("Import.xlsx").Activate
        Range("K1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Application.CutCopyMode = False
        Unload UserForm2
     
        Windows("fichier_commandes.xlsm"). _
            Activate
     
        With Sheets("Commandes")
            If .AutoFilterMode Then
                .Cells.AutoFilter
            End If
        End With
     
     
        Windows("Import.xlsx").Activate
     
    End Sub
    Sur le fichier destinataire "Import.xlsx", certaines colonnes contiennent des valeurs qui ne changent jamais (elles ne sont pas concernées par le copier/coller) : je les ai rentré manuellement une fois et c'est tout.
    Le problème survient lorsque le copier/coller d'un jour colle plus de lignes que la veille : la conséquence, c'est que les colonnes qui contiennent les valeurs inchangées, ne sont pas remplies entièrement.
    Idem lorsque le copier/coller d'un jour colle moins de lignes que la veille : la conséquence, c'est que les colonnes en question contiennent trop de valeurs inchangée.
    Je sais pas si j'ai été assez explicite.
    Je cherche donc à trouver la fonction qui ajoute ces valeurs dans les cellules vides ou qui me les supprime en fonction du nombre de lignes qui ont été copiées/collées la veille.
    Si quelqu'un pouvait m'aiguiller, ce serait sympa.
    Je mets le fichier destination avec 2 exemples illustrés de ce que je souhaite faire, ce sera plus clair je crois.

    Import.xlsx

    Merci.

  2. #2
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour Eric,

    Je mets le fichier destination avec 2 exemples illustrés de ce que je souhaite faire, ce sera plus clair je crois.
    Pas au 1er post.

    2 remarques en préalable.
    - Utiliser l'enregistreur de macro peut s'avérer utile.
    Au demeurant, celui-ci doit être épuré (notamment de ces f.. Select) afin de le rendre lisible.
    - Il est important, voire impératif, de bien rattacher les objets Range à leur feuille parent.

    Le plus simple à mon avis est de retourner les cellules complétées la veille pour les effacer.
    Et ce avant la copie.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Points : 72
    Points
    72
    Par défaut
    Merci de ta réponse MarcelG
    Au vu de celle-ci, je crois que je me suis mal fais comprendre.
    Quand tu dis de supprimer les cellules compléter la veille avant copie, je suppose que tu veux parler des cellules qui ne sont pas concernées par le code (celles dont la valeur n'est pas modifiée), puisqu'en début de code, j'efface toutes les autres cellules.
    Si c'est bien le cas, je rappelle pour être plus clair dans mon explication que, justement, ces valeurs ne doivent pas être modifiées ni supprimées.
    Et là est le problème.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    N'ouvrant jamais les fichiers joints, pourrais-tu placer une image de la plage de données "source" et la plage de données "cible" (classeur Import) en indiquant la plage à conserver et pour la source les colonnes à exporter ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Points : 72
    Points
    72
    Par défaut
    Bonjour Philippe Tulliez

    Voici le fichier source :
    Nom : Capture d’écran 2019-02-22 à 16.46.46.png
Affichages : 90
Taille : 308,2 Ko

    Les colonnes à exporter depuis la source vers la cible sont :
    SOURCE CIBLE
    B B
    C C - E - Q
    L G
    K H
    Y I - O - R
    Z J
    AA K



    Les colonnes du fichier cible qui contiennent des valeurs qui ne doivent jamais être modifiées sont les colonnes en jaune : M - P - S - U - V - W - X - Y - Z - AA - AB - AC

    Voici le fichier cible :
    Nom : Capture d’écran 2019-02-22 à 16.54.23.png
Affichages : 83
Taille : 316,9 Ko

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Points : 72
    Points
    72
    Par défaut
    Je reprends la discussion avec une précision.
    Ce que je souhaite en fait, c'est intégrer une fonction IF dans mon code et coller la formule sur 100 lignes :
    exemple : ActiveCell.FormulaR1C1 = "=IF(RC[-11]="""","""",""A"")".
    Comment faire en sorte que cette formule soit collée sur les 100 premières lignes.
    Est-ce : For i=1 to 100 ?
    Merci d'avance pour votre aide.

  7. #7
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    bonjour
    si la formule est en A2 par exemple
    et tu veux copier en A3 à A100
    essayez avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ActiveCell.FormulaR1C1 = _
            "=IF(RC[-11]="""","""",""A"")"
        Range("A3").Select
        Selection.AutoFill Destination:=Range("A3:A100"), Type:=xlFillDefault
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La boucle est inutile car on peut écrire sur une plage complète en un seule instruction
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D2:D12500").Formula = "=A2*B2"
    Personnellement, je travaille avec la propriété Formula au lieu de FormulaR1C1 mais dans les deux cas, l'écriture peut être faite directement sur une plage complète.

    La lecture de ces billets t'apportera plus d'éclaircissement
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Points : 72
    Points
    72
    Par défaut
    Bonjour BENNASR et merci de ta réponse,

    J'ai oublié de dire que le code est exécuté depuis un formulaire sur une autre feuille, est-ce que ça change quelque chose ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    La boucle est inutile car on peut écrire sur une plage complète en un seule instruction
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D2:D12500").Formula = "=A2*B2"
    Personnellement, je travaille avec la propriété Formula au lieu de FormulaR1C1 mais dans les deux cas, l'écriture peut être faite directement sur une plage complète.

    La lecture de ces billets t'apportera plus d'éclaircissement
    merci Philippe, je vais essayer ça rapidement

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai oublié de dire que le code est exécuté depuis un formulaire sur une autre feuille, est-ce que ça change quelque chose ?
    Lorsque l'on manipule un objet, il est important de préciser sa parentalité complète (L'objet Range a comme parent l'objet Worksheet et celui-ci a comme parent l'objet Workbook)

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ThisWorkbook.worksheets("Feuil3").Range("D2:D2000").Formula = "=A2*B2"
    En précisant cette parentalité on écrira la formule quelque soit la feuille active.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    ou se trouve la formule à recopier ?? si c'est dans cette autre feuille ou dans la feuille active :
    une tentative de réponse à essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with Sheets("NOMAUTREFEUIL")
    .Activate
    .cells(1,1).activate
    ActiveCell.FormulaR1C1 = _
            "=IF(RC[-11]="""","""",""A"")"
        Range("A3").Select
        Selection.AutoFill Destination:=Range("A3:A100"), Type:=xlFillDefault
    end with
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour Bennasr,
    ou se trouve la formule à recopier ?? si c'est dans cette autre feuille ou dans la feuille active :
    une tentative de réponse à essayer :
    Comme expliqué régulièrement sur ce forum les méthodes Activate, Select et les objets Selection sont à éviter car inutile et de ils ralentissent l'exécution des procédures
    Personnellement, j'évite autant que possible d'utiliser l'objet ActiveSheet car on risque d'écrire et lire sur la mauvaise feuille.
    En précisant Classeur.Feuille.Cellule on est certain d'atteindre le bon objet
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Points : 72
    Points
    72
    Par défaut
    Très bien, merci à vous, le dernier code de Philippe fonctionne.

    Encore merci.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/03/2016, 16h51
  2. Ajout ligne en fonction des autres
    Par iGaia dans le forum Débutez
    Réponses: 13
    Dernier message: 30/09/2015, 15h59
  3. Réponses: 1
    Dernier message: 04/08/2014, 13h26
  4. [Toutes versions] Fusion de cellule en fonction des autres resultats
    Par djamat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/05/2013, 10h13
  5. Réponses: 2
    Dernier message: 20/03/2011, 01h17

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