Macros xls "export data entre les feuilles d'un même classeur"

Cecinerock

XLDnaute Nouveau
Salut à tous,

Besoin d'aide !

Je suis amené à automatiser l'export de données se trouvant sur une feuille xls vers d'autres feuilles du même classeur.
La feuille brute (data source) contient deux tableaux avec en ligne des prénoms de personnes, et en colonnes plusieurs champs décrivant les projets sur lesquelles ces personnes travaillent.
Chaque feuille (celles vers lesquelles l'export doit être réalisé) correspond à une fiche personne + une feuille décrivant l'ensemble des projets.

càd --> si la table brute (feuille 1) contient 5 personnes (lignes) travaillant chacun sur 2 projets --> résultat : nombre de feuille = 7 (feuille brute), 5 feuilles (une pour chaque personne) et feuille projets (avec autant de ligne que de projets)


A partir de cette table (feuille 1) la macros est sensée alimenter d'autres tableaux se trouvant dans les autres feuilles et (condition) :
--> s'il y a un nouveau projet (repérer par le champ date ou statut), la macros doit créer un nouvel onglet correspondant (sur la feuille projet).
--> si un projets s'achève (statut = OK), la macros doit masquer les enregistrements précédents (correspondant à ce projet).

Sachant que c'est la première fois que j'utilise VBA sous xls, je crie à l'aideeeeee :)
J'espère qu'il y a bien quelqu'un qui va pouvoir m'aider !

Merci par avance

cdt
 

Cecinerock

XLDnaute Nouveau
Re : Macros xls "export data entre les feuilles d'un même classeur"

Salut,

ci-joint vous pouvez récupérer un exemple du fichier en question

merci bien :)

cdt
 

Pièces jointes

  • Exemple.xlsx
    18 KB · Affichages: 77
  • Exemple.xlsx
    18 KB · Affichages: 76
  • Exemple.xlsx
    18 KB · Affichages: 76

Nairolf

XLDnaute Accro
Re : Macros xls "export data entre les feuilles d'un même classeur"

Une réponse un peu tardive et un peu commentée.
L'essentiel est là, il n'y aura plus qu'à adapter aux données que tu souhaites traitées.
Je suis volontairement passé par des formules index pour que les modification s'impact automatiquement sans relancer un code vba. par contre ça peut être contraignant...
 

Pièces jointes

  • Exemple_Nairolf.xlsm
    43.1 KB · Affichages: 96

Cecinerock

XLDnaute Nouveau
Re : Macros xls "export data entre les feuilles d'un même classeur"

Salut,

J'ai pris connaissance du contenu de la macros et je te remercie infiniment :)
Je vais ajouter quelques modif pour avoir des couleurs, etc.

Merci encore

cdt

ps : qu'est ce qui risque d'être contraignant ?
 

Nairolf

XLDnaute Accro
Re : Macros xls "export data entre les feuilles d'un même classeur"

Désolé, je n'avais pas pu terminer mon message, voilà la suite:

Ce qui peut être contraignant, c'est le nombre de calculs à réaliser par ton classeur si tu as une masse de données importante (du genre une dizaine de milliers (c'est un exemple au hazard mais représentatif) de cellules avec la formule index) qui pourraient prendre plusieurs dizaines de secondes voir plusieurs minutes à effectuer à chaque changement de valeurs dans une cellule.

Dans ce cas là il faut faire des boucles en vba avec un contrôle de la valeur qui a changé afin de ne modifier que celle qui nous intéresse. Mais ce sont des lignes de codes supplémentaires à créer et maintenir.
 

Cecinerock

XLDnaute Nouveau
Re : Macros xls "export data entre les feuilles d'un même classeur"

Bonjour,

a dire vrai, je n'arrive pas à comprendre une partie du code
il s'agit du début de la première sous-routine :

Sub newprojectforpeople (onglet As String) --> Pour quoi as tu créé un paramètre "Onglet"

ligne = WorksheetFunction.CountA(Worksheets(onglet).Range("A5:A1000")) + 5 --> que représente ''Ligne" ?
Worksheets(onglet).Cells(ligne, 1) = Worksheets("Raw data").Range("B2")

For i = 2 To WorksheetFunction.CountA(Worksheets(onglet).Rows(5))

Worksheets(onglet).Cells(ligne, i).FormulaR1C1 = "=INDEX(Projects!R1:R1048576,MATCH(RC1,Projects!C2,0),R4C)"

Next Pourrais-tu me dire pour quoi Next n'est pas suivit de "i" ?

'mise en forme --> cellules

Worksheets(onglet).Activate
Worksheets(onglet).Range(Cells(ligne, 1).Address, Cells(ligne, WorksheetFunction.CountA(Worksheets(onglet).Rows(5))).Address).Select

pourrais-tu me décrire l'objectif de ce code en deux ligne ?

merci par avance
 

Nairolf

XLDnaute Accro
Re : Macros xls "export data entre les feuilles d'un même classeur"

Salut,

Sub newprojectforpeople (onglet As String) --> Pour quoi as tu créé un paramètre "Onglet"
Ce paramètre sert à identifier la feuille du classeur qui est traitée de façon automatique.

ligne = WorksheetFunction.CountA(Worksheets(onglet).Range("A5:A1000")) + 5 --> que représente ''Ligne" ?
C'est un index de la ligne à remplir avec les données du nouveau projet dans la fiche personnelle correspondant à la feuille "onglet".

Pourrais-tu me dire pour quoi Next n'est pas suivit de "i" ?
Il n'y a pas d'obligation de mettre le nom de la fin de boucle si tu ne fais pas des sauts de boucles dans ton code, car le prochain next sera la fin de ta boucle for commencée juste avant.

Worksheets(onglet).Activate
Worksheets(onglet).Range(Cells(ligne, 1).Address, Cells(ligne, WorksheetFunction.CountA(Worksheets(onglet).Rows(5))).Address).Select --> pourrais-tu me décrire l'objectif de ce code en deux ligne ?
Ces lignes permettent de sélectionner les cellules auxquelles va être appliqué la mise en forme des bordures (suite du code).
 

Cecinerock

XLDnaute Nouveau
Re : Macros xls "export data entre les feuilles d'un même classeur"

Bonjour Nairolf,

Merci bcp pour tes explications claires :)

Cependant, j'ai d'autres questions sans vouloir abuser

Je pense créer une macro sans formulaire, càd de sorte à ce que les data soient exportées directement de la table brute vers les autres feuilles, sans passer par un userform. Pour ce faire il suffit d'appeler la sub newentry directement, est ce bien ça ?

par ailleurs, tu as écrit la seconde sub comme suite
Sub newpeople()

Worksheets("fiche personnel").Select
Worksheets("fiche personnel").Copy After:=Worksheets(Worksheets.Count)
Worksheets("fiche personnel (2)").Select
Worksheets("fiche personnel (2)").Range("B1") = Worksheets("Table brute").Range("A2")
Worksheets("fiche personnel (2)").Name = Worksheets("Table brute").Range("A2")

Call newprojectforpeople(Worksheets("Table brute").Range("A2"))

End Sub

moi j'ai fait un code qui me permet de créer des feuilles, leur affecter les prénoms des personnes, et enfin d'appeler la mise en forme à appliquer !
le voici :

Sub new_sheet_people()

For i = 1 To 4

Sheets.Add after:=Sheets(Sheets.Count)
Call new_formating_people_2 'macro qui fait la mise forme des fiche personnes

If i = 1 Then
Sheets("Feuil5").Select
Sheets("Feuil5").Name = "Géraldine"

ElseIf i = 2 Then
Sheets("Feuil6").Select
Sheets("Feuil6").Name = "Julien"

ElseIf i = 3 Then
Sheets("Feuil7").Select
Sheets("Feuil7").Name = "Alex"

Else

Sheets("Feuil8").Select
Sheets("Feuil8").Name = "Amandine"

End If

Next i


End Sub

qu'en penses-tu ?

merci par avance

;)
 

Nairolf

XLDnaute Accro
Re : Macros xls "export data entre les feuilles d'un même classeur"

Salut Cecinerock,

Oui, tu peux appeler directement la sub newentry(personne, projet), mais il faut bien penser à renseigner les arguments personne et projet.

Ton code est pas mal mais il est limité, car si tu dois recréer de nouvelles fiches personnelles, tu devras reécrire ton code en t'assurant que le nom des feuilles est bon...

Il est tout à fait possible de faire un mix intéressant entre les deux codes, du genre (code non testé) :
Code:
Sub new_sheet_people()
 
For i = 1 To worksheetapplication.counta(Worksheets("Table brute").Range("A:A"))-1
 
Sheets.Add after:=Sheets(Sheets.Count)
 Call new_formating_people_2 'macro qui fait la mise forme des fiche personnes

 Worksheets(Sheets.Count).Name = Worksheets("Table brute").cells(i+1,1)

Next i

End Sub
 

Cecinerock

XLDnaute Nouveau
Re : Macros xls "export data entre les feuilles d'un même classeur"

re

Merci pour l'intérêt que tu portes à mes questions :)

à dire vrai, il y a deux points qui me semblent pas tout à fait clairs !

1 --> worksheetapplication.counta(Worksheets("Table brute").Range("A:A"))-1
qu'est ce que ça représente ?

2 --> par ça Worksheets("Table brute").cells(i+1,1) tu veux affecter un nom aux feuilles créées, mais par cells(i+1,1) tu veux dire quoi ?

Merci encore
 

Nairolf

XLDnaute Accro
Re : Macros xls "export data entre les feuilles d'un même classeur"

1/ J'ai fait une erreur ce n'est pas worksheetapplication mais WorksheetFunction
En fait CountA dénombre le nombre de cellules non vides d'une plage, ici la colonne A.
Donc ici je dénombre le nombre de personnes nommées dans la "table brute" (le -1 étant là pour retirer l'en-tête du tableau dans le calcul).

2/cells(i+1,1) est un objet range qui permet de pointer sur la cellule de ligne i+1 et de colonne 1. Dans le cas où i = 1, la cellule pointée est A2.
 

Cecinerock

XLDnaute Nouveau
Re : Macros xls "export data entre les feuilles d'un même classeur"

ah ok :) merci

je coince ailleurs ! dslé
je fais une autre sub qui me supprime toute les feuilles à part la source lorsque j'appelle la macro :

Sheets("ACCUEIL").Select
ActiveWindow.SelectedSheets.Delete

Sheets("Feuil4").Select
ActiveWindow.SelectedSheets.Delete

Sheets("Feuil3").Select
ActiveWindow.SelectedSheets.Delete

etc

le problème c'est que j'aurais potentiellement un nombre important de sheets qui commence par NE, quel code pourrais-je utiliser pour indiquer cela ?
ex

if worksheetsfunction LEFT(les noms des feuilles qui restent,2)="NE" then

Sheets(" ").Select
ActiveWindow.SelectedSheets.Delete

et dans ce cas là, suis-je obligé de déclarer les noms des classeurs comme des string ?

100 MERCI :)
 

Nairolf

XLDnaute Accro
Re : Macros xls "export data entre les feuilles d'un même classeur"

Tu n'es pas loin du tout:
Dim feuille As Worksheet
Application.DisplayAlerts = False
For Each feuille In Worksheets
If Left(feuille .Name, 2) = "NE" Then
feuille .Delete
End If
Next feuille
Application.DisplayAlerts = True
 

Discussions similaires

Statistiques des forums

Discussions
312 393
Messages
2 087 964
Membres
103 687
dernier inscrit
olivier72