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- Copier-coller avec conditions [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Macro- Copier-coller avec conditions
    Bonjour à tous,

    Je n’ai aucune connaissance en VBA ,même mes connaissances en Excel sont limitées.
    J’ai besoin de votre aide pour créer des macros dans un classeur.
    La première feuille est celle où les données vont être encodées, la seconde celle destinée à récupérer certaine données de la feuille 1.
    Les champs pré remplis sont fixes sur les deux feuilles. Sur la première feuille , toutes les données sont conservées années après années . Sur la deuxième, les données insérées dans la première viennent se copier (dès modification) en écrasant ce qui est déjà présent dans la deuxième feuille.

    - Feuille 1 : Cellule de B2 à B11 = si on écrit alors la ligne entière (celle de la cellule) va se copier sur la ligne 2 de la feuille 2. Il faut faire la vérification sur toutes les cellules et prendre la dernière ligne remplie pour la copier (ce sera B2 puis B3 puis B4 et ainsi de suite jusque B11)

    Je pense et j’espère que si j’arrive à comprendre le code pour cette macro, je devrais être capable de le reproduire et le modifier pour l’appliquer sur les autres cellules qui doivent suivre les mêmes conditions.

    J'ai juste pu faire une macro qui vérifie si B3 est non vide alors copie ligne de feuille 1 sur ligne 2 de feuille 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Cellule_non_vide()
    ' Macro1 Macro
    If Not IsEmpty(Range("B3")) Then
    Rows("3:3").Select
    Selection.Copy
    Sheets("Fiche courtier").Select
    Rows("2:2").Select
    ActiveSheet.Paste
    End If
    End Sub



    D’avance merci pour vos aides et explications.

  2. #2
    Membre régulier Avatar de verredewhisky
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Janvier 2013
    Messages : 63
    Points : 98
    Points
    98
    Par défaut
    Tu es sûr que tu as besoin d'une macro pour faire ça ? Il veut peut être mieux utiliser le SI() d'Excel pour arranger le cas où la cellule est vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(Feuil1!B2="";0;Feuil1!B2)
    Tu fais quoi une fois que tu as copié les cellules ?

  3. #3
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Quand la ligne est copiée dans la feuille 2 , je ne dois plus rien faire avec jusqu'à la prochaine saisie.

    Je pense que j'ai besoin d'une macro car:

    La plage de cellule B2 à B12 contient une année 2013-2014-2015...etc
    Chaque année, sur la feuille 1, des données vont être insérés les unes à la suite des autres et ces même données doivent aller se recopier sur la ligne 2 de la feuille 2 en écrasant les précédentes.(Sur la feuille 1 = toutes les années à la suite et sur la feuille 2 garder uniquement l'année en cours)

    Je voudrais que cela soit automatisé par une macro qui dit "dès qu'une cellule de cette plage est remplie (saisie de données) et que la ligne inférieure est vide alors copier la ligne complète vers la ligne 2 de la feuille 2"

    En français cela donne ceci:
    - Dans feuille 1 vérifier que B3 est remplie et vérifier que B4 est vide SI OUI alors copier Ligne 3 sur ligne 2 feuille 2
    SINON dans feuille 1 vérifier que B4 est remplie et vérifier que B5 est vide Si OUI alors copier Ligne 4 sur ligne 2 feuille 2
    SINON ......Vérif idem jusque la cellule B12

    Du peu que je crois comprendre il y a des conditions en mettre en boucle pour automatiser le copier coller en fonction de la saisie dans une cellule de la plage.

    N'y connaissant rien, j'espère que j'arrive à me faire comprendre....

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Fais un clic droit sur l'onglet de la feuille 1 et clique sur "Visualiser le code". Colle la macro suivante dans la partie droite de la fenêtre qui vient de s'ouvrir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Intersect(Target, [B2:B11]) Is Nothing Then Exit Sub
        If Target <> "" Then
            Rows(Target.Row).Copy Sheets("Fiche Courtier").[A2]
        End If
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Whaouw!

    C'est magique!

    Par contre , je me rends compte que cela ne fonctionne pas avec un copié-collé sur une dès ligne et c'est ma faute, j'ai parlé de saisie dans les cellules B2 à B11 , désolée.

    Erreur d'execution '13' :
    incompatibilité de type
    Est-ce qu'il est possible de rendre le code compatible avec un copié-collé ?
    Et est-ce que je peux abuser en demandant la signification ligne par ligne du code que vous m'avez fait ?

    J'ai aussi envie de comprendre et d'apprendre afin de pouvoir me débrouiller et ne pas (trop)p avoir l'air idiote....

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Je n'arrive pas à reproduire le problème. Peux-tu me dire la plage que tu copies et l'endroit où tu la colles ? Voici la macro avec des explications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'se déclenche quand on entre une valeur dans une cellule
    Private Sub Worksheet_Change(ByVal Target As Range)
        'si on entre une valeur dans une cellule n'appartenant pas à la plage B2:B11
        'on arrête la macro
        If Intersect(Target, [B2:B11]) Is Nothing Then Exit Sub
            'si la valeur de la cellule modifiée n'est pas nulle
            If Target <> "" Then
                'on copie la ligne de cette cellule sur l'aautre feuille en ligne 2
                Rows(Target.Row).Copy Sheets("Fiche Courtier").[A2]
            End If
        Next c
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    bonjour,

    voici le code à Daniel C. corrigé ..

    j'ai supprimé l'utilisation de Rows sans suffixe précisant feuille / classeur ..

    et surtout j'ai pris en compte le cas ou target pouvais comporter plusieurs cellules ..
    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
     
    'se déclenche quand on entre une valeur dans une cellule
    Private Sub Worksheet_Change(ByVal Target As Range)
        'si on entre une valeur dans une cellule n'appartenant pas à la plage B2:B11
        'on arrête la macro
        Dim r As Range 'ligne
        If Intersect(Target, [B2:B11]) Is Nothing Then Exit Sub
            'si la valeur de la cellule modifiée n'est pas nulle
            For Each r In Target.EntireRow.Rows 'I lpeu y avoir plusieurs lignes de modifiées..
                If r.Cells(1, 2) <> "" Then 'Si colonne B différentes de guillemets
                    'on copie la ligne de cette cellule sur l'aautre feuille en ligne 2 "Fiche Courtier
                    r.EntireRow.Copy ThisWorkbook.Sheets("Feuil3").Cells(r.Row, 1)
                End If
            Next r
     
    End Sub
    Je n'ai pas rajouté le test ( ?manquant ?) sur le fait que seule la dernière ligne et copiée...

  8. #8
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Cela se produit quand je copie une ligne dans un autre classeur et que je la colle sur une ligne de ma feuille 1.
    Quand je copie juste le contenu d'une cellule c'est nickel.

    Mais la ligne est très longue et je ne peux pas saisir toutes les données , c'est pour cela que je fais un copié-collé de la ligne entière.

    Peut être qu'il faudrait modifier la plage de cellule avec la série de lignes (lignes 2 à 11) ? Et ne pas se référer aux cellules mais aux lignes dans le code?

    Si j'avais formulé ma demande correctement au départ, je suis certaine que cela aurait été plus simple pour vous .....

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour bbil,

    Effectivement, je n'avais pas compris.

    Par contre, il y quelque chose que je ne comprends pas dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each r In Target.EntireRow.Rows
    Tu vas traiter des lignes complètes, non ?

    Je verrais plutôt (ou j'ai encore mal compris) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each r In Intersect(Target, [B2:B11])
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    oui je boucle bien dans la ligne complète mais ensuite je teste la colonne b :

    ...

    c'est vrai qu'ensuite le EntireRow pour la copie est un peu superflu ...

  11. #11
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Moi, là je ne comprends plus grand chose...
    J'ai donc mis ce code
    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
    'se déclenche quand on entre une valeur dans une cellule
    Private Sub Worksheet_Change(ByVal Target As Range)
        'si on entre une valeur dans une cellule n'appartenant pas à la plage B2:B11
        'on arrête la macro
        Dim r As Range 'ligne
        If Intersect(Target, [B2:B11]) Is Nothing Then Exit Sub
            'si la valeur de la cellule modifiée n'est pas nulle
            For Each r In Target.EntireRow.Rows 'I lpeu y avoir plusieurs lignes de modifiées..
                If r.Cells(1, 2) <> "" Then 'Si colonne B différentes de guillemets
                    'on copie la ligne de cette cellule sur l'aautre feuille en ligne 2 "Fiche Courtier
                    r.EntireRow.Copy ThisWorkbook.Sheets("Fiche courtier").Cells(r.Row, 2)
                End If
            Next r
     
    End Sub

    Je devais bien modifier ce qui est en rouge par rapport à mon classeur? feuille = "Fiche courtier" et row = "2" ?
    r.EntireRow.Copy ThisWorkbook.Sheets("Feuil3").Cells(r.Row, 1)
    Mais j'ai beau modifier ou revenir au code initial rien ne se copie dans la ligne 2 de ma feuille 2 (fiche courtier) et j'ai l'erreur
    erreur d'exécution '1004'
    impossible de coller les informations car les zones sont de forme et taille différente etc...

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    il faut bien modifier le nom ..

    as-t des zones fusionnées dans tes feuilles ?

  13. #13
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je n'en reviens pas, j'ai modifié et ça fonctionne !
    Voilà le code que j'ai mis et le copié-collé marche nickel :-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'se déclenche quand on entre une valeur dans une cellule
    Private Sub Worksheet_Change(ByVal Target As Range)
        'si on entre une valeur dans une cellule n'appartenant pas à la plage B2:B11
        'on arrête la macro
        Dim r As Range 'ligne
        If Intersect(Target, [B2:B11]) Is Nothing Then Exit Sub
            'si la valeur de la cellule modifiée n'est pas nulle
            For Each r In Target.EntireRow.Rows 'I lpeu y avoir plusieurs lignes de modifiées..
                If r.Cells(1, 2) <> "" Then 'Si colonne B différentes de guillemets
                    'on copie la ligne de cette cellule sur l'aautre feuille en ligne 2 "Fiche Courtier
                Rows(Target.Row).Copy Sheets("Fiche Courtier").[A2]
                End If
            Next r
    End Sub
    Et en plus j'ai aussi utilisé la bonne balise cette fois !

    Un grand merci pour votre aide et vos explications! Cela me donne vraiment envie d'apprendre :-)

    PS: J'attends juste que vous regardiez le code afin que vous le validiez avant de marquer mon post comme résolu. Il y a peut être quelque chose qui cloche et moi, je ne suis pas capable de le voir....

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

Discussions similaires

  1. [XL-2003] Macro Copier Coller Avec CheckBox et Conditions
    Par HoLbOrN dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 15/11/2017, 13h09
  2. [XL-2013] Macro copier/coller avec condition
    Par comandototo dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/01/2015, 12h35
  3. Macro- Copier-coller avec conditions
    Par touchard.mathieu dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 15/02/2014, 17h17
  4. [XL-2000] macro copier coller avec condition ne marche pas
    Par antfo dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 17/03/2010, 10h54
  5. Macro copier/coller avec tri
    Par Lechette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/03/2008, 12h44

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