XL 2016 Remplir un planning en fonction de 2 données

Ralf94

XLDnaute Nouveau
Bonjour,

Je suis novice en Excel, et je galère depuis quelques jours sur mon fichier.
Je vais joindre à ma demande, le fichier comme ça, ça sera plus parlant, avec une photo du résultat escompté.

Je voudrais savoir comment faire pour marquer sur ma feuille "planning case" un numéro, qui correspondra à l'une des prestations qui sont sur la feuille "Avancement" ex: faïence=1 ; élec=2;..., en fonction de la personne qui se trouve dans la feuille "avancement" et de la date inscrite à coter et par rapport au travail.

Je vous remercie pour votre aide.
 

Pièces jointes

  • aide.xlsx
    188 KB · Affichages: 91
  • resultat escompte.png
    resultat escompte.png
    119.1 KB · Affichages: 42

Ralf94

XLDnaute Nouveau
c'est pour commencer à la ligne 4 de ton tableau
pour i=1 -->i+3=4

Bonjour,
Tu dois me prendre pour un nul (c'est le cas lol) mais je dois insérer 3 lignes en haut du planning donc j'ai changer ces 4 lignes, (en souligner la partie modifier)
-With Sheets("Planning case").Range("b11").Resize(NbPersonnes, 125)
-Set ici = .Range("A11").Resize(NbPersonnes).Find(Employé, lookat:=xlWhole)
-
If Debut <> "" Then
Set Dela = .Rows(10).Find(Debut, LookIn:=xlValues)
-
If Fin <> "" Then
Set ALa = .Rows(10).Find(Fin, LookIn:=xlValues)

Mais un message me dis qu'il y a un problème dès la première ligne modifier je ne comprend pas j'ai bien tout modifier comme tu me l'as expliqué...

Merci pour ton aide.
 

vgendron

XLDnaute Barbatruc
Hello
pour éviter ces problèmes d'indice à modifier un peu partout, j'en ai fait des variables qu'il te suffit d'initialiser à la bonne valeur en début de code
VB:
Sub planning()
PremiereLignePlanning = 7 '=ligne de titre
PremiereLigneAvancement = 3 '=ligne de titre
LastCol = 125 'Nombre de colonnes "Semaines" de la feuille "Planning Case" = colonne DV - Colonne A =126-1


NbPersonnes = Sheets("Avancement").Range("A" & Rows.Count).End(xlUp).Row - PremiereLigneAvancement 'dans la feuille avancement colonne A, récupère le numéro de la dernière ligne NON vide  et -3 (première ligne commence à 3) pour en déduire le nombre de personnes
With Sheets("Planning case").Range("B" & PremiereLignePlanning + 1).Resize(NbPersonnes, LastCol) 'dans la feuille Planning, on sélectionne le tablo qui commence en B8 - sur NbPersonnes lignes et 125 colonnes
    .ClearContents 'on efface le contenu
    With .Interior 'et on remet le remplissage de couleur à vide
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End With

For i = 1 To NbPersonnes 'pour chaque personne
    Employé = Sheets("Avancement").Range("A" & i + PremiereLigneAvancement) 'on récupère le nom de l'employé
    With Sheets("Planning case") 'on le cherche dans la colonne A du Planning (utile si les noms ne sont pas triés
        Set ici = .Range("A" & PremiereLignePlanning + 1).Resize(NbPersonnes).Find(Employé, lookat:=xlWhole)
        If Not ici Is Nothing Then
            Ligne = ici.Row 'on récupère son numéro de ligne
        End If
    End With
   
    For j = 3 To 9 Step 2 ' on est dans la feuille Avancement: on se déplace de la colonne 3 (C) à 9 (I) par pas de 2: C - E - G - I
        Atelier = Sheets("Avancement").Cells(1, j) 'on récupère le numéro de l'atelier sur la ligne 1
        couleur = Sheets("Avancement").Cells(1, j).Interior.ColorIndex 'on récupère la couleur
        Debut = Sheets("Avancement").Cells(i + 3, j) 'on récupère le début de l'activité
        Fin = Sheets("Avancement").Cells(i + 3, j + 1) 'on récupère la fin de l'activité
       
        With Sheets("Planning case") 'dans la feuille Planning
            If Debut <> "" Then 'si Debut n'est pas vide
                Set Dela = .Rows(PremiereLignePlanning).Find(Debut, LookIn:=xlValues) 'on cherche la date de début sur la ligne 7
                If Not Dela Is Nothing Then
                    ColDebut = Dela.Column 'on récupère la colonne
                Else: Exit For
                End If
            End If
            If Fin <> "" Then 'si Fin n'est pas vide
                Set ALa = .Rows(PremiereLignePlanning).Find(Fin, LookIn:=xlValues) 'on cherche la date de Fin sur la ligne 7
                If Not ALa Is Nothing Then
                    ColFin = ALa.Column 'on récupère la colonne
                Else: Exit For
                End If
            Else: ColFin = ColDebut 'si on avait une seule date, on met la fin = début
            End If
            If Debut <> "" Then
                .Cells(Ligne, ColDebut) = Atelier 'on place le numéro de l'atelier
                .Cells(Ligne, ColDebut).Interior.ColorIndex = couleur 'et sa couleur
            End If
            If ColDebut <> ColFin Then 'si on a une DUREE d'activité, on recopie sur toute la durée atelier et couleur
                .Range(.Cells(Ligne, ColDebut), .Cells(Ligne, ColFin)).FillRight
                .Range(.Cells(Ligne, ColDebut), .Cells(Ligne, ColFin)).Interior.ColorIndex = couleur
            End If
        End With
    Next j
Next i
End Sub

Donc si tu ajouttes 3 lignes dans la feuille Planning AU DESSUS du planning, la ligne de titre passe de 7 à 10: il te suffit de modifier uniquement cette valeur en début de code et tu lances
 

Ralf94

XLDnaute Nouveau
Hello
pour éviter ces problèmes d'indice à modifier un peu partout, j'en ai fait des variables qu'il te suffit d'initialiser à la bonne valeur en début de code
VB:
Sub planning()
PremiereLignePlanning = 7 '=ligne de titre
PremiereLigneAvancement = 3 '=ligne de titre
LastCol = 125 'Nombre de colonnes "Semaines" de la feuille "Planning Case" = colonne DV - Colonne A =126-1


NbPersonnes = Sheets("Avancement").Range("A" & Rows.Count).End(xlUp).Row - PremiereLigneAvancement 'dans la feuille avancement colonne A, récupère le numéro de la dernière ligne NON vide  et -3 (première ligne commence à 3) pour en déduire le nombre de personnes
With Sheets("Planning case").Range("B" & PremiereLignePlanning + 1).Resize(NbPersonnes, LastCol) 'dans la feuille Planning, on sélectionne le tablo qui commence en B8 - sur NbPersonnes lignes et 125 colonnes
    .ClearContents 'on efface le contenu
    With .Interior 'et on remet le remplissage de couleur à vide
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End With

For i = 1 To NbPersonnes 'pour chaque personne
    Employé = Sheets("Avancement").Range("A" & i + PremiereLigneAvancement) 'on récupère le nom de l'employé
    With Sheets("Planning case") 'on le cherche dans la colonne A du Planning (utile si les noms ne sont pas triés
        Set ici = .Range("A" & PremiereLignePlanning + 1).Resize(NbPersonnes).Find(Employé, lookat:=xlWhole)
        If Not ici Is Nothing Then
            Ligne = ici.Row 'on récupère son numéro de ligne
        End If
    End With
  
    For j = 3 To 9 Step 2 ' on est dans la feuille Avancement: on se déplace de la colonne 3 (C) à 9 (I) par pas de 2: C - E - G - I
        Atelier = Sheets("Avancement").Cells(1, j) 'on récupère le numéro de l'atelier sur la ligne 1
        couleur = Sheets("Avancement").Cells(1, j).Interior.ColorIndex 'on récupère la couleur
        Debut = Sheets("Avancement").Cells(i + 3, j) 'on récupère le début de l'activité
        Fin = Sheets("Avancement").Cells(i + 3, j + 1) 'on récupère la fin de l'activité
      
        With Sheets("Planning case") 'dans la feuille Planning
            If Debut <> "" Then 'si Debut n'est pas vide
                Set Dela = .Rows(PremiereLignePlanning).Find(Debut, LookIn:=xlValues) 'on cherche la date de début sur la ligne 7
                If Not Dela Is Nothing Then
                    ColDebut = Dela.Column 'on récupère la colonne
                Else: Exit For
                End If
            End If
            If Fin <> "" Then 'si Fin n'est pas vide
                Set ALa = .Rows(PremiereLignePlanning).Find(Fin, LookIn:=xlValues) 'on cherche la date de Fin sur la ligne 7
                If Not ALa Is Nothing Then
                    ColFin = ALa.Column 'on récupère la colonne
                Else: Exit For
                End If
            Else: ColFin = ColDebut 'si on avait une seule date, on met la fin = début
            End If
            If Debut <> "" Then
                .Cells(Ligne, ColDebut) = Atelier 'on place le numéro de l'atelier
                .Cells(Ligne, ColDebut).Interior.ColorIndex = couleur 'et sa couleur
            End If
            If ColDebut <> ColFin Then 'si on a une DUREE d'activité, on recopie sur toute la durée atelier et couleur
                .Range(.Cells(Ligne, ColDebut), .Cells(Ligne, ColFin)).FillRight
                .Range(.Cells(Ligne, ColDebut), .Cells(Ligne, ColFin)).Interior.ColorIndex = couleur
            End If
        End With
    Next j
Next i
End Sub

Donc si tu ajouttes 3 lignes dans la feuille Planning AU DESSUS du planning, la ligne de titre passe de 7 à 10: il te suffit de modifier uniquement cette valeur en début de code et tu lances

Pourquoi n'est-il pas possible de de reprendre la formule sur un autre fichier je m'explique j'ai créer un autre fichier et je n'arrive pas à m'adapter je vais joindre le fichier peux-tu m'expliquer pourquoi sa ne fonctionne pas.
merci beaucoup
 

Pièces jointes

  • Classeur1.xlsm
    321.4 KB · Affichages: 25

vgendron

XLDnaute Barbatruc
Alors.. de ce que je viens de lire ici et ailleurs.. la recherche de date avec la méthode Find.. c'est la m.....
1) il faut "transformer" les dates dans leur format natif (= standard) pour s'affranchir du format d'affichage
27/11/2017 --->43066

2) ensuite.. normalement, c'set facile. sauf que dans dans ton cas.. les dates de la feuille planning proviennent de formules SAUF la première en F10
et ca. ca n'aide pas. et pas trouvé la solution; à part de faire un copier collerspecial valeur de toute la ligne 10
cf PJ
 

Pièces jointes

  • Classeur1 (3).xlsm
    345.2 KB · Affichages: 18

Ralf94

XLDnaute Nouveau
Alors.. de ce que je viens de lire ici et ailleurs.. la recherche de date avec la méthode Find.. c'est la m.....
1) il faut "transformer" les dates dans leur format natif (= standard) pour s'affranchir du format d'affichage
27/11/2017 --->43066

2) ensuite.. normalement, c'set facile. sauf que dans dans ton cas.. les dates de la feuille planning proviennent de formules SAUF la première en F10
et ca. ca n'aide pas. et pas trouvé la solution; à part de faire un copier collerspecial valeur de toute la ligne 10
cf PJ
Bonsoir,
Je n'avais pas eu le temps de vous remerciez.

Par contre tout fonctionnais bien et d'un jour à l'autre sa à bugger pouvez-vous encore m'aider?
La ligne pour récupérer la couleur peut être retirer car j'ai fait une mise en forme car les couleurs recopier n'était pas vraiment les même.
Encore merci.
 

Pièces jointes

  • Classeur1.xlsm
    401.2 KB · Affichages: 13

vgendron

XLDnaute Barbatruc
Salut..
au hasard.. ca s'est mis à bugger au moment où les colonnes de Nom des deux feuilles sont devenues des formules qui vont chercher les listes de noms dans un autre fichier...celui ci (Avancement + Balances + Suivi macro.xlsm)

voir PJ pour correction
 

Pièces jointes

  • Classeur1 (4).xlsm
    437.6 KB · Affichages: 20

Discussions similaires