Comment trouver les gens en conge

La Vouivre

XLDnaute Occasionnel
Bonjour les amis du forum,
je viens encore vous demander de l’aide car je bute complétement sur un sujet.
Comment trouver les gens en congé sur le planning,
J’aimerais avoir la liste du personnel en congé du mois dans une liste sur mon Userform
Avec un combobox je fais défiler les différents poste occuper par le personnel, quand je sélectionne un poste j’aimerai avoir la liste du personnel du mois correspondant en liste sur mon Userform ,
Je ne sais pas si c’est une zone de texte ou une listbox pour afficher la liste du personnel, est je ne suis pas assez expérimenté pour le faire complétement.
En sachant qu’une personne peut prendre soit 1 jour de congé ou plusieurs
Si je pouvais avoir une liste du genre

Pierre et en congé le 02, 05 /01/2015
Fred et en congé le 02,08,09,10,11,12,15,16,17,18,19,/01/2015

Je pense qu’il me faudra un userform par mois et recopier la macro sur chaque feuille pour que cela fonctionne
Pouvez-vous m’aider à faire le code
Par avance merci beaucoup pour votre aide
 

Pièces jointes

  • plannig.xlsm
    145.3 KB · Affichages: 54
  • plannig.xlsm
    145.3 KB · Affichages: 55
  • plannig.xlsm
    145.3 KB · Affichages: 56

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Comment trouver les gens en conge

Bonsoir La Vouivre,

personne ce soir pour m'aider?
ce petit message pour relancer ma question
bonne soirée à tous

Minute papillon ! :):D

Un essai dans le fichier joint:

  • les congé s'affichent sur les feuilles des mois à partir de la ligne 45
  • la mise à jour est faite quand on active une feuille de mois (à condition que les mois soient bien écrits notamment avec les accents)
  • la mise à jour est aussi réalisée quand on modifie le planning
  • il y a du code dans le module de ThisWorkbook et dans module2

Le code principal dans module2:
VB:
Sub AfficherCongé(sh As Worksheet)
Dim Tablo, N, res() As Variant, i&, j&, p&
  With sh
    If IsDate("1 " & sh.Name & " 2000") Then
      N = .Range("a4").End(xlDown).Row
      Tablo = .Range("a2:ca" & N).Value
      ReDim res(1 To 26, 1 To 2)
      For j = 2 To 79 Step 3
        If Len(Tablo(1, j)) > 1 Then
          p = p + 1
          res(p, 1) = Tablo(1, j)
          For i = 3 To UBound(Tablo)
            If Tablo(i, j) = "congé payé" Then
              res(p, 2) = res(p, 2) & ", " & Day(Tablo(i, 1))
            End If
          Next i
          If Len(res(p, 2)) > 0 Then res(p, 2) = Mid(res(p, 2), 3)
        End If
      Next j
      res = Application.Transpose(res)
      ReDim Preserve res(1 To 2, 1 To p)
      res = Application.Transpose(res)
      .Range("a45").Resize(p, 2) = res
    End If
  End With
End Sub
 

Pièces jointes

  • La Vouivre-planning- v1.xlsm
    171.7 KB · Affichages: 43

La Vouivre

XLDnaute Occasionnel
Re : Comment trouver les gens en conge

Alors là bravo monsieur
Chapeau bas ,je m'incline ,c'est ce que je cherche ,une seule réponse est c'est tout bon ,vous êtes vraiment formidable .
Si je peu encore abuser de votre bonté et de votre grand savoir en VBA ,pourriez-vous me mettre quelques lignes d'explication avec votre code ,ce serait me rendre service que de m'expliquer comment il fonctionne.
un proverbe chinois dit
un homme qui à faim si tu lui donnes du poisson il aura toujours faim ,
mais si tu lui apprends à pêcher il n'aura plus jamais faim

bonne soirée et merci beaucoup pour ce code
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Comment trouver les gens en conge

Bonjour La Vouivre,
(...) pourriez-vous me mettre quelques lignes d'explication avec votre code ,ce serait me rendre service que de m'expliquer comment il fonctionne.
un proverbe chinois dit
un homme qui à faim si tu lui donnes du poisson il aura toujours faim ,
mais si tu lui apprends à pêcher il n'aura plus jamais faim (...)

Quelques commentaires pour appâter l'ablette. C'est plus long à faire que de créer le code :eek::)

VB:
Sub AfficherCongé(sh As Worksheet)
Dim Tablo, N, RES() As Variant, i&, j&, p&
  With sh    'avec la feuille "sh"
    ' On teste si le nom de la feuille est un mois valide.
    ' Pour cela on construit la chaine " 1 mois 2000"
    ' où mois est le nom de la feuille sh.
    ' Si l'expression représente une date, alors la feuille
    ' est une feuille de mois.
    ' Ex 1: "1 Février 2000" est une date valide
    ' Ex 2: "1 Personnel 2000" n'est pas une date valide
    If IsDate("1 " & sh.Name & " 2000") Then
      ' On est bien sur une feuille de mois.
      ' On recherche le numéro de ligne de la dernière date
      ' dans la colonne A à partir de A4.
      ' Il est primordial que la cellule A35 reste VIDE
      N = .Range("a4").End(xlDown).Row
      ' On transfère les valeurs de la zone A2 à caN
      ' dans un tableau en mémoire => Tablo
      ' Tablo est donc le tableau des valeurs du planning
      ' de la ligne 2 à N et de la colonne A à la colonne CA
      Tablo = .Range("a2:ca" & N).Value
      ' On dimensionne le tableau des résultats à 26 lignes et deux colonnes
      ' La 1ière colonne comprendra le nom de la personne (26 personnes max)
      ' La 2ième colonne contiendra la liste des jours de congé de la personne
      ' en 1ière colonne.
      ReDim RES(1 To 26, 1 To 2)
      ' On boucle sur chaque colonne de tablo avec un pas de 3.
      ' On commence par la colonne 2 de tablo (ie colonne B du planning)
      ' puis par colonne 5 de tablo (ie colonne E du planning)
      ' puis par colonne 8 de tablo (ie colonne H du planning)
      ' jusqu'à colonne 77 de tablo (ie colonne BY du planning).
      ' La colonne suivante serait 80 (=77+3) qui est au delà de la borne sup. de la boucle
      For j = 2 To 79 Step 3
        ' On vérifie si le nom (en ligne 2 du planning qui est la ligne 1 de tablo)
        ' a plus d'un caractère (pour éliminer les noms égaux à "0")
        If Len(Tablo(1, j)) > 1 Then
          ' C'est un nom valide.
          ' On augmente le compteur des noms valides.
          p = p + 1
          ' On stocke le nom dans RES à la ligne p et colonne 1.
          RES(p, 1) = Tablo(1, j)
          ' On va boucler sur les lignes de la colonne j de tablo.
          ' Cette colonne est la colonne sous le nom en cours.
          ' Du premier jour du mois => ligne 3 de tablo (ie ligne 4 du planning)
          ' Au dernier jour du mois => dernière ligne de tablo (ie ligne de fin de mois du planning)
          For i = 3 To UBound(Tablo)
            ' On teste si la valeur est égale à "congé payé".
            If Tablo(i, j) = "congé payé" Then
              ' La valeur est égale à "congé payé".
              ' On concatène le n° de jour de la date (colonne 1 de tablo)
              ' à la valeur de la colonne 2 de RES.
              ' Le séparateur est ", "
              RES(p, 2) = RES(p, 2) & ", " & Day(Tablo(i, 1))
            End If
          Next i
          ' On teste si la chaine correspondnat aux congés de la personne
          ' est vide ou non. Si elle n'est pas vide, on ôte du début de la chaine
          ' le séparateur ", " devant le premier jour de congé.
          If Len(RES(p, 2)) > 0 Then RES(p, 2) = Mid(RES(p, 2), 3)
        End If
      ' On passe au nom suivant.
      Next j
      ' Nous avons maintenant un tableau RES de deux colonnes
      ' et 26 lignes. Mais il n'y a que les p premières lignes qui
      ' nous intéressent (correspondant aux p noms trouvés)
      ' => Nous allons tronquer le tableau MAIS il y a un petit problème:
      '    VBA ne sait tronquer que les dernières colonnes d'un tableau
      ' On va donc transposer RES. RES va devenir un tableau de 2 lignes
      ' et 26 colonnes.
      RES = Application.Transpose(RES)
      ' On tronque le nouveau RES en ne gardant que p colonnes,
      ' ça, VBA sait le faire...
      ' On obtient un tableau de 2 lignes et p colonnes
      ReDim Preserve RES(1 To 2, 1 To p)
      ' On transpose à nouveau le tableau RES pour aboutir
      ' à un tableau de p ligne et deux colonnes.
      ' Nous sommes donc passés d'un tableau de 26 lignes et 2 colonnes
      ' à un tableau de p lignes et deux colonnes.
      RES = Application.Transpose(RES)
      ' On considère la cellule a45.
      ' On la redimensionne à une plage aux dimensions du tableau RES
      ' et on y colle le tableau RES.
      .Range("a45").Resize(p, 2) = RES
    End If
  End With
End Sub
 

Pièces jointes

  • La Vouivre-planning- v2.xlsm
    168.7 KB · Affichages: 43
Dernière édition:

La Vouivre

XLDnaute Occasionnel
Re : Comment trouver les gens en conge

Bonsoir mapomme
encore merci pour ce super code que vous m'avez donné , après essais sur le fichier au boulot un bug est apparu ,le mois d'Aout n'était pas pris en compte.
À la pause de midi je suis revenu sur le forum , et j'ai trouvé toutes les nombreuses explications de ce code , cette après-midi avec vos commentaires j'ai trouvé presque instantanément le bug ,il suffisait d'écrire Août est tous fonctionnent parfaitement .Un bug pour un ^ , fallait le trouvé ,est c'est avec votre aide que je me suis dépanner.
merci beaucoup pour ce code
bonne soirée
 

Discussions similaires

Réponses
14
Affichages
839
Réponses
5
Affichages
338

Statistiques des forums

Discussions
312 707
Messages
2 091 170
Membres
104 796
dernier inscrit
tarak