Microsoft 365 Copier la même cellule de plusieurs onglets dans différentes colonnes

AlexiaC

XLDnaute Junior
Bonjour forum,

Je suis à la recherche d’une macro pour me simplifier la vie… le fichier est en pj.

J’ai classeur Excel, dans lequel je recense les différents projets sur lesquels on travaille, en vue de faire le budget. Les projets sont représentés par les onglets intitulés « Test » (J’ai mis de fausses données pour le visuel et qu’on voit si ca marche), le modèle est vide, c’est l’onglet vierge que je copie à chaque fois qu’un nouveau projet se présente pour avoir les mêmes cellules aux mêmes places.

Ce que je cherche à faire : l’onglet BD_Compil sert de recensement, et j’aimerais que chaque colonne à partir de la colonne C compile les informations du tableau des fiches de projet (Test). Et j’aimerais une macro avec bouton pour que les colonnes s’ajoutent et se compilent à chaque fois que je vais rajouter un onglet de projet. En somme que la colonne C de chaque onglet s'importe dans l'onglet BD_Compil dans les colonnes C, D, E, F, etc. au fur et à mesure que j'ajoute des projets (=des onglets) dans le classeur.

Important : j’ai mis de faux titres (test, test 1, test 2) mais ces titres seront tous différents les uns des autres quand ce sera de vrais noms de projets.

Est-ce que qqun serait en mesure de me proposer une solution? Je suis capable de programmer une macro pour copier des données dans des lignes mais dans des colonnes, je sèche complètement…!

Merci infiniment!
 

Pièces jointes

  • Budget_projets_2024-2025_Test.xlsm
    80.8 KB · Affichages: 15
Solution
Bonsoir , salut Bruno
Bon je t'ai écrit une petite macro toute simple qui se base sur le nombre de feuilles et le nombre de salaires puis les balaie une à une remplissant le tableau Compil !
c'était juste de la réflexion pour écrire un code simple
C

Compte Supprimé 979

Guest
Bonsoir,

Sans passer par une usine à gaz, vous pouvez juste ajouter une colonne à votre TS
Et recopier vers la droite les formules à partir de la C2
VB:
=INDIRECT("'" & C$1 & "'!C" & 16+LIGNE())

Vous avez juste à changer le nom de la ligne 1, à moins que vous ayez 10 projets par jours

A+
 

AlexiaC

XLDnaute Junior
Bonsoir,

Sans passer par une usine à gaz, vous pouvez juste ajouter une colonne à votre TS
Et recopier vers la droite les formules à partir de la C2
VB:
=INDIRECT("'" & C$1 & "'!C" & 16+LIGNE())

Vous avez juste à changer le nom de la ligne 1, à moins que vous ayez 10 projets par jours

A+
Allo! Merci beaucoup pour la réponse, mais je ne suis pas sûre de bien suivre la proposition...!

Rajouter une colonne à la TS... ce serait quoi TS??
Et changer le nom de la ligne 1 de quel tableau pour le remplacer par quoi?

Merci!!!
 

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir , salut Bruno
Bon je t'ai écrit une petite macro toute simple qui se base sur le nombre de feuilles et le nombre de salaires puis les balaie une à une remplissant le tableau Compil !
c'était juste de la réflexion pour écrire un code simple
 

Pièces jointes

  • Budget_projets_2024-2025_HD.xlsm
    94.2 KB · Affichages: 7

RyuAutodidacte

XLDnaute Impliqué
Allo! Merci beaucoup pour la réponse, mais je ne suis pas sûre de bien suivre la proposition...!

Rajouter une colonne à la TS... ce serait quoi TS??
Et changer le nom de la ligne 1 de quel tableau pour le remplacer par quoi?

Merci!!!
Hi,
TS = Tableau Structuré
Sur Ligne 1 du TS de BD_Compil c'est le nom des projets (nom des feuilles)
 

AlexiaC

XLDnaute Junior
Hi,
TS = Tableau Structuré
Sur Ligne 1 du TS de BD_Compil c'est le nom des projets (nom des feuilles)
Merci pour les éclaircissements. Sérieux, je suis pas vite, j'utilise les tableaux structurés depuis des années, j'ai jamais allumé que TS, c'est ça que ça voulait dire :/ je fais dur!

Oui je pourrai éventuellement ajouter les en-têtes à la main, mais même si je n'ai pas 10 projets par jour, j'avoue qu'un truc automatisé serait plus à-propos pour moi car 1/ j'ai parfois plusieurs projets qui portent le même nom (ce sont par exemple deux partenaires différents qui paient pour le même projet dans mon système comptable) et les "TS" n'aiment pas deux titres identiques et 2/ j'en ai quand même pas mal et un oubli pourrait être lourd de conséquence si c'est un projet à 10 000$ mettons...!!

je vais regarder la macro du post précédent !
Merci pour la réponse, c'est très apprécié!!
Alex
 

AlexiaC

XLDnaute Junior
Bonsoir , salut Bruno
Bon je t'ai écrit une petite macro toute simple qui se base sur le nombre de feuilles et le nombre de salaires puis les balaie une à une remplissant le tableau Compil !
c'était juste de la réflexion pour écrire un code simple
Wow... merci vraiment! sur ton exemple, ca marche impeccable. J'avais, évidemment pour des raisons de confidentialité, retirer certains onglets du fichier, les tableaux ne sont pas tout à fait à la même place sur la page et mon premier onglet à devoir être compilé est en 7e position. J'ai réussi à débogger quelques trucs mais actuellement, ça ne me met pas les en-têtes des colonnes (les "test 1, 2") dans le TS et ça commence à se compiler dans la colonne G et non à la C.

J'essaie de comprendre ton code, parce qu'il est clairement fonctionnel mais j'ai des ajustements à faire dessus par rapport à mon fichier original. Peux-tu me confirmer que j'ai bien compris svp? Et comme est-ce que je peux faire pour lui indiquer de commencer en colonne C et d'ajouter les en-têtes??

Sub compil_data()

deb = 2 'No ligne de copie dans l'onglet de destination
n = ThisWorkbook.Worksheets.Count

For x = 3 To n 'No du premier onglet à comptabiliser
dlig = Sheets(x).Range("A1000").End(xlUp).Row
For j = 18 To dlig 'no de la ligne de début de copie dans l'onglet source

With Worksheets("BD_Compil")
.Cells(deb, x) = Sheets(x).Cells(j, 3)
deb = deb + 1
End With

Next j
deb = 2 'No ligne de copie dans l'onglet de destination
Next x
End Sub

Merci full!!!
 
C

Compte Supprimé 979

Guest
Bonjour le fil, herve62
Bon !! je viens de dire qu'une macro , on ne peut pas plus simple, fait le boulot !!!!
de plus au début elle dit

donc faut respecter les souhaits non ?
@BrunoM45

Est ce que mon code en est une ?????
Je suis pour le respect des souhaits,
mais aujourd'hui pour additionner 2 cellules beaucoup demande un code en VBA :rolleyes: 🤪

Ton code est une usine à gaz, 12 lignes, comparé à une simple formule 😁😂

Mais en plus tu n'utilises pas les propriétés du ListObjet

Je dis ça, je dis rien ;)
 

RyuAutodidacte

XLDnaute Impliqué
Mais en plus tu n'utilises pas les propriétés du ListObjet
je voulais y venir (je l'ai fait fatigué, si il y a simplification faites le moi savoir svp) :
D'après ce que j'ai compris :

VB:
Option Explicit

Sub Compil()
Dim BDComp As Worksheet, x As Integer, TbNameComp As String, tbName As String, C As Integer, H As String, ShName As String


    Set BDComp = ThisWorkbook.Sheets("BD_Compil")
    TbNameComp = BDComp.Cells(1, 1).ListObject.Name
    H = Replace(Join(Application.Transpose(Application.Transpose(BDComp.ListObjects(TbNameComp).HeaderRowRange.Value)), "|"), "Employé|Charge", "")

Application.ScreenUpdating = False

    For x = 3 To ThisWorkbook.Sheets.Count
  
        ShName = Sheets(x).Name
        tbName = Sheets(x).Range("A17").ListObject.Name
      
        With BDComp.ListObjects(TbNameComp)
            If H Like "*" & ShName & "*" Then   ' on check si dans le tableau TbNameComp la colonne de l'onglet concerné existe
               .ListColumns(ShName).DataBodyRange.Value = Sheets(x).ListObjects(tbName).ListColumns(3).DataBodyRange.Value
            Else
                .ListColumns.Add    ' si la colonne de l'onglet concerné n'existe pas on l'ajoute
                C = .ListColumns.Count  ' N° de la dernière colonne
                .HeaderRowRange(C).Value = ShName   ' on nomme l'entête de la nouvelle colonne avec le nom de l'onglet
                .ListColumns(ShName).DataBodyRange.Value = Sheets(x).ListObjects(tbName).ListColumns(3).DataBodyRange.Value
            End If
        End With
    Next
  
Application.ScreenUpdating = True

End Sub
Pour tester j'ai supprimé (aussi) toutes les colonnes Test X sur la compil

Autre solution :
on boucle sur les Feuilles et on envoie dans chaque colonne (Test … etc) de compil la formule de @BrunoM45 via le Range Formula (bien sur il faut checker si tous les onglets sont dans le tableau … au quel cas faudra les rajouter
 
Dernière édition:

AlexiaC

XLDnaute Junior
Bonjour le fil, herve62

Je suis pour le respect des souhaits,
mais aujourd'hui pour additionner 2 cellules beaucoup demande un code en VBA :rolleyes: 🤪

Ton code est une usine à gaz, 12 lignes, comparé à une simple formule 😁😂

Mais en plus tu n'utilises pas les propriétés du ListObjet

Je dis ça, je dis rien ;)
Allo! De ce que je comprends de ta proposition tout en haut, il faudrait que j'ajoute les noms des en-têtes à la main en ligne 1 ? Sachant que j'ai bien compris ta formule proposée même si je ne l'ai pas testée encore. Si jamais je n'arrive pas à programmer une macro qui soit capable de me relever les noms des onglets, j'y penserai mais Hervé semble être arriver à quelque chose de probant. Ca bug chez moi mais je ne désespère pas ;) J'aimerais vraiment mieux y arriver en macro - ici, c'est vrai que je pourrai le faire à la main mais j'aurais besoin de ce système pour des réponses à un sondage, j'ai près de 250 réponses, ca ferait beaucoup d'ouvrage, le faire à la main!

Mais merci beaucoup pour la formule, je vais la tester demain!
 

AlexiaC

XLDnaute Junior
je voulais y venir (je l'ai fait fatigué, si il y a simplification faites le moi savoir svp) :
D'après ce que j'ai compris :

VB:
Option Explicit

Sub Compil()
Dim BDComp As Worksheet, x As Byte, TbNameComp As String, tbName As String, C As Byte, H As String, ShName As String


    Set BDComp = ThisWorkbook.Sheets("BD_Compil")
    TbNameComp = BDComp.Cells(1, 1).ListObject.Name
    H = Replace(Join(Application.Transpose(Application.Transpose(BDComp.ListObjects(TbNameComp).HeaderRowRange.Value)), "|"), "Employé|Charge", "")

Application.ScreenUpdating = False

    For x = 3 To ThisWorkbook.Sheets.Count
  
        ShName = Sheets(x).Name
        tbName = Sheets(x).Range("A17").ListObject.Name
      
        With BDComp.ListObjects(TbNameComp)
            If H Like "*" & ShName & "*" Then   ' on check si dans le tableau TbNameComp la colonne de l'onglet concerné existe
               .ListColumns(ShName).DataBodyRange.Value = Sheets(x).ListObjects(tbName).ListColumns(3).DataBodyRange.Value
            Else
                .ListColumns.Add    ' si la colonne de l'onglet concerné n'existe pas on l'ajoute
                C = .ListColumns.Count  ' N° de la dernière colonne
                .HeaderRowRange(C).Value = ShName   ' on nomme l'entête de la nouvelle colonne avec le nom de l'onglet
                .ListColumns(ShName).DataBodyRange.Value = Sheets(x).ListObjects(tbName).ListColumns(3).DataBodyRange.Value
            End If
        End With
    Next
  
Application.ScreenUpdating = True

End Sub
Pour tester j'ai supprimé (aussi) toutes les colonnes Test X sur la compil

Autre solution :
on boucle sur les Feuilles et on envoie dans chaque colonne (Test … etc) de compil la formule de @BrunoM45 via le Range Formula (bien sur il faut checker si tous les onglets sont dans le tableau … au quel cas faudra les rajouter
Merci :) Je teste ça demain, mon ordi de travail est... au travail ;)
 
C

Compte Supprimé 979

Guest
Bonjour AlexiaC
Allo! De ce que je comprends de ta proposition tout en haut, il faudrait que j'ajoute les noms des en-têtes à la main en ligne 1 ? Sachant que j'ai bien compris ta formule proposée même si je ne l'ai pas testée encore. Si jamais je n'arrive pas à programmer une macro qui soit capable de me relever les noms des onglets, j'y penserai mais Hervé semble être arriver à quelque chose de probant. Ca bug chez moi mais je ne désespère pas ;) J'aimerais vraiment mieux y arriver en macro - ici, c'est vrai que je pourrai le faire à la main mais j'aurais besoin de ce système pour des réponses à un sondage, j'ai près de 250 réponses, ca ferait beaucoup d'ouvrage, le faire à la main!

Mais merci beaucoup pour la formule, je vais la tester demain!
Et bien voilà quand on en sait un peu plus.... comment deviner que c'est pour 250 dossiers

Il suffit d'être explicite dès le départ, cela évite de faire perdre du temps aux gens (je ne parle pas de moi) :rolleyes:

Bonne journée
 

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour tous , @AlexiaC
Si jamais je n'arrive pas à programmer une macro qui soit capable de me relever les noms des onglets, j'y penserai mais Hervé semble être arriver à quelque chose de probant. Ca bug chez moi mais je ne désespère pas ;) J'aimerais vraiment mieux y arriver en macro
Je ne pige pas en disant que tu veux y arriver en macro ? , c'est ce que j'ai fait en vitesse pour débuter et cela fonctionne non ? en plus il n'est pas limité en nombres d'onglets , il peut y en avoir 20 ..50 ..etc c'est détecté en auto dans le code !!!!!
 

Statistiques des forums

Discussions
315 166
Messages
2 116 914
Membres
112 911
dernier inscrit
zkazumba