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 coller en fonction d'une date précise [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 21
    Par défaut Copier coller en fonction d'une date précise
    Bonjour à tous,
    J'ai besoin de votre aide pour résoudre une erreur d'incompatibilité de type que je n'arrive pas à comprendre.
    J'ai deux feuilles dans mon classeur, l'une où j'ai des données avec la date du jour et l'autre où j'ai tout l'historique.
    J'aimerais pouvoir copier les données de cette première feuille pour les coller sur la seconde en appuyant sur un bouton.
    Je vous mets mon fichier en pièce-jointe et le code également ici.
    Merci d'avance !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    col = Application.Match(Sheets("copie").[D4], Worksheets("colle").[2:2], 0)
    Worksheets("colle").Cells(3, col).Resize(25, 1).Value = Worksheets("colle").[B4:B28].Value
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    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 974
    Par défaut
    bonjour
    à tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
     Dim plage As Range,  F1 As Worksheet, F2 As Worksheet
       Set F1 = Sheets("colle")
       Set F2 = Sheets("copie")
       dercol = F1.Cells(2, F1.Cells.Columns.Count).End(xlToLeft).Column
       Set plage = F1.Range(F1.Cells(2, 2), F1.Cells(2, dercol))
       Set c = plage.Find(F2.Cells(4, "D"), LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
    derlig = F1.Cells(Rows.Count, c.Column).End(xlUp).Row
    F1.Range(F1.Cells(3, c.Column), F1.Cells(derlig, c.Column)).Copy
    F2.Cells(4, "B").PasteSpecial Paste:=xlPasteValues
    End If
    End Sub
    Fichiers attachés Fichiers attachés

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 21
    Par défaut
    Bonjour et merci pour votre réponse.
    J'ai essayé ce que vous m'avez proposé et cela ne fonctionne pas pour moi. J'ai du mal à comprendre votre code.
    Si quelqu'un peut m'éclairer je suis preneur

  4. #4
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    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 974
    Par défaut
    bonjour
    et cela ne fonctionne pas pour moi
    je ne crois pas qu'il y a un code qui fonctionne pour moi et ne fonctionne pas pour toi... quel message d'erreur??? est ce que ça fonctionne sur mon fichier test ?? quelle différence par rapport à ton fichier??
    à la limite tu peux joindre un fichier comme exemple avec quelques lignes de données non discrétionnaires
    pour le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
     Dim plage As Range,  F1 As Worksheet, F2 As Worksheet
       Set F1 = Sheets("colle")
       Set F2 = Sheets("copie")
       dercol = F1.Cells(2, F1.Cells.Columns.Count).End(xlToLeft).Column ' pour chercher la dernière colonne non vide de la ligne 2
       Set plage = F1.Range(F1.Cells(2, 2), F1.Cells(2, dercol)) ' la plage ou se trouve les dates sur la ligne 2
       Set c = plage.Find(F2.Cells(4, "D"), LookIn:=xlValues, lookat:=xlWhole) ' cherche la date qui se trouve en D4 de l'onglet "copie"
    If Not c Is Nothing Then 'si tu trouve la date 
    derlig = F1.Cells(Rows.Count, c.Column).End(xlUp).Row ' chercher la dernière ligne non vide de cette colonne ou se trouve cette date
    F1.Range(F1.Cells(3, c.Column), F1.Cells(derlig, c.Column)).Copy 'copier la plage de la ligne 3 à la dernière ligne non vide
    F2.Cells(4, "B").PasteSpecial Paste:=xlPasteValues  ' copier vers B4 de l'onglet "copie"
    End If
    End Sub
    j'espère que ça t'aide à avancer

  5. #5
    Expert confirmé
    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 : 68
    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
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Je pars de l'hypothèse selon laquelle les données de la feuille "Colle" vont s'enrichir au fur et à mesure des jours.
    A mon avis, les données sont mal présentées dans la feuille "Colle".
    Les jours qui vont suivre vont alimenter les données.
    Celles-ci constituent donc un nouvel enregistrement.
    Pour parler concrètement, j'aurais inversé les lignes et les colonnes de cette feuille.

    Si l'on considère maintenant, une table de données (ou tableau structuré) nommée "T_Données"
    Si l'on considère une cellule annexe retournant la position du jour recherché dans la première colonne (champ "jour") de cette table, et nommée "lequiv"
    Alors, la formulation de cette cellule serait
    =EQUIV(D4;T_Données[Jour];0)
    Dès lors, une seule et même formule pourrait alimenter les cellules de la feuille "copie" reportant les résultats
    =INDEX(T_Données;lequiv;LIGNE()-2)
    On évite ainsi un développement VBA.

    Le tableau structuré "T_Données" se redimensionnant automatiquement, les formulations n'en seront nullement altérées.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 21
    Par défaut
    Citation Envoyé par BENNASR Voir le message
    j'espère que ça t'aide à avancer
    Bonjour et encore merci pour ta réponse,
    Oui ça m'aide à avancer et avec tes commentaires sur le code j'ai compris ce qu'il se passait.
    Or, c'est l'inverse de mon besoin. Dans mon cas, j'aimerais que ce soit la feuille colle qui soit alimentée alors que dans ce code c'est le fichier copie.
    Je pourrais juste inverser le sens, or la recherche de la dernière colonne non vide ne fonctionnera pas, puisque il y a déjà toutes les dates qui y sont écrites.

    Je ne sais pas comment arriver à récupérer la position de la date correspondante et je n'arrive pas bien à comprendre la méthode de Marcel car ça ne me parle pas du tout. A vrai dire je ne suis pas un expert d'Excel.

    Mais avez-vous essayé mon code que j'avais proposé parce que je pense que cela doit marcher et il doit y avoir une erreur de syntaxe ou je ne sais pas trop quoi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    col = Application.Match(Sheets("copie").[D4], Worksheets("colle").[2:2], 0)
    Worksheets("colle").Cells(3, col).Resize(25, 1).Value = Worksheets("colle").[B4:B28].Value

  7. #7
    Expert confirmé
    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 : 68
    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
    Billets dans le blog
    7
    Par défaut
    Salut,

    je n'arrive pas bien à comprendre la méthode de Marcel car ça ne me parle pas du tout
    Pour ce faire, il te faut d'abord intégrer la notion de tableau structuré
    2 tutoriels
    les tableaux structurés
    VBA pour les tableaux structurés

    Je dis seulement que tu peux te passer de code VBA, et il faut le faire tant que possible.
    Ton besoin nécessite seulement
    - Une bonne organisation de tes données (enregistrements en lignes plutôt qu'en colonnes)
    - 2 formulations "structurées"

    Ci-joint, un fichier.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 21
    Par défaut
    Bonjour et merci,
    Je viens de voir votre réponse et votre fichier. Le problème c'est que vous récupérez les données de la feuille colle pour les reporter sur la feuille copie.
    Or, mon souhait est de faire l'inverse. En partant de la feuille copie qui récupère les données du jour, je souhaiterais qu'elles se collent dans la feuille colle...

  9. #9
    Expert confirmé
    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 : 68
    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
    Billets dans le blog
    7
    Par défaut
    Salut,

    Au temps pour moi.

    Raison de plus, dans ce cas, d'organiser tes données comme je te l'ai suggéré.

    Si la date est trouvée dans le tableau "T_Données" de la feuille "colle", alors y reporter les données de la feuille copie.
    Sinon, ajouter un enregistrement et y reporter ces données.

    Je dois partir.

    Je reviens avec un code en milieu d'après-midi.

  10. #10
    Expert confirmé
    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 : 68
    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
    Billets dans le blog
    7
    Par défaut
    Salut à nouveau,

    Voici, voilou

    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
    Option Explicit
     
    Public Sub maj_tablostruc()
     
    Dim laplage As Range
    Set laplage = Worksheets("copie").Range("B4:B28")
     
    Dim leformat As String
     
    leformat = Range("T_Données[Jour]").NumberFormat
     
    Range("T_Données[Jour]").NumberFormat = "#"
     
    Dim t As Range, dest As Range
     
    Set t = Range("T_Données[Jour]").Find(What:=Format(Worksheets("copie").Range("ladate").Value, "#"), Lookat:=xlWhole, LookIn:=xlValues)
     
    If t Is Nothing Then
            Set dest = Range("T_Données").ListObject.ListRows.Add.Range.Cells(1, 2)
            dest.Offset(rowoffset:=0, columnoffset:=-1).Value = Worksheets("copie").Range("ladate").Value
    Else
            Set dest = t.Offset(rowoffset:=0, columnoffset:=1)
            Set t = Nothing
    End If
     
    dest.Resize(rowsize:=1, columnsize:=laplage.Count).Value = Application.WorksheetFunction.Transpose(laplage.Value)
     
    Set dest = Nothing
     
    Set laplage = Nothing
     
    Range("T_Données[Jour]").NumberFormat = leformat
     
    End Sub
    Pour chercher une date, ce principe de chercher la série de date est souvent présente dans mes applicatifs.

    Une autre piste consisterait sans doute à s'aider de la propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.FindFormat.NumberFormat
    A voir.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 21
    Par défaut
    Merci beaucoup pour ton aide.
    Je commence à comprendre comment ça marche cette histoire . Puisque j'avais une erreur qui s'affichait et j'ai compris qu'il fallait nommer la cellule D4 en ladate.
    J'approfondis ça demain et je passerais cette discussion en résolu si je n'ai plus de problème.
    Merci encore infiniment pour ta pédagogie et ton altruisme !

  12. #12
    Expert confirmé
    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 : 68
    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
    Billets dans le blog
    7
    Par défaut
    Salut,

    Le nom de la cellule n'est pas fondamental ici.
    Mais il aide à coder plus clairement.

    Nous n'insisterons jamais assez sur ce point.
    Bien régenter ses noms est fondamental si l'on souhaite une architecture de code rigoureuse.
    Un exemple:
    Pour les échanges entre formulaire VBA et données tableur, le fait de nommer ses contrôles "Txt_nom" et sa donnée "nom" facilite grandement la gestion du code.
    De même pour un champ de tableau structuré.
    On peut dès lors envisager une boucle - presque - commune aux 2 environnements (Il suffit d'ajouter "Txt_").
    Voire plus loin: alimenter une variable tableau (Array) en bouclant sur ses contrôles de formulaire et leur type pour alimenter la table de données composée des champs correspondants.
    Mais, là encore, la rigueur reste de mise.

    Après la lecture de ces 2 tutoriels, tu pourrais consulter ce dernier code presque mot à mot.
    Ne pas hésiter de revenir si une - même simple - question se pose.

    Au plaisir.

    Bonne soirée à toi, Bonne soirée au Forum.

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

Discussions similaires

  1. [XL-2016] Copier/coller une ligne en fonction d'une date
    Par pierre3b dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/12/2019, 17h23
  2. [XL-2010] Copier-Coller des lignes en fonction d'une date
    Par LeDVLP dans le forum Excel
    Réponses: 3
    Dernier message: 03/11/2017, 10h13
  3. [XL-2010] Copier Coller des colonnes d'une feuille à une autre en fonction d'un critère
    Par Groggy78 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/07/2014, 20h12
  4. Copier coller en fonction des dates
    Par hortencia dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 02/12/2011, 11h51
  5. [XL-2003] Copier coller en fonction de non vide d'une colonne adjacente
    Par Vadorblanc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/03/2011, 21h43

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