Réalisé une macro en fonction du nom

Résolu/Fermé
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016 - Modifié par Akre66 le 21/04/2015 à 13:40
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016 - 23 avril 2015 à 11:09
Bonjour,
Je suis à ma 2eme macro donc je suis assez jeune dans la VBA.
J'ai realisé une macro il y a un mois. Mais je cherche à l'optimiser.
Dans un fichier excel, des gens "imputent" leurs heures sur des différents projets. Chaque individus appartient à une section, avec un chef.
Le chef doit imputer ses heures en fonction des heures imputé par son equipe.

Exemple

Equipe A:
Projet 1: 500 heures
Projet 2: 300 heures
Projet 3: 200 heures

Du coup le chef impute 50% sur le projet 1, 30 et 20 sur le 2 et 3.

Alors pour l'instant ma macro récupéré bien les noms des projets, leurs descriptions, leurs heures puis pondère. Mais j'ai des difficultés sur un point.
L'opérateur doit rentrer un nom (à partir d'un menu déroulant) que ma macro associe à une équipe, donc à une liste de personne. Et du coup je dois réaliser ce que j'ai fait avec mon début de macro, mais uniquement pour les membres de l'équipe sélectionné.
Et là je plante... Du coup si vous avez une idée.
J'ai commencé à tester la présence du nom de famille (j'ai que ça) dans la colonne A (où sont les noms complets), si le test est bon je copie la ligne sur une nouvelle feuille nommé du nom de l'équipe... Pour après lancer ma macro sur cette nouvelle feuille.
Je me doute bien que c'est pas du tout bien niveau temps et tout... Mais j'ai pas trop d'idée.
Voilà ma macro :


Option Explicit

Sub Imputation()

'Declaration des variables

Dim CellActive As Range
Dim Celltowrite As Range
Dim Cell_test As Range
Dim celluletrouvee As Range
Dim Cell As Range, Cell_nom As Range
Dim Plage As Range, Plage_nom As Range
Dim Membre As Range
Dim Trouve As Range

Dim FSource As Worksheet
Dim FCible As Worksheet
Dim FCible_bis As Worksheet
Dim Feuille As Worksheet

Dim Un As Collection
Dim Deux As Collection



Dim ssdoublon()

Dim Section As String
Dim Nom As String
Dim Description As String
Dim Nom_bis As String

Dim dl As Long, dl_bis As Long
Dim Heure As Long
Dim Dec As Long
Dim Sum As Long
Dim Colonne As Long
Dim b As Long
Dim i As Long, n_ligne As Long, a As Long
Dim num_ligne As Long




'On récupère les valeurs données par l'opérateur
'Feuille Source
Set FSource = Worksheets("Cmd")
Section = FSource.Range("B2").Value


For i = 1 To Worksheets.Count
If Worksheets(i).Name = Section Then
Sheets(Section).Delete
End If
Next i

Sheets.Add Worksheets(1)
Sheets(1).Name = Section

Set FCible_bis = Worksheets(Section)

'On récupère la liste des membres
Set FCible = Worksheets("Ar_plan")

'On va parcourir la liste des sections
Set celluletrouvee = FCible.Range("A2:Z2").Find(Section, LookAt:=xlWhole)

If celluletrouvee Is Nothing Then
MsgBox ("Pas trouvé de section")
Else
Colonne = celluletrouvee.Column
End If

'On va parcourir la liste des membres
b = 0

Set Plage = FCible.Range(celluletrouvee, celluletrouvee.End(xlDown)).Rows
For Each Membre In Plage
Nom = Membre.Value
'MsgBox (Membre.Value)

'On formate le nom
Nom_bis = Mid(Nom, 3, Len(Nom))

FSource.Cells(20 + b, 20) = Nom_bis


'On va chercher les valeurs données
'Feuille Cible
Set FCible = Worksheets("DATA")


Set Plage = FCible.Columns("A")

For Each Cell_nom In Plage
' If Cell_nom.Text Like ("*" & Nom_bis & "*") Then
If Cell_nom.Text Like ("Mlle MAUD BLANDIN") Then
MsgBox ("BRAVO")
FCible.Rows(Cell_nom.Row).Select
Selection.Copy
Worksheets(Section).Cells(num_ligne, 1).Select
Selection.Paste
num_ligne = num_ligne + 1
End If
Next Cell_nom


'On va prendre uniquement les membres de la section

With ActiveSheet
dl = FCible.Range("D" & .Rows.Count).End(xlUp).Row
End With
Set Plage = FCible.Range("D2:D" & dl)
Set Un = New Collection
On Error Resume Next

'On parcourt la plage de donnée
For Each Cell In Plage
If Cell <> "" Then Un.Add Cell, CStr(Cell) 'Si la valeur est différent des autres on la prends sinon on passe
Next Cell




For i = 1 To Un.Count
ReDim Preserve ssdoublon(i - 1)
ssdoublon(i - 1) = Un.Item(i)
Next i

Heure = 0 'on inialise

For i = 0 To UBound(ssdoublon)
' MsgBox ssdoublon(i)
' à la place remplis ta listbox
'On ecrit le projet sur notre ligne de sortie

n_ligne = 2
'Set Celltowrite = FSource.Cells(n_ligne, 1)
FSource.Cells(n_ligne + i, 5) = ssdoublon(i)

Sum = 0 'on initalise
For Each Cell In Plage
If Cell = ssdoublon(i) Then Sum = Sum + Cell.Offset(0, 2).Value
'Si le projet est le bon on récupère son heure
If Cell = ssdoublon(i) Then Description = Cell.Offset(0, 1).Value

Next Cell
'On écrit la somme des heures travaillées sur un projet
FSource.Cells(n_ligne + i, 6) = Description
FSource.Cells(n_ligne + i, 7) = Sum
'On somme les heures (pour avoir la somme des heures totales)
Heure = Heure + Sum

Next i
'On écrit la somme des heures travaillées
FSource.Cells(n_ligne + i, 7) = Heure

For a = 0 To i
'On caclule les pourcentages et on l'écrit
FSource.Cells(n_ligne + a, 8) = FSource.Cells(n_ligne + a, 7) / Heure
'On calcule le nombre d'heure à impuer et on l'écrit
FSource.Cells(n_ligne + a, 9) = FSource.Cells(n_ligne + a, 8) * FSource.Cells(2, 3)

'On va arrondir les valeurs
FSource.Cells(n_ligne + a, 10) = Round(FSource.Cells(n_ligne + a, 9))
Next a

Sum = 0
Heure = 0

'On va calculer les sommes
For a = 0 To i - 1
Sum = Sum + FSource.Cells(n_ligne + a, 8)
Heure = Heure + FSource.Cells(n_ligne + a, 9)
Next a
'On les écrit
FSource.Cells(a + 2, 9) = Sum
FSource.Cells(a + 2, 9) = Heure
FSource.Cells(a + 2, 5) = "Total"


Set Un = Nothing


'On passe à la personne suivante
b = b + 1
Next Membre

End Sub



Merci de votre aide,
Si besoin je peux vous donner un modèle du fichier excel, mais ça sera pas le vrai.

Après je me demande comment je pourrai trier mon tableau de sortie dans l'ordre croissant des heures à mettre la colonne J.


EDIT:
Alors j'arrive pas à comparer la cellule et les noms, ça marche pas ! Je comprends pas ! Je vise bien la bonne cellule (j'ai testé), quand je remplace le nom par "a" et (mets "a" dans le colonne) ça marche pas...donc l'erreur vient de mon like mais je vois pas pourquoi.


EDIT2:
Je crois voir mon erreur...j'ai mis Cell_nom.text alors que normalement c'est "value" qui m'interrèse. Mais il y a une incomptabilité du coup dans le like si je prendre "value"... Bref je suis perdu



3 réponses

Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
22 avril 2015 à 08:54
Résolu comme un grand :)
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
Modifié par borntobealive le 22/04/2015 à 09:37
explique-nous ça pourra toujours servir à quelqu'un
0
Utilisateur anonyme
22 avril 2015 à 09:49
Bonjour

Tu nous a signalé que le souci était résolu.

La règle sur les forums est que tu viennes nous expliquer comment tu as fait pour que ça puisse servir peut-être à d'autres personnes...

Merci d'avance,
Strumpfette, modératrice.
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
Modifié par Akre66 le 23/04/2015 à 10:22
Ok désolé j'avais oublié.
Bon j'ai pas mal fait de modification sur la macro de départ.

Pour faire simple j'ai fait les processus suivants:
-Lire le nom du chef
-Chercher ce nom dans une plage (dans une feuille que j'ai moi même ecrit pour y associer Chef-Section-Membres)
-Lire un par le nom des membres (format "P.NOM")
-Je sépare cette cellule pour avoir juste "NOM"

'On formate le nom
Nom_bis = Mid(Nom, 3, Len(Nom))


-Je parcours la colonne "A" de la feuille ou sont contenus mes informations et test si le nom de famille correspond (format des noms de celle colonnes sont "M. PRENOM NOM"). J'utilise donc "LIKE". Si c'est bon je copie/colle dans une feuille « tampon » (je la supprime après).
'On parcourt tous les noms
For NoLig = 1 To FCible.UsedRange.Rows.Count
Var = FCible.Cells(NoLig, NoCol)
'Si le nom correspond à un membre de l'équipe alors on copie la ligne
If Var Like ("* " & Nom_bis) Then
FCible.Rows(NoLig).Copy Destination:=FCible_bis.Cells(num_ligne, 1)
num_ligne = num_ligne + 1
End If
Next
'On passe à la personne suivante
b = b + 1
num_ligne = num_ligne + 1
Next Membre


Alors je pense bien que le fait de copier/coller soit gourmand. Je sais qu'il y a moyen d'optimiser ça. Mais je voulais avoir la feuille tampon, pour la vérification, le debug et surtout je l'avoue j'avais déjà une macro pour réaliser ça sur une feuille spécfique.
Après je reste un novice sur VBA, donc si vous avez des suggestions à faire n'hésitez pas. Je vous met ma macro complète (j'ai d'autre trucs).
Merci :)


Option Explicit

Sub Imputation()

'Declaration des variables

Dim celluletrouvee As Range
Dim Cell As Range, Cellnom As Range
Dim Plage As Range, Plage_nom As Range
Dim Membre As Range


Dim FSource As Worksheet
Dim FCible As Worksheet
Dim FCible_bis As Worksheet

Dim Un As Collection


Dim ssdoublon()

Dim Section As String
Dim Nom As String
Dim Description As String
Dim Nom_bis As String
Dim Tampon As Long

Dim dl As Long, dl_bis As Long
Dim Heure As Long
Dim Dec As Long
Dim Sum As Long
Dim Colonne As Long
Dim b As Long
Dim i As Long, n_ligne As Long, a As Long
Dim num_ligne As Long

Dim Condition As Integer
Dim NoLig As Long, Var As Variant
Dim NoCol As Integer


'On récupère les valeurs données par l'opérateur
'Feuille Source
Set FSource = Worksheets("Cmd")
Section = FSource.Range("B2").Value

'Pour eviter les alertes
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With

'On récupère le nom de la section
Sheets.Add Worksheets(1)
'On crée la feuille tampon
Sheets(1).Name = "tampon"
Set FCible_bis = Worksheets("tampon")

'On récupère la liste des membres
Set FCible = Worksheets("Ar_plan")

'On va parcourir la liste des sections
Set celluletrouvee = FCible.Range("A2:Z2").Find(Section, LookAt:=xlWhole)

'On envoie un message d'erreur si on trouve rien
If celluletrouvee Is Nothing Then
MsgBox ("Pas trouvé de section")
Else
'Sinon on se concentre sur cette colonne
Colonne = celluletrouvee.Column
End If

'On va introduire nos conditions(pour la suite)
Condition = 0
If Section = "Un" Then Condition = 1
If Section = "Deux" Then Condition = 2


'On va parcourir la liste des membres
b = 0
num_ligne = 1

Set Plage = FCible.Range(celluletrouvee, celluletrouvee.End(xlDown)).Rows
For Each Membre In Plage
Nom = Membre.Value
'MsgBox (Membre.Value)

'On formate le nom
Nom_bis = Mid(Nom, 3, Len(Nom))


'On va prendre uniquement les membres de la section
'Feuille Cible
Set FCible = Worksheets("DATA")
'On initalise
NoCol = 1 'lecture de la colonne 1

'On parcourt tous les noms
For NoLig = 1 To FCible.UsedRange.Rows.Count
Var = FCible.Cells(NoLig, NoCol)
'Si le nom correspond à un membre de l'équipe alors on copie la ligne
If Var Like ("* " & Nom_bis) Then
FCible.Rows(NoLig).Copy Destination:=FCible_bis.Cells(num_ligne, 1)
num_ligne = num_ligne + 1
End If
Next
'On passe à la personne suivante
b = b + 1
num_ligne = num_ligne + 1
Next Membre



'On va étudier les études de la section
Set FCible = Worksheets("tampon")

'On efface les données précédentes
FSource.Range("E:J").Clear

'On associe les valeurs à nos colonnes
FSource.Cells(1, 5) = "NOM OTP"
FSource.Cells(1, 6) = "Description"
FSource.Cells(1, 7) = "Heure d'étude"
FSource.Cells(1, 8) = "Pondération"
FSource.Cells(1, 9) = "Heure à imputer"
FSource.Cells(1, 10) = "Arrondi"

'On cherche la dernière ligne
With ActiveSheet
dl = FCible.Range("D" & .Rows.Count).End(xlUp).Row
End With
'On défini la nouvelle plage
Set Plage = FCible.Range("D1:D" & dl)
Set Un = New Collection
On Error Resume Next

'On parcourt la plage de donnée
'On réalise le liste des études sans doublon
For Each Cell In Plage
If Cell <> "" And Not IsEmpty(Cell) Then Un.Add Cell, CStr(Cell) 'Si la valeur est différent des autres on la prends sinon on passe
Next Cell

For i = 0 To Un.Count
ReDim Preserve ssdoublon(i)
ssdoublon(i) = Un.Item(i)
Next i

Heure = 0 'on inialise

For i = 0 To UBound(ssdoublon)
If ssdoublon(i) Like "*.*" Then
' à la place remplis ta listbox
'On ecrit le projet sur notre ligne de sortie
n_ligne = 1

FCible_bis.Cells(n_ligne + i, 10) = ssdoublon(i)

Sum = 0 'on initalise
For Each Cell In Plage
If Cell = ssdoublon(i) Then Sum = Sum + Cell.Offset(0, 2).Value
'Si le projet est le bon on récupère son heure
If Cell = ssdoublon(i) Then Description = Cell.Offset(0, 1).Value
Next Cell


'On écrit la somme des heures travaillées sur un projet
FCible_bis.Cells(n_ligne + i, 11) = Description

FCible_bis.Cells(n_ligne + i, 12) = Sum
End If
Next i


'On va trier ce tableau

FCible_bis.Range("J:L").Select
Selection.Sort Key1:=Range("L2"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal


b = 2
Heure = 0

For NoLig = 1 To FCible_bis.Range("J1").End(xlDown).Row
If Condition = 2 Then
If Not FCible_bis.Cells(NoLig, 10) Like "F.*" Then
FCible_bis.Cells(NoLig, 10).Copy Destination:=FSource.Cells(b, 5)
FCible_bis.Cells(NoLig, 11).Copy Destination:=FSource.Cells(b, 6)
FCible_bis.Cells(NoLig, 12).Copy Destination:=FSource.Cells(b, 7)
Heure = Heure + FCible_bis.Cells(NoLig, 12).Value
b = b + 1
End If
End If

If Condition < 2 Then
FCible_bis.Cells(NoLig, 10).Copy Destination:=FSource.Cells(b, 5)
FCible_bis.Cells(NoLig, 11).Copy Destination:=FSource.Cells(b, 6)
FCible_bis.Cells(NoLig, 12).Copy Destination:=FSource.Cells(b, 7)
Heure = Heure + FCible_bis.Cells(NoLig, 12).Value
b = b + 1
End If
Next NoLig



For a = 0 To i - 1

'On caclule les pourcentages et on l'écrit
FSource.Cells(n_ligne + a, 8) = FSource.Cells(n_ligne + a, 7) / Heure

'On calcule le nombre d'heure à impuer et on l'écrit
FSource.Cells(n_ligne + a, 9) = FSource.Cells(n_ligne + a, 8) * FSource.Cells(2, 3)

'On va arrondir les valeurs
FSource.Cells(n_ligne + a, 10) = Round(FSource.Cells(n_ligne + a, 9))
Next a


If Condition > 0 Then
'Condition pour alpha et beta
For NoLig = 0 To FSource.Range("J1").End(xlDown).Row
If FSource.Cells(NoLig, 10).Value = 0 Then
FSource.Cells(NoLig, 10) = ""
FSource.Cells(NoLig, 9) = ""
FSource.Cells(NoLig, 8) = ""
FSource.Cells(NoLig, 7) = ""
FSource.Cells(NoLig, 6) = ""
FSource.Cells(NoLig, 5) = ""
End If
Next NoLig
End If

Sum = 0
Heure = 0

'On va calculer les sommes
For a = 1 To FSource.Range("E1").End(xlDown).Row - 1
Sum = Sum + FSource.Cells(n_ligne + a, 7)
Heure = Heure + FSource.Cells(n_ligne + a, 10)
Next a


'On les écrit
FSource.Cells(a + 1, 7) = Sum
FSource.Cells(a + 1, 10) = Heure
FSource.Cells(a + 1, 5) = "Total"


Set Un = Nothing
Sheets("tampon").Delete
Application.ScreenUpdating = True

End Sub




0
Utilisateur anonyme
23 avril 2015 à 10:23
Merci d'être revenu et de ton message:)
Bonne continuation :)
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 avril 2015 à 11:09
Avec plaisir :)
Je pense à très bientot pour de nouvelles aventures
0