Recherche, mise en mémoire et somme par VBA

Bonjour tout le monde, le forum,

Débutant en VBA, je me forme au fur et à mesure de ce que l'on me demande de faire dans le cadre de mon travail.

Récemment, on m'a demandé un travail pour référencer les absences des personnes.

J'ai créé un Userform qui me permet de remplir un tableau sur un autre fichier excel. A partir de cette source, je dois pouvoir sortir, en fonction du mois sélectionner dans une liste déroulante, le nombre de jours d'absences de chaque personne de la liste.

La liste de personne peut-être agrandie ou rapetissée, une même personne peut être absente plusieurs fois au cours du même mois, une absence ne se calcul qu'à partir de 24H consécutive sinon.

Voilà le code que j'ai écrit:

Option Explicit

Private Sub Maj_Abs()
'définition des variables
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim debmois As Date
Dim finmois As Date
Dim mois As Long
Dim annee As Long
Dim x As Variant
Dim i As Variant
Dim s As Integer
Dim y As Variant
Dim c As Range
'définition des références de variable
Set ws1 = Sheets("Récapitulatif")
Set ws2 = Sheets("Absences")
debmois = DateSerial(annee, mois, 1)
finmois = DateSerial(annee, mois + 1, 1)
'boucle de recherche
For Each c In ws1.Range("a2:a" & ws1.[a200].End(xlDown).Row)
 Do While Cells(i, 1).Value = ""
 i = i + 1
   If ws2.Cells(i, 1).Value = c And Cells(i, 8).Value = ws1.Cells(1, 6).Value And Cells(i, 9).Value = ws1.Cells(1, 6).Value Then
    s = s + Cells(i, 10).Value
     ElseIf Cells(i, 8).Value = ws1.Cells(1, 6).Value And Cells(i, 9).Value <> ws1.Cells(1, 6).Value Then
      y = WorksheetFunction.Int(finmois - (Cells(i, 3).Value + Cells(i, 4).Value))
      s = s + y
       ElseIf Cells(i, 8).Value <> ws1.Cells(1, 6).Value And Cells(i, 9) = ws1.Cells(1, 6).Value Then
        y = WorksheetFunction.Int(debmois - (Cells(i, 5).Value + Cells(i, 6).Value))
        s = s + y
   End If
   Cells.Range(x, 3).Value = s
 Loop
Next c
End Sub

Avant, entre For Each et Do While, j'avais : x=Cells.Value (je voulais qu'elle charge le nom de la première personne, la traite puis passe à la seconde, etc.) mais le x tentais de charger la totalité des noms de personne et m'affichais une erreur donc je l'ai supprimée.

Dans le fichier joint, vous trouverez un exemple de mon fichier avec certaines indications complémentaire si besoin.

D'avance, merci à celles et ceux qui se pencheront sur mon soucis.

Neonours

Edit: Le code n'est pas inclus dans la pièce jointe mais je reste à disposition pour toutes questions et je rafraichi régulièrement le forum en continuant à chercher une solution.

Neonours

35exemple1.zip (11.25 Ko)

Bonjour

Sitôt ouvert, sitôt fermé

Il faut le fichier dans lequel tu as fait ton Userform ainsi que les macros

Bonjour Banzai64,

Merci pour cet accueil!

Je ne peux malheureusement pas fournir les originaux:

-Le fichier contenant l'userform est plein de données confidentielles et il serait très long d'en faire une copie et de modifier toutes les données.

-Le fichier originale contenant la macro fait environ 4'200 Ko, je doute que, même zippé, il passe sur le forum en plus de contenir également des données confidentielle.

Ma société étant vraiment très à cheval sur la confidentialité des données, je dois présenter chaque document que je souhaite posté pour évaluation ce qui rallonge d'autant plus le temps entre la création d'un "modèle" non confidentiel et sa publication.

Mais je peux répondre aux questions et je ferais en sorte d'être le plus précis possible.

Neonours

Bonjour

Neonours a écrit :

Je ne peux malheureusement pas fournir les originaux:

On n'en a pas besoin

Mais on doit savoir la structure du fichier, dans quelle colonne doit on faire la recherche, le nom des pages, le nom des contrôles

Dans ta macro tu notes

Set ws1 = Sheets("Récapitulatif")

Où est elle cette page ?

Aussi je pense que tu exécutes la macro à partir de la page "Récap" alors expliques moi dans cette ligne

If ws2.Cells(i, 1).Value = c And Cells(i, 8).Value = ws1.Cells(1, 6).Value And Cells(i, 9).Value = ws1.Cells(1, 6).Value Then

Cells(i, 8 ).Value : C'est dans quelle page - d'après le code cela serait dans la page "Récap" ?

heuuuuu aucune info dans la page "Récap" en colonne H

ws1.Cells(1, 6).Value : La c'est dans la page "Récap" mais pas plus d'info dans la colonne F

Voilà c'est pour toutes ces petits défaut que l'on demande une copie du fichier

Mais c'est toi qui décide

Je me doutais que j'avais zappé un truc !

La page "Récapitulatif" que tu cherches se nomme "Récap" au niveau de l'exemple (page 2).

La cellule F1 ( ws1.Cells(1, 6).Value ) contient une liste déroulante qui se "cache" si on ne va pas dessus avec la souris et qui affiche un mois que l'on sélectionne dans la liste (Février et FévrierBis permettent de palier les années bisextile).

Visiblement, en dehors de

    If ws2.Cells(i, 1).Value = c And Cells(i, 8).Value = ws1.Cells(1, 6).Value And Cells(i, 9).Value = ws1.Cells(1, 6).Value Then

j'ai chaque fois omis de mettre le ws2 mais la cellule avant le = se trouve sur la feuille Absences et non Récap.

Je sais pertinemment que c'est compliqué de ne pas avoir la totalité des infos, j'ai moi même parfois beaucoup de mal à en obtenir certaines qui me sont indispensable pour effectuer mes tâches.

Je te remercie tout de même de te pencher sur mon soucis, je continue de faire des recherches de mon côté.

Neonours

Bonjour

Plus je penche sur ton problème plus cela se complique

Au fait ta liste déroulante est dans la cellule D1 et pas F1

On continue dans la joyeuseté :

    If ws2.Cells(i, 1).Value = c And [surligner=#FFFF80]Cells(i, 8).Value =ws1.Cells(1, 6).Value And[surligner=#BFFFFF]Cells(i, 9).Value =[surligner=#FFBF00]ws1.Cells(1, 6).Value Then

Tu compares la cellule H (temps d'absence) avec (a priori) la cellule D1 (mois) !!!!!

Tu compares le cellule I (jour d'absence) avec (toujours a priori) la cellule D1 (mois) !!!!!

Mon avis tu as fait un fichier à la va-vite et rien ne correspond à la macro que tu as faite pour ton fichier réel

Pour le moment j'abandonne, c'est peut être plaisant de jouer aux devinettes

Un conseil : Indiques clairement (manuellement) ce que tu dois trouver dans les colonnes "Présence" et "Absence" de la feuille "Récap"

Le code est fait sur la base du fichier originale qui contient plus de feuilles et la feuille "Récap" originale contient plus de colonnes mais sur le principe, le code pour 1 seule feuille est suffisant puisque la structure de chaque feuille est identique, il me suffira juste de modifier les références pour chaque feuille.

Je n'ai pas pensé a adapté le code au fichier d'exemple, j'en suis désolé.

Ce que dois faire la macro:

Sur le principe, c'est simple, il faut juste trouver le nombre de jour d'absence de chaque personne pour le mois sélectionner et afficher le nombre entier dans la cellule de la colonne absence en face du nom de la personne.

Dans le détail, ça se complique un petit peu:

-Une personne peut être absente plusieurs fois dans un même mois.

-Un jour d'absence est comptabilisé dès qu'il y a 24H d'absence consécutive.

-Un temps absence peut être à cheval sur 2 mois (départ en janvier et retour en février par exemple).

  • Les absences ne sont décomptée QUE pour le mois sélectionné même si l'absence est à cheval sur 2 mois:
  • Pour un début d'absence en janvier et un retour en février, si on veut les absence du mois de janvier ne doivent être pris en compte que la durée entre la date et l'heure du début de l'absence et le dernier jour du mois de janvier à minuit.
  • Dans le même cas mais si on veut les absence de février, ne doivent être comptabilisé que les absences entre le premier jour du mois de février à minuit et la date et l'heure de retour.

-Les heures d'absences ne sont pas cumulative (10h le 03.02 + 8h le 05.02 + 6h le 15.02 =24H mais ne compte pas comme 1 jour d'absence).

-La somme des jours d'absence du mois sélectionner doivent être mise dans la colonne "Absence" de la feuille "Récap" en face du nom de la personne.

Voilà, je crois qu'il y a tout mais je n'en suis pas certain.

Je continue de chercher et rafraichir le forum pour d'autres informations si besoin ou pour aider d'autres personnes si c'est dans mes compétences.

Neonours

Bonjour

Je ne me suis pas occupé des heures

Merci beaucoup pour ce code Banzai64.

J'ai juste remarquer 2 petites choses:

-Il ne prend pas en compte les heures (en testant avec le mois de janvier, Personne 2 devrait avoir 6 jours d'absence mais il y en a 7 de marqué).

-Histoire de tester un peu plus, j'ai rajouté 3 lignes sur la feuille "Absences" mais il ne m'a pas pris en compte la 3éme ligne hors, ce tableau est en constant agrandissement.

Pourrais-tu commenter ton code s'il te plaît? Cela me permettra d'en apprendre plus sur le VBA Excel et ce sera plus facile pour moi de l'adapter au multiples feuilles que j'ai.

Merci beaucoup.

Neonours

Rechercher des sujets similaires à "recherche mise memoire somme vba"