Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Etablir un relevé de situation en VBA

Fchris

XLDnaute Occasionnel
Bonjour à toutes et à tous,

J'ai un gros projet à monter suite à la mise en place d'un régime d'astreinte dans mon entreprise. Je dois être capable de fournir aux salariés un relevé récapitulant les astreintes effectuées dans le mois ainsi que divers autres éléments, et aussi être capable d'historiser toutes ces données.

J'ai créé un calendrier permettant de saisir par salarié et par jour le type d'astreinte, le nombre d'heures...

Je récupère toutes ces infos dans une petite synthèse sous le calendrier afin d'avoir un cumul par salarié.

J'ai ensuite établi une matrice de relevé individuel dans lequel je souhaite récupérer les infos se trouvant dans ma petite synthèse. C'est là que je bloque. Je ne sais pas comment faire pour basculer toutes mes infos afin de pouvoir sortir un relevé par salarié. J'ai imaginé passer par un système de bouton permettant de choisir le salarié concerné et ensuite de générer le relevé individuel le concernant. J'ai donc placé des boutons de commandes au dessus de mon calendrier, mais je suis incapable d'écrire le code correspondant.

Quelqu'un aurait-il une idée sur la façon de procéder, déjà à savoir si la démarche de sélection du salarié est la bonne méthode pour générer un relevé, et comment écrire le code pour le générer.

Je joints mon fichier de travail afin que tout soit plus clair, et je suis là pour répondre à toutes les questions pouvant vous aider à me trouver une solution.

Merci par avance à tous de votre aide.
 

Pièces jointes

  • Projet Astreintes Version Test.zip
    41.4 KB · Affichages: 86
  • Projet Astreintes Version Test.zip
    41.4 KB · Affichages: 84
  • Projet Astreintes Version Test.zip
    41.4 KB · Affichages: 86

dixit

XLDnaute Impliqué
Re : Etablir un relevé de situation en VBA

re
voici une autre version avec macro que j'ai nommée fiche
dans le code du bouton2 il y a appel à la macro fiche ; cette macro pourrait être remise dans le code du bouton ; actuellement elle est en module1.
dans la feuille Nemours j'ai prévue une case pour saisie du matricule, solution plus simple que le bouton à cocher (moins élégant aussi ...) ; il est possible de prévoir une liste ou autre
la macro reporte sur la feuille relevés le matricule et le nom (uniquement pour les matricules 25001 et 25002 car avec les colonnes cachées c'est la galère pour repérer)
cet exemple montre aussi l'utilisation de cells(ligne,colonne) et de range("colonneligne") pour désigner une cellule.
bye
 

Pièces jointes

  • ED74412Fchrisproposition2.zip
    39.1 KB · Affichages: 39
C

Compte Supprimé 979

Guest
Re : Etablir un relevé de situation en VBA

Salut FChris,

De retour à la maison, j'ai bossé un peu sur ton tableau

Tu trouveras donc ci-joint ton fichier avec une macro et un USF (UserForm) en plus.

A moins que la solution de Dixit te convienne.
 

Pièces jointes

  • FChris - Projet Astreintes V1.zip
    39 KB · Affichages: 57

Fchris

XLDnaute Occasionnel
Re : Etablir un relevé de situation en VBA

Bonjour Dixit et Bruno,

Déjà un énorme MERCI à vous deux pour toute l'aide que vous m'avez apporté, c'est vraiment méga sympa, surtout que cela vous a pris pas mal de votre temps.

Merci beaucoup Bruno d'avoir pris le temps de bosser chez toi en plus, c'est vraiment sympa.

Dixit, ta solution est intéressante, mais mon coeur penche plus pour la solution de Bruno. Vraiment super. L'idée du USF, c'est impeccable, ça reste propre et facilement accessible pour les futurs utilisateurs, absolument génial.

Je vais adapter tout ça pour le dupliquer sur tous mes centres.

J'aurai une autre question une autre question pour finaler ce projet. Vous avez vu qu'il y avait un bouton 'générer historique' et en fait il s'agit simplement de récupérer les infos de la petite synthèse qui se trouve sous le calendrier et de faire un copier coller des valeurs dans une autre feuille, afin de pouvoir garder toutes les infos mensuellement sans écraser les précédentes. Je ferai une matrice pour vous montrer le résultat à obtenir, mais ce sera largement plus simple pour vous que ce que vous venez de faire.

En tous les cas, encore merci à tous les deux.
 

Fchris

XLDnaute Occasionnel
Re : Etablir un relevé de situation en VBA

Bonjour Bruno,

J'ai une petite question qui me vient tout à coup

Comment est-ce que que je fais pour faire varier le nombre de salarié disponible dans le USF ? car selon le lieu de travail, le nombre de salarié variera, et il faut que ma liste puisse s'adapter.

Est-ce que c'est au niveau du USF :

Private Sub UserForm_Activate()
Dim I As Integer
Me.ComboBox1.Clear
For I = 6 To 60 Step 10
Me.ComboBox1.AddItem Sheets("Nemours").Cells(6, I).Value
Next
Me.ComboBox1.Value = Me.ComboBox1.List(0)
End Sub

Merci d'avance
 
C

Compte Supprimé 979

Guest
Re : Etablir un relevé de situation en VBA

Salut Fchris,

Comment est-ce que que je fais pour faire varier le nombre de salarié disponible dans le USF ? car selon le lieu de travail, le nombre de salarié variera, et il faut que ma liste puisse s'adapter.

Est-ce que c'est au niveau du USF :

Tout à fait, il suffit de rallonger la boucle au niveau du 60 (qui est le numéro de colonne du dernier salarié)

Il y'a certainement moyen de faire ça autrement, à voir !
 

ChTi160

XLDnaute Barbatruc
Re : Etablir un relevé de situation en VBA

Salut Fchris
Bonsoir le fil
Bonsoir le forum

Bon moi je suis un peu long lol (enfin pas pour tout dommage!!!!)
Donc j’ai bidouillé un petit truc sans trop savoir

Une question tu dis :
Comment est-ce que je fais pour faire varier le nombre de salarié disponible dans le USF ?
car selon le lieu de travail, le nombre de salarié variera, et il faut que ma liste puisse s'adapter.
Cela veut il dire que tu as plusieurs feuilles comme celle de Nemours dans le même classeur ou alors vas-tu mettre les procédures dans d’autres classeur ???

Car s’il s’agit de plusieurs feuilles dans le même classeur on peut imaginer mettre une listBox ou un combobox qui reprend le noms de ces différents lieux de travail et permettra de cibler la feuille (car pour l'instant c'est la feuille Nemours qui est reprise en dur dans la procédure)

pour ce qui est des salariés ils sont pris en compte automatiquement en fonction de la derniere colonne utilisé qui est détecté dans la procédure( à condition que le format des modules salarié des feuilles soit le même que celui de la feuille Nemours )

Le Fichier :

tiens nous au courant, Si cela t’intéresse bien sur
Bonne fin de Soirée
 
Dernière édition:

Fchris

XLDnaute Occasionnel
Re : Etablir un relevé de situation en VBA

Bonjour Jean Marie,
Bonjour le forum,

Excuse moi pour cette réponse tardive mais j'étais en déplacement et je n'avais pas vu ta réponse.

BrunoM45 m'a beaucoup aidé dans l'établissement de ce fichier, et j'arrive presque au bout de mon projet, enfin......

Ceci dit, ton fichier est également intéressant car il m'apporte de petites fonctionnalités auquelles je n'avais pas forcément pensé, comme le petit message d'alerte sur l'archivage non effectué.

Je mets mon fichier en pièce jointe, si ça t'intéresse d'en voir la structure et comment il est composé. En revanche, j'ai effectivement un soucis, car comme tu le dis, mon onglet est nommé en dur dans la procédure, et je vais bien avoir un classeur par établissement de travail. Pas trop de solution pour faire autrement à priori, car je ne veux pas que tous les établissements se retrouve dans le même classeur pour des raisons de confidentialité.

J'ai tout de même un petit problème qui se pose à moi pour l'archivage :

Je souhaite calculer le nombre d'astreintes cumulées depuis le début de l'année. J'ai donc intégré cette donnée dans mon code, mais j'ai un plantage sur le premier mois de l'année car en fait je lui dis de cumulé la valeur du mois + la valeur du mois précédent, mais sur janvier ça plante forcément puisqu'il n'y pas de valeur de mois précédent...

Ci joint le bout de code concerné :

' Inscrit Nbre Astreintes Cumulées
.Cells(NLigH, NColH + 7).Value = NbAstJ + NbAstN + .Cells(NLigH - 1, NColH + 7)

Merci d'avance de ton aide

FChris

Edit : Petit soucis, mon fichier est devenu un peu trop gros...
 
Dernière édition:

Fchris

XLDnaute Occasionnel
Re : Etablir un relevé de situation en VBA

Jean Marie,

Je n'arrive pas à poster mon fichier il est trop lourd avec tout le code.

Si tu veux me faire un post privé avec une adresse mail, je pourrais te l'envoyer si tu veux.

Sinon voici le code complet pour l'historisation,

Sub Historiser()
Dim VMat As String, Vmois As Integer
Dim NbSurInterv, NbDrgt
' Pour Chaque Salarié
' Récupère le mois
Vmois = Month(Range("A4"))
For NSal = 1 To 6

' Calcul du numéro de colonne : 16 par salarié
NColR = IIf(NSal > 1, 4 + ((NSal - 1) * 16), 4)

' Pour chaque ligne du salarié
For Each Cel In Sheets("Nemours").Range(Cells(8, NColR), Cells(38, NColR))

' Colonne Astreintes de jour
VCel = Cel.Value
If VCel <> "" Then
NbHAstJ = NbHAstJ + VCel ' Nb d'heure
NbAstJ = NbAstJ + 1 ' Nb de jour
End If

' Colonne Astreintes de nuit
If Cel.Offset(0, 5) <> "" Then
NbAstN = NbAstN + 1
End If

' Colonne Astreintes consécutives jour
VCel = Cel.Offset(0, 4)
If VCel <> "" Then
NbAstConsecJ = NbAstConsecJ + VCel
End If

' Colonne Astreintes consécutives nuit
VCel = Cel.Offset(0, 10)
If VCel <> "" Then
NbAstConsecN = NbAstConsecN + VCel
End If

' Colonne dérangement
If Cel.Offset(0, 11) = "O" Then
NbDrgt = NbDrgt + 1
End If

' Colonne Intervention
VCel = Cel.Offset(0, 12)
If VCel <> "" Then
NbHInterv = NbHInterv + VCel
NbInterv = NbInterv + 1
End If

' Colonne Sur Intervention
If Cel.Offset(0, 14) = "O" Then
NbSurInterv = NbSurInterv + 1
End If
Next

NbAstCum = NbAstConsec + NbAstN
NbAstConsec = NbAstConsecJ + NbAstConsecN

' Créer l'HISTORIQUE
' Calculer la ligne sur laquelle va s'inscrire les données
NLigH = 4 + Vmois
' Calcul la colonne du salarié si dans le même ordre
NColH = IIf(NSal > 1, 2 + ((NSal - 1) * 8), 2)
' Inscrit les données
With Sheets("Historiques")
' Inscrit Heures Astreinte Jour
.Cells(NLigH, NColH).Value = NbHAstJ
' Inscrit Nombre Abstreinte Nuit
.Cells(NLigH, NColH + 1).Value = NbAstN
' Inscrit Nbre Dérangement
.Cells(NLigH, NColH + 2).Value = NbDrgt
' Inscrit Nbre Intervention
.Cells(NLigH, NColH + 3).Value = NbInterv
' Inscrit Temp Intervention
.Cells(NLigH, NColH + 4).Value = NbHInterv
' Inscrit Nbre Sur Intervention
.Cells(NLigH, NColH + 5).Value = NbSurInterv
' Inscrit Nbre Astreintes Consécutives
.Cells(NLigH, NColH + 6).Value = NbAstConsec
' Inscrit Nbre Astreintes Cumulées
.Cells(NLigH, NColH + 7).Value = NbAstJ + NbAstN + .Cells(NLigH - 1, NColH + 7) => C'est là que ça pêche... !!
End With

' Remise à zéro des compteurs
NbHAstJ = 0: NbAstJ = 0: NbAstConsec = 0: NbAstConsecJ = 0: NbAstConsecN = 0
NbAstN = 0: NbDrgt = 0: NbInterv = 0: NbHInterv = 0: NbSurInterv = 0
Next
MsgBox "Archivage des valeurs effectué avec succès !"
End Sub

Si tu peux jeter un oeil... Merci d'avance
 

ChTi160

XLDnaute Barbatruc
Re : Etablir un relevé de situation en VBA

Salut Fchris
bonjour le fil

arff pas de fichier dur dur mon adresse si tu le veux jeanmarie160@Hotmail.com

pour ce qui est du problème du mois précédent avec Janvier tu peux peut être mettre une condition

Code:
If  Month(Date) =1  then
         [COLOR=blue] 'ici récupération sans mois précédent[/COLOR]
      .Cells(NLigH, NColH + 7).Value =NbAstJ + NbAstN 
Else
         [COLOR=blue] 'ici récupération avec  mois précédent[/COLOR]
      .Cells(NLigH, NColH + 7).Value =NbAstJ + NbAstN + .Cells(NLigH - 1, NColH + 7)

End if

pour ce qui est des différents lieu de travail
je pense qu'il est possible donc d'avoir plusieurs fichier (un par lieu de travail) dans un même dossier et de récupérer ces noms dans une listBox ce qui permettrait après sélection et entré d'un mot de passe par exemple d'ouvrir le Fichier travail sélectionné et de travailler dessus (on aura récupéré via une variable son Nom
à voir
Bonne fin de Journée
 

Fchris

XLDnaute Occasionnel
Re : Etablir un relevé de situation en VBA


Je viens d'essayer d'intégrer ton code, mais il n'en veut pas le vilain !!

Je t'ai envoyé mon fichier par mail, si tu peux y jeter un oeil...
 

Fchris

XLDnaute Occasionnel
Re : Etablir un relevé de situation en VBA

ChTi160 à dit:
arff re
voila ce que j'ai modifié


à tester

bonne fin de journée

Il n'en veux pas non plus... snif Ca fonctionne sur les autres mois, mais sur janvier rien à faire.

En même temps, je viens de m'apercevoir d'un truc : en fait je n'obtiens pas le résultat exactement souhaité.
Ce que je voudrais c'est que dans la colonne Cumul Ast j'ai le cumul depuis le mois de janvier, en sachant que sur certains mois, je peux avoir une valeur à 0, et donc si je prends seulement le mois M-1, ça ne fonctionne pas, il faut systématiquement que j'additionne tous les mois. C'est plus compliqué que prévu en fait...
 

ChTi160

XLDnaute Barbatruc
Re : Etablir un relevé de situation en VBA

re
arff je viens de comprendre,tu veux cumuler dans la feuille historique les valeurs de la colonne I au fur et à mesure
si c'est cela ,voilà ce que j'ai mis et qui fonctionne
Code:
 [COLOR=blue]'Inscrit Nbre Astreintes Cumulées
[/COLOR][SIZE=1]Select Case Vmois[/SIZE]
[SIZE=1]       Case Is = 1[/SIZE]
[SIZE=1]        .Cells(NLigH, NColH + 7) = CInt(NbAstJ + NbAstN)[/SIZE]
[SIZE=1]       Case Is > 1[/SIZE]
[SIZE=1]        .Cells(NLigH, NColH + 7) = CInt(NbAstJ + NbAstN) + CInt(.Cells(NLigH - 1, NColH + 7))[/SIZE]
[SIZE=1] End Select[/SIZE]
arfffffffffffffff je viens de lire ton post et je m'apercois que c'était presque cela
je vais y regarder

Bonne fin de journée
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re : Etablir un relevé de situation en VBA

re
voilà encore une version qui marche et qui répond à la demande cumul
après avoir déclaré la variable NbrCumul
Code:
Dim [COLOR=blue]NbrCumul [/COLOR]as Integer
[COLOR=green]' Inscrit Nbre Astreintes Cumulées[/COLOR]
   Select Case Vmois
   Case Is = 1[COLOR=green] 'on colle la somme des deux variables
[/COLOR].Cells(NLigH, NColH + 7) = CInt(NbAstJ + NbAstN)
   Case Is > 1 [COLOR=green]'on additionne la plage (I4:Ix)du dessus avec les deux variables
[/COLOR][COLOR=blue]NbrCumul[/COLOR] = Evaluate(Application.WorksheetFunction.Sum(.Range(.Cells(5, 9) _
, .Cells(NLigH - 1, NColH + 7))))
    .Cells(NLigH, NColH + 7) = CInt(NbAstJ + NbAstN) + CInt(NbrCumul)
  End Select
End With
 
 [COLOR=green] ' Remise à zéro des compteurs[/COLOR]
 NbHAstJ = 0: NbAstJ = 0: NbAstConsec = 0: NbAstConsecJ = 0
 NbAstConsecN = 0:  NbAstN = 0: NbDrgt = 0: NbInterv = 0
 NbHInterv = 0: NbSurInterv = 0: [COLOR=blue]NbrCumul[/COLOR] = 0
Bonne fin de journée
 
Dernière édition:

Discussions similaires

Réponses
23
Affichages
792
Réponses
5
Affichages
310
Réponses
5
Affichages
217
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…