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 d'un classeur à un autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut Copier/Coller d'un classeur à un autre
    Bonjour,

    J'ai un classeur "activité.xlsm" et un classeur "du.xlsm".
    Dans mon classeur activité j'ai plusieurs feuilles où une feuille = une activité. C'est sous forme de tableaux croisés dynamiques pour chaque feuille.
    J'aimerais faire un copier/coller de chaque tableaux l'un en dessous de l'autre.
    Sauf qu'il y a différents sites qui font plus ou moins d'activités, ce qui fait que je ne peux pas faire de copier/coller avec des cases figées.
    Il me faudrait le code vba qui me permet de voir dès qu'il n'y a plus rien pour le coller juste en dessous de la dernière ligne.

    Si vous savez, n'hésitez pas !
    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Tu peut obtenir la dernière ligne non vide avec le code suivant. (ici sur la colonne "A")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DernièreLigne = Range("A" & Rows.Count).End(xlUp).Row
    Grace a cette variable tu devrais pouvoir selectionnr ton tableau.

    De plus en recalculant cette variable sur la feuille ou tu colle les tableaux après chaque copier-coller et en collant ton tableau à la ligne suivante tu auras ce que tu cherches.

  3. #3
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    l'objet PivotTable a une propriété TableRange2
    qui renvoi la plage occupée par un TCD.
    Tu peux ainsi déterminer la ligne à partir de laquelle
    tu peux coller le prochain TCD.

    Cordialement,

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut
    Bonjour,

    J'aurais d'une petite aide, je suis débutant en vba.
    je ne sais pas comment utiliser PIVOT.TABLE. et j'ai besoin de faire des collages spéciaux (forme).

  5. #5
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Hello sebfh,

    peux tu nous envoyer ton classeur,
    en enlevant bien sur les données sensibles!
    Là, c'est trop vague pour t'aider!
    Cordialement,

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut
    Nom : tcd.PNG
Affichages : 502
Taille : 41,0 Ko

    voilà un screen d'une feuille de mon classeur. Les autres sont identiques mais avec les filtres qui diffèrent.
    La ligne en surlignée n'est que la retranscription des filtres sur une seule ligne.

    Donc ce que je voudrais en résultat c'est :

    Nom : tcd2.PNG
Affichages : 531
Taille : 37,0 Ko

    J'espère que tu vois un peu mieux ce que je veux faire
    Ou alors si possible lors de la copie, copier les TCD entiers afin de pouvoir les actualiser

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut
    et aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Réglages des filtres des activités
        Workbooks.Open "..."
        Windows("activités.xlsm").Activate
        n = Sheets.Count
        For i = 1 To n
         For j = 1 To n
          Sheets(i).PivotTables("Tableau croisé dynamique" & j).PivotFields("Site"). _
    -->     CurrentPage = "toto"
          Sheets(i).PivotTables("Tableau croisé dynamique" & j).PivotFields("Zone"). _
            CurrentPage = "tata"
         Next j
        Next i
        Windows("activités.xlsm").Close
    Lors de la définition des filtres, j'ai une erreur au niveau de la flèche. Mon code fonctionne quand j'ai fait feuille par feuille mais avec une boucle c'est quand même mieux.
    Seulement il fait les filtres de la première feuille mais bloque ensuite.

  8. #8
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Alors essai déja de faire comme ça.
    Ca m'étonnerais qu'un retour à la ligne entre un objet et une méthode fonctionne!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'Réglages des filtres des activités
        Workbooks.Open "K:\5_Stagiaire_atelier\DU\sorties tdc\activités.xlsm"
        Windows("activités.xlsm").Activate
        n = Sheets.Count
        For i = 1 To n
         For j = 1 To n
          Sheets(i).PivotTables("Tableau croisé dynamique" & j).PivotFields("Site").CurrentPage = "toto"   ' PAS DE RETOUR LIGNE ICI!
          Sheets(i).PivotTables("Tableau croisé dynamique" & j).PivotFields("Zone").CurrentPage = "tata"  '  ET LA NON PLUS!
         Next j
        Next i
        Windows("activités.xlsm").Close

  9. #9
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut
    Non c'est pareil. L'erreur doit provenir du PivotTables donc du &j parce qu'il me dit qu'il peut pas le lire..

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Lors de la définition des filtres, j'ai une erreur au niveau de la flèche. Mon code fonctionne quand j'ai fait feuille par feuille mais avec une boucle c'est quand même mieux.
    Seulement il fait les filtres de la première feuille mais bloque ensuite.
    Signaler que tu as une erreur sans en préciser le numéro et le texte ne nous aide pas.

    Je signale tout de même que si des tableaux se trouvent les uns en dessous des autres et que l'on modifie le filtre d'un tableau se trouvant au-dessus, il y a risque de "collision" si le nombre de lignes est supérieur au nombre de lignes qui sépare les deux tableaux.
    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

  11. #11
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut
    Il n'y a qu'un tcd par feuille.
    C'est l'erreur d'exécution 1004 : Impossible de lire la propriété PivotTables de la classe Worksheet.

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il n'y a qu'un tcd par feuille.
    Alors je ne comprends pas les boucles imbriquées (pourquoi la boucle J).

    C'est l'erreur d'exécution 1004 : Impossible de lire la propriété PivotTables de la classe Worksheet.
    Il y a de forte chance que le nom du PivotTable ne soit pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sheets(i).PivotTables("Tableau croisé dynamique" & j)
    Si réellement tu n'as qu'un seul tableau croisé dynamique par feuille, utilise alors l'indice numérique 1 de la collection PivotTables soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sheets(i).PivotTables(1)
    mais encore une fois, je ne vois pas la raison de l'existence de la boucle J

    Comme tu parcours, l'ensemble des feuilles du classeur, tu risques d'avoir encore des erreurs s'il n'y a pas de tableau croisé dynamique dans une feuille.

    De plus, j'utiliserais la collection WorkSheets plutôt que Sheets

    Extrait du tutoriel Description de l'objet Feuille de calcul dans Excel
    La propriété Sheets renvoie tous les types de feuilles contenues dans le classeur: Les feuilles graphiques et feuilles de calcul.
    La propriété Worksheets renvoie uniquement la collection de feuilles de calcul.
    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

  13. #13
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut
    C'est bon j'ai corrigé, et effectivement je ne sais pas pourquoi j'ai mis une boucle j.. C'est ce qui faisait bugger

    Par contre j'ai toujours un problème pour copier/coller
    j'ai une erreur au niveau du selection.paste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim Ws As Worksheet
    Dim derniereLigne As Integer
    Dim derniereColonne As Integer
     
    For Each Ws In Workbooks("activités.xlsm").Worksheets
        Ws.Activate
        derniereLigne = Range("A" & Rows.Count).End(xlUp).Row
        derniereColonne = Cells(4, Columns.Count).End(xlToLeft).Column
        Range(Cells(1, 1), Cells(derniereLigne, dernièreColonne)).Select
        Selection.Copy
     
            Workbooks("classeurfinal.xlsm").Worksheets("mafeuille").Cells(derniereLigne, 1).Paste
    Next Ws
    ça me met erreur "438" : Propriété ou méthode non gérée par cet objet

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    ça me met erreur "438" : Propriété ou méthode non gérée par cet objet
    Le message d'erreur te dit exactement que l'objet Range n'a pas de méthode Paste
    PasteSpecial est une méthode de l'objet Range mais pas Paste. Si tu avais utilisé l'enregistreur de macros tu aurais pu le voir.
    Utilise plutôt la méthode Copy avec son argument Destination

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Dim rngSource As Range, rngTarget As Range
     With ThisWorkbook
      Set rngSource = .Worksheets("Feuil1").Range("A1:C20")
      Set rngTarget = .Worksheets("Feuil2").Range("A5")
     End With
     rngSource.Copy rngTarget
    [EDIT]
    Autre exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim rngSource As Range, rngTarget As Range
     Set rngSource = ThisWorkbook.Worksheets("Feuil1").Range("A1:C20")
     Set rngTarget = Workbooks("Classeur2").Worksheets("Feuil2").Range("A5")
     rngSource.Copy rngTarget
    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

  15. #15
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 148
    Par défaut Erreur d'exécution '5'
    Bonjour,

    J'ai maintenant une erreur d'exécution '5' : Argument ou appel de procédure incorrect. Alors que cela marchait bien.

    Sur ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Windows("classeurSource.xlsm").Activate
        n = Sheets.Count
        For i = 1 To n
          pivtab = "Tableau croisé dynamique" & i
          Sheets(i).PivotTables(pivtab).PivotFields("Site").CurrentPage = site
          Sheets(i).PivotTables(pivtab).PivotFields("Zone").CurrentPage = ValeurARetourner
        Next i
    erreur à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(i).PivotTables(pivtab).PivotFields("Zone").CurrentPage = ValeurARetourner
    J'ai essayé en mettant 1 à la place de "pivtab" mais c'est pareil et le contenu de ValeurARetourner est le bon.

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

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