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 partie d'une colonne vers une autre feuille [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut Copier une partie d'une colonne vers une autre feuille
    Bonjour à tous,

    J'aurai besoin de conseils pour copier 3 colonnes d'une Sheet1 vers une Sheet2, il s'agit des colonnes B, D et F, seulement je voudrais copier la colonne seulement à partir de la ligne 3

    J'ai essayé quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Sheets("Sheet1").Range("B3" & Rows.Count).End(xlDown).Row.Copy Sheets("Sheet2").Columns(1)
    Sheets("Sheet1").Range("D3" & Rows.Count).End(xlDown).Row.Copy Sheets("Sheet2").Columns(2)
    Sheets("Sheet1").Range("F3" & Rows.Count).End(xlDown).Row.Copy Sheets("Sheet2").Columns(3)
    Ainsi que :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sheets("Belfius").Range("B3").End(xlDown).Row.Copy Sheets("Reconciliation").Columns(1)
    Sheets("Belfius").Range("D3").End(xlDown).Row.Copy Sheets("Reconciliation").Columns(2)
    Sheets("Belfius").Range("F3").End(xlDown).Row.Copy Sheets("Reconciliation").Columns(3)

    Mais ça ne fonctionne pas, je pourrai utiliser une fonction select puis copier le reste mais ça ferait encore moins clean, auriez-vous quelques idées ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    un bon code n'ayant rien besoin de sélectionner, juste travailler directement sur les objets (notion incomprise vu le code Row !)
    comme pourtant indiqué dans l'aide VBA interne de Range.Copy :

    With [Sheet1!A1].CurrentRegion.Rows
    .Item("3:" & .Count).Range("B:B,D:D,F:F").Copy [Sheet2!A1]
    End With

    ___________________________________________________________________________________________________________

       :arrow:  Merci de cliquer sur :plusser: en bas à droite de chaque message ayant aidé puis sur :resolu: pour clore cette discussion …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    Salut Marc,

    Ca n'a pas fonctionné,

    Premièrement parce que la cellule A1 est une cellule fusionné dans ma "Sheet1",

    Deuxièmement, lorsque j'enlève la fusion (ce que je ne suis pas censé faire), ça m'a copié les colonnes sur la "Sheet 2" en cellule A3 au lieu de A1

    Je suppose du coup que du coup ça a copié les colonnes B D et F, alors que je veux seulement copier à partir de B3, D3 et F3 (ne pas copier ce qu'il y a sur les 2 premières lignes)

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Cela fonctionne de mon côté mais effectivement cela peut échouer avec une feuille conçue avec les pieds !
    Et ce n'est pas forcément un problème de cellules fusionnées …     Et tu supposes mal …

    Tu peux utiliser ta méthode pour trouver le numéro de la dernière ligne
    et à partir de la cellule B3 redimensionner la source à copier via la propriété   Resize  
    ou encore juste avec un Range entre la cellule de début et celle de fin …

  5. #5
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    En fait l'idée c'est de ne pas toucher la feuille, c'est supposé être une reconciliation que je fais issu de deux sources différentes,
    Je copie les données d'une source dans ma "Sheet 1" et je laisse la feuille telle qu'elle, grâce à ma macro j'ai déjà rajouter une colonne avec formule, supprimer les lignes dont la cellule est à 0 et trier les données en fonction de plusieurs critères, dernière étape, j'aimerai maintenant commencer la reconciliation.

    Pour cela j'ai besoin de copier les lignes de mes colonnes dans une autre feuille, le nombre de lignes étant variable d'un jour à l'autre je ne peux pas vraiment l'adapter du style "B3:B415", et je ne souhaite pas non plus faire un truc du style "B3:B65360"

    Quant au ton utilisé, sans commentaires....

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Aucun souci, niveau grand débutant, en suivant l'aide VBA de Range.Copy :

    Range({premier cellule}, {dernière cellule}).Copy {DestinationPremièreCellule}

    Remplacer les éléments entre accolades par des objets référant aux cellules correspondantes …

  7. #7
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    Je t'ai déjà dit que je ne connais pas la dernière cellule, elle varie tous les jours.

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Pourtant dans ton code tu sais déjà la trouver via la propriété End, un effort que diable ‼

    Erreurs en rouge :

    Sheets("Sheet1").Range("B3" & Rows.Count).End(xlDown).Row.Copy Sheets("Sheet2").Columns(1)

    Déjà une simple démonstration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Demo4Noob()
        With Range("A1:Z99").Rows
            With .Item("3:" & .Count).Columns
                Debug.Print .Item(4).Address
            End With
        End With
    End Sub
    ___________________________________________________________________________________________________________
    L'effort fait les forts …

  9. #9
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    Celui là ne veut toujours pas fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Sheets("Sheet1").Range("B3", Range("B3").End(xlDown)).Copy Sheets("Sheet2").Columns(1)

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    J'ai édité mon précédent message avec une p'tite démo …

    Sinon pourquoi .Columns(1) ?     Au lieu de la première cellule de la destination, cf aide VBA interne.

    Et si la feuille source n'est pas celle active alors il manque la référence de la feuille devant le second Range :

      Range("Sheet1!B3", [Sheet1!B2].End(xlDown)).Copy [Sheet2!A1]   …

  11. #11
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    Ok alors j'ai fait comme ça, ça a l'air de fonctionner, je vais le dupliquer en plusieurs fois pour pouvoir copier toutes les colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheets("Sheet1").Range("B3", Sheets("Sheet1").Range("B3").End(xlDown)).Copy Sheets("Sheet2").Range("A1")
    Merci pour ton aide

  12. #12
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Que renvoie donc MsgBox [Sheet1!A1].CurrentRegion.Address ? La plage globale de cellules est-elle bonne ?

    Commencer de B3 pour trouver la dernière cellule peut s'avérer problématique, il faut logiquement partir de B2 !

  13. #13
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    Cela renvoie "$A$1:$C$208"

    J'ai 208 lignes dans le fichier source du coup ça me semble OK

    En fait dans cette feuille source non modifié,

    La ligne 1 et 2 ne contient pas de data,

    Les titres des colonnes commencent à la ligne 3, c'est la raison pour laquelle je fais commencer en B3

  14. #14
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Avec cette plage A1:C208 je ne comprends pas alors la copie de la colonne D alors qu'elle est vide !

    Commencer en B3 pour rechercher vers le bas est une erreur quand seule B3 est remplie
    car cela t'emmène à la dernière cellule de la feuille de calculs (B1048576) ‼
    Pas ce souci depuis B2 et c'est simple à vérifier déjà manuellement via Ctrl + Flèche Bas (Voir plus bas …)

    Une autre voie pour copier en une fois les colonnes même si la D et la F sont vides :

     Range(Replace("Sheet1!B3:B#,D3:D#,F3:F#", "#", [Sheet1!B3].End(xlDown).Row)).Copy [Sheet2!A1]   …

  15. #15
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    Alors je pense qu'il y a un quiproquo par ma faute, vu que je suis concentré sur le code,


    Les autres colonnes ne sont pas vides, je t'ai donné la valeur de ma "Sheet2" au lieu de la "Sheet1", la "Sheet2", que nous appelerons d'ailleurs maintenant la sheet "Reconciliation"


    Du coup en mettant ton MsgBox dans la "Sheet1" avec la valeur "A1", j'obtiens $A$1:$F$1

    Cependant en utilisant MsgBox [Sheet1!A2].CurrentRegion.Address j'obtiens $A$1:$N$210


    En faisant le CTRL + bas depuis la cellule B2, je tombe sur la case B3
    En faisant le CTRL + bas depuis la cellule B3, je tombe sur la case B210
    Je ne suis pas sûr d'avoir bien compris ton point

  16. #16
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Donc si la ligne n°2 est vide c'est plus simple à partir de A3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With Range("Sheet1!A3").CurrentRegion.Columns
            Union(.Item(2), .Item(4), .Item(6)).Copy [Sheet2!A1]
        End With
    Comme quoi le contexte a toujours son importance !

    Pour B2 B3 c'est vrai, autant pour moi !
    Mais en fait dans une feuille vide effectue juste une saisie en B3 et refais le test Ctrl + Flèche bas

    C'est pourquoi on préfère ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With Sheet1
            .Range(Replace("B3:B#,D3:D#,F3:F#", "#", .Cells(.Rows.Count, 2).End(xlUp).Row)).Copy Sheet2.Cells(1)
        End With
    Attention ici Sheet1 et Sheet2 ne sont pas les noms des feuilles mais leur CodeName lié à ThisWorkbook,
    le classeur contenant le code …


  17. #17
    Membre averti
    Homme Profil pro
    Employé voulant apprendre à automatiser
    Inscrit en
    Février 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Employé voulant apprendre à automatiser

    Informations forums :
    Inscription : Février 2018
    Messages : 61
    Par défaut
    Parfait,

    Ca fonctionne bien comme ça, et c'est bien plus propre.

    Merci pour ton aide

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/02/2018, 08h33
  2. Validation d'une partie d'un XML sur une partie d'un XSD
    Par EJO64 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/02/2015, 09h05
  3. copier le contenu de cellule d'une colonne vers une autre feuille.
    Par vile-coyote dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/11/2010, 06h25
  4. Copier le contenu d'une colonne vers une autre table
    Par papay dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2009, 16h27
  5. Copier une colonne vers une autre dans la même table
    Par Thalys dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/09/2008, 14h29

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