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 :

Copier une plage dans une feuille et la coller dans une feuille selon un critère de date [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut Copier une plage dans une feuille et la coller dans une feuille selon un critère de date
    Bonjour à tous,

    J'ai un fichier qui comporte deux onglets "Onglet1" et "Onglet2" et je souhaite copier les cellules B5 à D13 de l' "Onglet1" pour les coller sur la plage H7 à J15 de l' "Onglet2" lorsque la ligne 4 (ligne de Date) de onglet1 coïncide avec la ligne 6 (Date) de onglet2 .
    Enfin je veux que les modifications apportées à la feuille 2 (onglet2) soit enregistrées.

    Ci-joint mon fichier pour plus de clarté.


    Merci d'avance pour votre aide.

    Kalmard
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,
    Une idée avec un bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton1_Click()
    Dim D As Range
    With Sheets("Onglet2")
      Set D = .Range("C6:I6").Find(Sheets("Onglet1").Range("C4"), .Range("I6"))
      If Not D Is Nothing Then
       .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
      End If
    End With
    End Sub
    Enfin je veux que les modifications apportées à la feuille 2 (onglet2) soit enregistrées.
    expliques-toi mieux sur cette demande
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Salut, casefayere

    merci pour ta réponse,
    J'opterai plutôt pour une macro sans bouton car je souhaite ensuite automatiser l' exécution de cette macro depuis une ligne de commande (fichier .bat).
    Pour le dernier point je veux juste que le tout soit enregistrer après le collage instruction du genre "save sheet" mais je suis pas sûr du code.

    Bonne soirée.

  4. #4
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    re,
    Je ne comprends pas ta demande mais si tu ne veux pas un bouton, tu peux mettre ce code dans l'évènement "Change" de ta feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim D As Range
    With Sheets("Onglet2")
      If Target.Address = "$C$4" Then
        Set D = .Range("C6:I6").Find(Target, .Range("I6"))
        If Not D Is Nothing Then
          .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
        End If
      End If
    End With
    End Sub
    ...après le collage instruction du genre "save sheet" mais je suis pas sûr du code.
    Je ne vois pas comment enregistrer une feuille sans enregistrer le fichier mais comme je viens de le dire, je ne comprends pas ta demande

    Bonne soirée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Salut,
    L'enregistrement du fichier me conviendrait,
    Les deux codes marchent parfaitement, pourrais tu me donner une explication sur les lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set D = .Range("C6:I6").Find(Sheets("Onglet1").Range("C4"), .Range("I6"))
      If Not D Is Nothing Then
       .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
      End If


    Merci encore.

  6. #6
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Je t'explique l'exemple avec la dernière proposition, le principe est le même pour l'autre
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim D As Range
    With Sheets("Onglet2")
      If Target.Address = "$C$4" Then 'si la selection est en C4
      'Find est une fonction de recherche
    'D est une variable Range, donc on cherche dans la plage Sheets("Onglet2").Range("C6:I6"), la valeur de Sheets("Onglet1").Range("C4")
        Set D = .Range("C6:I6").Find(Target, .Range("I6"))
     'si la recherche est positive, la valeur est trouvée donc D n'est pas "Nothing"
     
        If Not D Is Nothing Then
        'D étant, dans ton exemple I6 de l'onglet2,la plage qui reçoit les données va de d(2,0)  d(10,2) soit de H7 à J15
          .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
        End If
      End If
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Mes sincères reciemments,

    Bonne journée.


    Kedmard.

  8. #8
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,
    il faut penser à cliquer sur quand ça l'est,

    Bonne journée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Sur la même lancée , as tu une idée sur la façon dont on procédera si le copier/coller doit se faire par comparaison direct? je m'explique:

    Supposons que l'onglet 2 des contienne des dates jusqu'au 01/12/2012 comment faire en sorte que si la date de onglet 1 est la meme que celle l'onglet 2 , alors que la copie de B513 de l'onglet 1 soit faite sur la plage correspondant à la date en question dans l'onglet 2.


    Je te joint le fichier pour plus de compréhension.
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    re,
    je ne suis pas en forme ce matin, voici 3 fois que je change le code
    si j'ai compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim D As Range, dercol As Long
    With Sheets("Onglet2")
      dercol = .Cells(6, .Columns.Count).End(xlToLeft).Column
      If Target.Address = "$C$4" Then
        Set D = .Range("C6", .Cells(6, dercol)).Find(Target, .Cells(6, dercol), LookIn:=xlValues)
        If Not D Is Nothing Then
          .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
        End If
      End If
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    ça ne marche pas ,

    J'ai mis le code dans "Thisworkbook", changé la date de l'onglet 1
    au 01/08/2012
    Et lorsque j'exécute on me demande le nom de la macro et si je mets le nom de ma procédure , j'ai un nouveau module qui se crée ... et mais au finish je n'ai rien dans la colonne de date 01/08/2012 de l'onglet 2


    Ai-je sauter une étape ? merci

  12. #12
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    As-tu fait attention, j'ai rechangé le code, je n'étais pas en forme, essayes et dis-moi
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  13. #13
    Invité
    Invité(e)
    Par défaut
    Je n'ai pas eu le même problème que toi mais je pense que ça pourrait t’intéresser de lire ce que j'ai fait :

    http://www.developpez.net/forums/d12...orrespondante/

    Il s'agissait de copier une colonne dans une autre feuille selon la date, en l'adaptant tu dois pouvoir copier la colonne source, dans une colonne de destination selon la date. Le problème n'est pas le même dans le lien que je t'ai envoyé, mais ça peut te donner des idées.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Toujours rien,

    Je te mets le fichier en Pj le code est dans "Thisxorbook".
    Fichiers attachés Fichiers attachés

  15. #15
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim D As Range, dercol As Long
    With Sheets("Onglet2")
      dercol = .Cells(6, .Columns.Count).End(xlToLeft).Column
      If Target.Address = "$C$4" Then
        Set D = .Range("C6", .Cells(6, dercol)).Find(Target, .Cells(6, dercol), LookIn:=xlValues)
        If Not D Is Nothing Then
          .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
        End If
      End If
    End With
     
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    ça ne marche toujours pas , on me demande toujours de remplir le nom de la macro.

    C'est comme si l'éxécution n'avait aucun effet...

    Tu as éssayer toi de l'éxécute?

  17. #17
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    C'est un évènement "Change donc on ne passe pas par "execute", il faut savoir ce que tu veux. Je t'avais proposé un bouton, en changeant légèrement le code, tu m'as dit non. Ensuite, je t'ai proposé de passer par l'évènement "Change" de ta feuille. Maintenant tu préfères passer par thisworkbook avec l'évènement "Workbook_SheetChange", la macro marchera quand tu sera sur la cellule "C4" de la feuille Onglet1, encore faut-il, par sécurité ajouter la condition "If Sh.name = "Onglet1" soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim D As Range, dercol As Long
    With Sheets("Onglet2")
      dercol = .Cells(6, .Columns.Count).End(xlToLeft).Column
      If Sh.Name = "Onglet1" And Target.Address = "$C$4" Then
        Set D = .Range("C6", .Cells(6, dercol)).Find(Target, .Cells(6, dercol), LookIn:=xlValues)
        If Not D Is Nothing Then
          .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
        End If
      End If
    End With
     
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Salut casefayere,

    Désolé si je n'ai pas été assez claire dans mes post, tes réponses m'ont permi en enfin d'avoir ce que je chechais.
    J'ai donc dans "thisworkbook" le code ci-dessous final:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Macopie()
    Dim D As Range, dercol As Long
    With Sheets("Onglet2")
      dercol = .Cells(6, .Columns.Count).End(xlToLeft).Column
         Set D = .Range("C6", .Cells(6, dercol)).Find(Sheets("Onglet1").Range("C4"), .Cells(6, dercol), LookIn:=xlValues)
        If Not D Is Nothing Then
          .Range(D(2, 0), D(10, 2)).Value = Sheets("Onglet1").Range("B5:D13").Value
        End If
    End With
    End Sub
    Qui résoud mon problème.

    Juste un dernier détail, pourquoi tu dis que
    D(2, 0) =H7 et D(10,2)=J15

    Merci encore pour tout.

  19. #19
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Juste un dernier détail, pourquoi tu dis que
    D(2, 0) =H7 et D(10,2)=J15
    D représente la cellule cherchée et c'est une variable Range, tu as 2 choix :
    - l'écrire comme ci-dessus, le premier chiffre représente le décalage des lignes, le deuxième le décalage des colonnes, sachant que D.Address et D(1,1).address (fais l'essai) te donneront le même résultat, la plage commence 1 ligne en dessous et une colonne avant donc D(2,0), même principe pour D(10,2)

    - Tu utilises "Offset", le comptage commence à 0 : D(1,1) = D.offset(0,0), D(2,0) = D.offset(1,-1)

    intègres cette ligne dans ton code et regardes le résultat qui sera identique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox D.Address & " " & D(1, 1).Address & " " & D.Offset(0, 0).Address
    Je répéte penses à
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Merci .

    J'ai déjà cliquez su résolu.

    Bonne journée.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/05/2015, 09h36
  2. Macro copier coller d'une plage dans un nouveau fichier Excel sous condition
    Par lapagaille dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2014, 17h27
  3. [XL-2007] Copier une plage dans une feuille et la coller dans une autre du même classeur.
    Par kedmard dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2012, 14h55
  4. Réponses: 3
    Dernier message: 01/09/2009, 23h48
  5. copier une plage d'un fichier Excel non ouvert vers la feuille en cours
    Par mich2704 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/06/2006, 12h30

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