Rassembler / agglomérer des tableaux

Bonjour à tous !

Je suis vraiment novice en VBA donc désolé par avance si j'ai mal abordé le problème ou que mon explication n'est pas très claire... J'ai cherché pendant longtemps sur ce forum et ailleurs mais sans trouver de réponse (je n'utilise sûrement pas les bons mots clefs ) L'explication est longue mais j'ai l'impression que mes problèmes sont au final très simples et que c'est plus un problème de syntaxe qu'autre chose...

L'objectif rapidement est le suivant : j'ai X feuilles, et sur chacune de ces feuilles il y a un tableau + des mises en forme diverses qui sont dans des cellules extérieures au tableau. Le but est de récupérer toutes les données des tableaux et d'en faire un seul sur une feuille à part (appelons là Feuille_Recap). Le but de cela est d'ensuite pouvoir importer le gros tableau sur un autre logiciel.

Maintenant je vais essayer de détailler les problèmes que j'ai rencontrés

J'ai donc un fichier avec plusieurs feuilles et chaque feuille possède un tableau. Ces feuilles sont des copies d'une feuille originale, mais de ce que j'ai vu les tableaux qui sont donc censés être les mêmes n'ont pas les mêmes noms (par "nom" j'entends les "Tableau2349" qui sont en haut à gauche de la feuille quand on sélectionne un tableau). Jusque-là ça me paraît normal que les noms soient différents, juste je suis bloqué puisque je n'arrive pas à savoir quel tableau appartient à quelle feuille. J'ai trop de feuilles pour pouvoir les renommer manuellement, et j'ai l'impression qu'il n'y a pas de logique lorsque l'on génère un tableau.

Le premier problème est donc d'arriver à appeler les tableaux. C'est-à-dire trouver une fonction qui, pour une feuille donnée, dit "appeler le premier tableau de cette feuille". Vu qu'il n'y a qu'un tableau par feuille je pense que ce sera suffisant.

Le deuxième problème vient du fait que toutes les feuilles de l'Excel ne contiennent pas ce tableau. En fait il faudrait que j'arrive à les appeler soit en disant "celles qui commencent par un numéro" (exemple : 01 - Ain), soit en disant "parcourir toutes les feuilles, récupérer le nom et s'il est différent de "Accueil", "Synthèse", ou "Autres" (ce sont des exemples) alors récupérer le premier tableau. Bref que je puisse parcourir toutes les feuilles sauf une liste donnée.

Les autres problèmes viennent de la méthode que j'aimerais utiliser. Mon idée est de générer ce "gros tableau sur une feuille à part" à chaque fois que l'utilisateur va fermer le ficher. Pour se faire je voudrais donc faire comme suit :

1 - La Feuille_Récap reste toujours sur le fichier et n'est jamais supprimée. Par contre la procédure commence par le fait de la vider entièrement (un genre de Feuille_Récap.clear).

2 - Ensuite on génère un tableau sur Feuille_Récap qui a la même structure que tous les tableaux des différentes feuilles, histoire d'avoir un tableau avec les bons entêtes mais vide autrement.

3 - Puis on parcourt toutes les feuilles sauf une liste donnée et on copie-colle les valeurs des tableaux dans le tableau de la Feuille_Recap.

4 - On supprime toutes les lignes vides.

5 - On enlève certaines colonnes qui ne seront pas utiles pour le logiciel où je veux exporter le tableau.

6 - On change certains titres, car ils pourraient être coupés lors de l'exportation.

Où j'en suis :

1 - J'ai la procédure entière. Après peut être que ça vaut le coup de complètement recréer la feuille à chaque fois, mais j'ai peur d'avoir des "#REF!" si j'appelle cette feuille à d'autres endroits du classeur.

2 - J'ai la procédure qui fonctionne. Une question de praticité cependant : peut-être que mettre les entêtes sur une feuille à part n'est pas utile, et que je peux me contenter de copier-coller les entêtes d'une feuille où je suis sûr qu'il y a un tableau ?

3 - Je n'ai pas de procédure, mais j'ai quelques bouts. S'il vous plaît c'est la partie la plus importante sans laquelle je ne peux rien faire...

4 - J'ai une procédure qui ne fonctionne pas pour les tableaux apparemment... En faisant le test sur une feuille où les valeurs ne sont pas dans un tableau, je n'ai aucun problème. Cependant j'ai l'impression que les cellules d'un tableau ne sont jamais considérées comme "vide" et donc que ça ne marche pas...

5 - J'ai une procédure qui fonctionne, mais qui n'est pas robuste. Par exemple si j'ai envie de supprimer d'autres colonnes, je dois tout changer manuellement. Est-il possible de parcourir les entêtes du tableau et de les comparer à une liste qui serait sur la feuille "Calculs", et dès qu'il n'y a pas correspondance supprimer la colonne correspondante ?

6 - J'ai une procédure. Elle utilise une liste dans la feuille "Calculs" et remplace la première ligne de la Feuille_Recap par la ligne où il y a la liste. Je ne sais pas s'il y a de meilleures solutions.

Dernièrement sur la partie "lancer cette procédure à la fermeture du fichier", j'ai écrit un code qui marche apriori.

Je joins un fichier Excel juste où je vous ai mis tout ce que j'ai pour ce problème.

Merci d'avance à tout ceux qui prendront le temps de lire et de m'aider sur certaines parties au moins !

Bonjour,

Un début

Option Explicit
Sub CreationRecap()

Dim Sh As Worksheet, Tb As ListObject

With Sheets("Feuille Récap")
    .ListObjects("TabRecap").DataBodyRange.Delete 'Suppression contenu tableau
    For Each Sh In Sheets 'Boucle sur les feuilles
        If Sh.Name Like "## - *" Then 'Contrôle format nom feuille
            Set Tb = Sh.Range("B4").ListObject 'Obtention du nom du tableau
            Tb.DataBodyRange.Copy 'Copie les données
            .Range("A" & .ListObjects("TabRecap").ListRows.Count + 2).PasteSpecial Paste:=xlPasteValues 'Colle en valeur
            Application.CutCopyMode = False
        End If
    Next Sh
End With

End Sub

Cette macro nécessite la création préalable d'un tableau structuré nommé TabRécap en feuille Récap avec les mêmes en têtes que les tableaux à rapatrier.

Bonjour à tous !

Et....

Une très rapide proposition via Power Query (quelques clics suffisent ) :

Note : J'ai normalisé le nom de vos tableaux structurés.

Bonjour à tous

Tout cela est bien inutile

En quelques clics et sans VBA on crée le tableau de la feuille Recap avec PowerQuery, totalement intégré à Excel, avec cette méthode http://www.excel-formations.fr/Trucs_astuces/PQ04.php

Quand les feuilles sources évoluent pas besoin de supprimer quoi que ce soit , il suffit d'actualiser le tableau Recap par un clic droit

1recap-pq.xlsx (33.47 Ko)

EDIT : JFL a tiré plus vite que mon ombre

Bonjour de nouveau !

EDIT : JFL a tiré plus vite que mon ombre

Une fois n'est pas coutume .....

Bonjour !

Je vous remercie énormément pour toutes vos réponses, je ne m'attendais pas à une telle réactivité

Depuis lundi j'ai regardé un peu toutes les option que vous m'aviez proposé, et il est vrai que je ne connaissais pas du tout l'existence de Power Query.

@Pedro22, je vous remercie pour ce code VBA qui est bien plus concis que celui que j'avais en tête !

Cependant après avoir tenté l'approche Power Query, c'est vrai que cette dernière semble bien plus simple et m'évite des complications superflues au vu de mon niveau en VBA Merci donc aussi à @JFL et @78chris pour me l'avoir fait découvrir Pour tous les gens qui pourraient avoir un problème similaire, je la recommande fortement !

Il me reste cependant un problème. J'ai l'impression que je pourrais/devrais ouvrir un nouveau sujet mais je me dis que la réponse est peut être juste toute bête, ou existe dans Power Query (je ne l'ai pas trouvé cependant).

A l'heure actuelle, j'ai donc tous les tableaux originaux qui sont rassemblés dans "un gros tableau" sur une feuille à part (tout ça en utilisant Power Query seulement donc).

Maintenant j'aimerais exporter cette feuille sur un autre classeur "Exportation", qui serait donc uniquement dédié à l'exportation vers un logiciel tierce. Il contiendrait une feuille, possédant un tableur, rien de plus.

J'ai découvert l'outil "Connexion" de Power Query et il m'a permis de faire un lien entre le classeur original et le classeur où il n'y a que le tableau. Cependant j'ai des difficultés à comprendre comment il fonctionne exactement...

Pour l'instant quand je ferme le fichier original j'ai écrit ce code :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

ThisWorkbook.RefreshAll
ThisWorkbook.Connections("Requête - Fusion (2)").Refresh

End Sub
Mais il ne fonctionne pas, et j'ai besoin d'actualiser manuellement le tableau sur l'autre fichier.

Qui plus est, j'ai l'impression qu'il y a un laps de temps conséquent pour que la connexion soit mise à jour Quand j'ouvre le 2ème classeur et que j'actualise le tableau, il ne s'actualise pas par rapport à la version la plus récente, mais par rapport à celle qu'il y a quand j'ouvre Power Query, et qui est donc la version juste avant la modification. Si je ferme et rouvre en attendant un peu, alors l'actualisation fonctionne.

D'où mes interrogations :
1) Est-ce que la deuxième ligne fait doublon avec la première ?
2) Plus généralement quel code écrire pour que, à chaque fois que le fichier soit fermé, l'autre soit mis à jour sans avoir besoin de l'ouvrir ?

Merci par avance une nouvelle fois !

(si vous pensez qu'il est important d'ouvrir un autre sujet, n'hésitez à me le faire savoir et je m'exécuterai )

Bonjour à tous,

De ce que je comprends de l'exposé des faits, vous me semblez complexifier les choses bien inutilement.

Pourquoi, dans votre classeur "Exportation" ne pas aller lire, via Power Query, les tableaux structurés des différents départements afin de construire le tableau final désiré ?

L'actualisation des données peut s'effectuer à l'ouverture du fichier via les propriétés de la requête (donc sans VBA).

Il est vrai que d'un point de vue extérieur je semble me complexifier la tâche pour rien, et qu'avoir une unique version du tableau pourrait fonctionner. Cependant j'avais pour objectif de ne vraiment jamais avoir à ouvrir le second fichier Excel, pour la simple et bonne raison que c'est une base de donnée brute servant uniquement à l'exportation des données.

En fait, je me passerais bien de ce second fichier si possible, mais le fait est que le logiciel ne supporte pas les exportations en ".xlsm" (la solution est-elle alors de forcer une copie de sauvegarde au format ".xlsx" à chaque fermeture du fichier ?).

Dernièrement de ce que j'ai compris de Power Query et sans utiliser VBA, impossible de mettre à jour le tableau sans ouvrir le fichier.

Après en soit ce problème n'est pas des plus "importants" puisque si je reste sur la solution donnée et que, avant chaque exportation, j'ai juste à ouvrir le fichier, actualiser le tableau et refermer le fichier, la tâche est loin d'être insurmontable...

C'est juste que si quelques lignes de code ou une option à cocher dans Power Query pouvaient éviter de la faire, ce serait tout de même une bonne chose.

Encore merci pour cette première proposition de réponse en tous cas !

Rechercher des sujets similaires à "rassembler agglomerer tableaux"