Création d'une macro
Bonjour le Forum
J'aurais besoin d'un expert en macro/VBA pour m'aider.
Je reçois un tableau toutes les semaines avec un format qui m'est été imposé (plus 400 lignes toutes les semaines)
Ce tableau (qui est dans un onglet) comprend des lignes qui chacune détaille :
- un projet ou une activités ou une tâche
- et pour chaque ligne de projet/activité/ou tâche on a des informations associées, notamment : une date de début, une date de fin, des personnes qui contribuent (il y a 9 personnes identifiées dans 9 colonnes) avec un temps de contribution associé à chacune des 9 personnes, plus des cellules calculées (qui permettent de représenter un planning par semaine)
Mon problème c'est d'avoir plusieurs personnes pour 1 même activité sur 1 même ligne (cellules mises en vert dans mon fichier exemple) alors que j'aurais besoin d'exploiter 1 ligne pour 1 unique personne
Je voudrais donc savoir si c'est possible de faire une macro (ou 2 macro) qui permettent de
- copier à l'identique (ou quasiment : cf précision ci-dessous) chaque ligne de mon tableau source sur un 2° onglet
- mais en dupliquant (n fois) dans le 2° onglet chacune des lignes qui a plus d'1 personne (n personnes) mentionnée dans la ligne source
- en gardant uniquement le temps de contribution de la personne de la ligne considérée (en supprimant les autres temps - c'est l'unique modification à apporter sur la ligne)
je vous joint le modèle de tableau source (onglet 'projet') et le résultat attendu après exécution de la macro (onglet 'projet par ressource aprèsmacro') :
- les lignes en jaune sont les lignes qui seraient ajoutées
- les cellules en rouge les données qui seraient supprimées
A noter je voudrais conserver, lors de la copie, toutes les formules contenues dans toutes les cellules de l'onglet source
(pas obligatoirement les sous-totaux, surtout si c'est plus compliqué)
Je ne sais pas si les explication sont suffisamment claires...
En tout cas je vous remercie par avance pour toute aide !
Tom
Bonjour,
Il y a des éléments dont l'évolution n'est pas explicable lors du passage du tableau initial à ton modèle.
Prenons le projet 1 : activité 1 OK
activité 2 : éclate en 3, la durée (3) éclate aussi en 1 *3, OK ; mais mesure=2 devient 0,25 *3, soit 0,75 au total, ya plus le compte !
activité 3 : durée=1 passe à 0,50 ??? mesure=1 passe à 0,25 ???
activité 4 : durée=1 passe à 0,75 ??? mesure =1 reste à 1 !!!
Cela évolue selon des règles intuitives non transmissibles, donc... je sais pas faire de macro télépathe !!
Bonjour MFerrand
Je vous remercie de vous être penché sur mon sujet !!
j'ai effectivement commis des erreurs 'manuelles' pour construire mon exemple !
- les durées (colonne L) sont des sommes [par exemple durée Li =SOMME(Pi:Xi)] => elles devraient donc changer en fonction de l'éclatement des lignes
- les mesures (colonne M) sont des chiffres qui me parviennent "en dur" => ils ne doivent pas changer mais les cellules de cumul correspondant 'M3' passe de la valeur 7 à 11 ==> on peut laisser comme ça car je ne m'occupe pas de ces valeurs et je ne sait pas les ventiler pour l'instant
j'ai corriger mon fichier exemple - j'espère que c'est correct maintenant. Mais le principe est bien celui décrit ci-dessus
Je vous remercie par avance !
PS : mon problème principal n'est pas sur les cellules de cumul (je ferai des cumuls exacts avec un TableauCroiséDynamique) mais bien sur l'éclatement des lignes et des valeurs par personne (colonnes R1 à R9)
Tom
Je ne suis pas bien réveillé mais teste ceci :
Sub DupliRéorgProjet()
Dim Pers As Range, Proj As Range, k%, i%, np%
Worksheets("Projet").Copy after:=Worksheets("Projet")
With ActiveSheet
Set Pers = .Range("P2:X2")
Set Proj = .Range("D2")
i = 1
Do
If Proj.Offset(i, -3) = "" Then
np = WorksheetFunction.CountA(Pers.Offset(i))
If np > 1 Then
With Pers.Offset(i)
For k = 9 To 1 Step -1
If .Cells(1, k) <> "" Then
Proj.Offset(i + 1).EntireRow.Insert
Proj.Offset(i).EntireRow.Copy Proj.Offset(i + 1, -3)
Pers.Offset(i + 1).ClearContents
.Cells(2, k) = .Cells(1, k)
.Cells(1, k).ClearContents
np = np - 1
If np = 1 Then Exit For
End If
Next k
End With
End If
End If
i = i + 1
Loop While Proj.Offset(i) <> ""
End With
End SubTu lances la macro par la boîte de dialogue macro. Tu vérifies le résultat (je n'ai pas les yeux en face des trous encore !)
Cordialement.
Bonsoir MFerrand
Trop fort !
ça fonctionne parfaitement sur le fichier exemple ! Merci !!!!!
Je viens de l'appliquer sur un fichier source et je m'aperçois qu'il s'arrête avant la fin car j'ai des lignes vides de temps à autre
=> si je supprime toutes les lignes vides : le traitement s'applique sur tout le fichier
je n'ai pas compris commet est fait le test d'arrêt dans le code VBA.... Peut-être la commande Loop While Proj.Offset(i) <> ""
Sans vouloir abuser ...
- serait-il possible d'ajouter un code qui teste si 5 lignes successives sont vides (5 c'est pour être sûr sûr qu'on est au bout du fichier) avant de s'arrêter ?
- ou bien une macro qui supprime toutes les lignes vides en amont du traitement actuel ???
Je vous remercie déjà infiniment ! C'est grandiose pour moi !
je clique sur le bouton 'résolu' dès votre réponse
Le système est simple : on duplique la feuille, ce qui conserve formules et formats. On affecte à des variables 2 plages de référence, sur la ligne d'en-tête, pour atteindre toutes les lignes par décalage (Offset) : la plage "personnel" testée pour insertion de ligne... et D2, justement pour l'arrêt car la colonne D était la seule ne comportant pas de vides...
S'il y en a, tester en amont comporte les même risques...
Essaie avec cette modification :
Loop While WorksheetFunction.CountA(Proj.Offset(i).Resize(20)) > 0Le test d'arrêt se fait sur l'absence de valeurs sur la plage de 20 lignes qui suivent (toujours en colonne D). Cela devrait aller !
Cordialement.
Grand Maître !
Problème résolu !!