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 :

copie de tous les onglets dans un même onglet


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    copie de tous les onglets dans un même onglet
    Bonjour

    je souhaite copier tous les onglets (300) dans un même onglet, en mettant les données les unes en dessous des autres
    Malheureusement le nom des onglets n'a pas de logique. Les colonnes dans les onglets, elles sont homogènes.
    Merci pour votre aide.



    Cordialement

  2. #2
    Responsable
    Office & Excel

    Salut.

    Merci de préciser ta version d'Excel. Je suis parti de l'idée que tu as au moins la 2010, donc que tu peux utiliser Power Query.


    Solution Power Query

    Il faut que tes données dans les 300 feuilles soient transformées en tableau (je pense que Power Query ne peut pas combiner autre chose que des tableaux lorsqu'il faut reprendre toutes les feuilles du classeur, à vérifier). Cela peut se faire par VBA. Pour aller vite, pas besoin de nommer tes tableaux de manière spécifique... ils peuvent s'appeler Tableau1, Tableau2, ...

    Lorsque tes tableaux sont transformés:
    • Onglet données> Obtenir des données > A partir d'autres sources > Requête vide
    • Dans la barre de formule Power Query, saisir = Excel.CurrentWorkbook() (Attention, Power Query est sensible à la casse);
    • Filtrer sur les tableaux dont le nom ne commence pas par "t_";
    • Développer les tables pour récupérer toutes les données de toutes les tables à la suite les unes des autres;
    • Renommer ta requête Power Query en t_Résulat;
    • Renvoyer dans Excel.




    Solution VBA, si on doit prendre toutes les feuilles en compte, et en comptant sur le fait que tes données démarrent en A1 de chaque feuille

    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
    Sub Conso()
      Dim shResult As Worksheet
      Dim sh As Worksheet
      Dim Target As Range
      Dim Source As Range
     
      Set shResult = Worksheets.Add(after:=Worksheets(Worksheets.Count))
      shResult.Name = "Consolidation"
     
      shResult.Range("1:1").Value = Worksheets(1).Range("1:1").Value
      For Each sh In Worksheets
        If sh.Name <> "Consolidation" Then
          Set Target = shResult.Range("a1048576").End(xlUp)(2)
          Set Source = sh.Range("a1").CurrentRegion
          Set Source = Source.Offset(1).Resize(Source.Rows.Count - 1)
          Target.Resize(Source.Rows.Count, Source.Columns.Count).Value = Source.Value
        End If
      Next
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié la réponse? =>
    ---------------

  3. #3
    Candidat au Club
    Merci pour vos solutions

    Le code VBA fonctionne parfaitement.


    Milles merci.

    Cdlt

  4. #4
    Responsable
    Office & Excel

    C'est probablement que la feuille sur laquelle tu passes à ce moment-là est vide ou ne contient qu'une seule ligne, et donc qu'elle est "vide" en termes de données (Une ligne d'intitulés mais pas de lignes de données)



    Dans ce cas, il faut tester qu'il y a bien des données dans la feuille
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      For Each sh In Worksheets
        If sh.Name <> "Consolidation" Then
          Set Target = shResult.Range("a1048576").End(xlUp)(2)
          Set Source = sh.Range("a1").CurrentRegion
          If Source.Rows.Count > 1 Then
            Set Source = Source.Offset(1).Resize(Source.Rows.Count - 1)
            Target.Resize(Source.Rows.Count, Source.Columns.Count).Value = Source.Value
          End If
        End If
      Next
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié la réponse? =>
    ---------------

  5. #5
    Candidat au Club
    Oui, c'était bien cela ( onglet vide)
    Je m'en suis rendu compte en testant le code.

    Merci pour ton aide.

###raw>template_hook.ano_emploi###