Boucles VBA et récupération de données

Bonjour,

pour intégrer ça au code il faudrait que je modifies quelques lignes pour pouvoir faire référence à un autre classeur, et j'enregistrerais le fichier sélectionné par l'utilisateur dans une variable

Pour la première partie du code:

Sub traitement()

 Application.ScreenUpdating = False

Désactive la mise à jour automatique de l'affichage, permet d'accélérer le temps d'éxécution d'une macro

 Dim ligFin, cumTemps, nbCol
 Dim tabFin As Variant, tableau As Variant

Je déclare ici certaines variables car elles sont écrites d'une certaine façon, les déclarer comme ceci permet de fixer la façon dont elles sont écrites (vis-à-vis des majuscules et des minuscules), je n'ai donc pas à me soucier d'écrire tabFin avec les majuscules, je le mets tout en minuscule et VBA se charge ensuite de reconnaître le nom de la variable et lui appliquer correctement les minuscules et majuscules.

 'Initialisations
 ligFin = Range("l" & Rows.Count).End(xlUp).Row
 tableau = Range("a3", "m" & ligFin)
 cumTemps = 0
 pause = 0
 nbCol = 3
 ReDim tabFin(1 To nbCol, 1 To 2)
 tabFin(1, 1) = tableau(1, 1)
 tabFin(1, 2) = tableau(2, 1)

Partie important du programme dans laquelle je donne les valeurs de départ de mes différentes variables,

 ligFin = Range("l" & Rows.Count).End(xlUp).Row

Cette partie du code permet d'avoir la dernière ligne remplie sur la colonne I, pour ça j'utilise Range("l" & Rows.Count) pour faire référence à la dernière ligne de la colonne I avec Rows.count qui donne le nombre de lignes qui sont présentes dans le classeur, et End(xlUp) qui permet de monter vers le haut à partir de cette cellule, et de s'arrêter à la première cellule remplie, ensuite j'utilise .Row pour avoir la ligne de cette cellule.

 tableau = Range("a3", "m" & ligFin)

Ici j'initialise le tableau en lui donnant comme données d'entrées toutes les cellules qui se trouvent entre A3 et la dernière ligne du tableau à la colonne M.

 cumTemps = 0
 pause = 0
 nbCol = 3

Ici je donne une valeur de départ à chaque variable pour être sûr qu'elles sont égales à 0, et la dernière c'est pour ne pas avoir à changer la valeur par la suite dans le programme, à chaque ligne qui utilise la variable...

 ReDim tabFin(1 To nbCol, 1 To 2)

Permet de redimensionner mon tableau final en lui donnant comme colonne de départ : 1, et 3 en colonne de fin, soit trois colonnes de 1 à 3, et 2 lignes de 1 à 2, je vais souvent redimensionner ce tableau au fur et à mesure que je vais mettre des infos dedans.

 tabFin(1, 1) = tableau(1, 1)
 tabFin(1, 2) = tableau(2, 1)

Enfin cette partie permet de donner des valeurs de départ au tableau final, je fais ça par rapport à la boucle qui suit, je ne peux pas commencer par des lignes qui sont vides au niveau de la colonne "i".

Bonjour, merci pour toutes ces explications (désolé de prendre votre temps), c'est vrai que cette partie en VBA est je trouve assez difficile quand on débute. J'aimerais bien voir si possible comment faire pour le code avec getopenfile ainsi que l'enregistrement dans des onglets, j'ai effectué quelques recherches ce weekend dessus mais cela n'a abouti à rien de mon coté.

Re,

Je te proposes un fichier qui sera chargé d'aller chercher les infos d'un autre fichier que tu sélectionneras:

Voilà pour le GetOpenFileName

Merci beaucoup, au niveau du code j'avais quasiment la même chose mais il me manquait cela:

ActiveWorkbook.Close

ligExport = Range("a" & Rows.Count).End(xlUp).Row

If Range("a" & ligExport) <> "" Then

ligExport = ligExport + 1

End If

Range("a" & ligExport).Resize(UBound(tabFin, 2), UBound(tabFin, 1)) = WorksheetFunction.Transpose(tabFin)

Application.ScreenUpdating = True

End Sub

Pour la suite comment faudrait-il faire pour faire un total mensuel pour chaque personne ? Le code peut il détecter chaque personne pour faire un total avec toutes les données sachant que chaque fichier excel qui sort chaque jour ne commence pas forcément par la même personne en fonction de si elle travaillait ou non. Je vous met en second fichier en copie. j'ai la possibilité de sortir un fichier également au mois ce qui pourrait être également plus facile mais le code ne fonctionne pas dessus, je ne peux vous le mettre en copie car il est trop volumineux il fait plus de 10000 lignes au complet, je l'ai donc coupé en laissant quelques employés pour vous montrer le fonctionnement. J'ai aussi la possibilité de le sortir à la semaine

Ce que j'aimerais faire par la suite c'est que les employés puissent avoir accès à leur compteur personnel par exemple créer un fichier avec une liste de nom et lorsque l'employé sélectionne son nom il voit son compteur personnel d'heures travaillées

Re,

Je pense que pour faire ça il faudrait changer la façon dont est présentée la synthèse pour la rendre compatible avec les tableaux croisés dynamiques, de cette façon il serait très facile de faire une synthèse mensuelle par personne.

Pour rendre les données compatibles avec un tableau croisé dynamique, il faut un tableau à 5 colonnes, 1 ère colonne: nom de la personne, 2ème colonne: date, 3 à 5: les temps.

Voici la modification que je propose:

Tu as une synthèse par années, mois, personne

D'accord mais comment l'utiliser ? il faut rentrer grace au bouton chaque fichier excel tous les jours ou utiliser le fichier mensuel ?

Je pense que faire une synthèse une fois par semaine serait préférable dans notre cas car actuellement nos travaillons avec des feuilles de pointage à la semaine et celles-ci sont vérifiées tous les lundi. Puis regrouper cette synthèse à la semaine en mois à la fin de celui-ci.

Une fois cette synthèse effectuée est ce qu'il y a un moyen de comparer cette synthèse à un tableau de prévision ? Je m'explique, la synthèse c'est les heures que les personnes ont réellement effectuées et toutes les semaines nous comparons si le nombre d'heure effectuée à la journée pour la semaine X correspond à ce qui était prévu par exemple pour Y personne s'il à fait 8 heures et que seulement 7 heure était prévue le lundi il y à un problème, je vous met en copie un fichier qui pourrait permettre de comparer cette synthèse aux heures réellement prévue.

Donc faire un module en plus de la synthèse qui compare pour chaque personne pour tel semaine si les heures pour chaque jours ont bien été respecté et que si il y a une différence de 15 minutes avec ce qui était normalement prévu il sorte le nom des personnes concernés et le jour ? Cela représente peut être une grosse partie en programmation ?

Exemple :

Salarié X pour la semaine 20 :

Heures effectuées.......................................................................Heures prévues :

20/05 : 7.............................................................................................6

21/05 : 7 ............................................................................................7

22/05 : 7.............................................................................................7

23/05 : ...............................................................................................7

24/05 :

25/05 : 7

26/07 : 7.............................................................................................7

Par exemple la macro en comparant la synthèse et nos fichier fait à la semaine ne sortirait que le nombre d'heure qui n'a pas été respecté

Salarié X : 20/05 heures prévues 7 / heures effectuées 6

23/05 heures prévues 0 / heures effectuées 7

25/05 heures prévues 7 / heures effectuées 0

De façon à qu'il ne sorte que les anomalies dans un onglet lorsque la différence est supérieure à 15 minutes

(Je vous met en copie un fichier de prévision, de ce que les salariés doivent faire une semaine sachant que ce n'est jamais le même nombre d'heure pour chaque personne, là c'est un exemple de semaine).

Bonne soirée

Concernant la modification de la synthèse cela ne pose pas de problème à partir du moment ou nous avons accès à la date, le total d'heures effectuées sur la journée et le nom de la personne, c'est la principal. Si cela permet en plus d'avoir un accès au compteur de chaque personne cela est parfait

Bonjour, voici un fichier complet à la semaine qui pourrait être utilisé pour effectuer les pointages à la semaine ainsi que la vérification avec les prévisions peut être.

Bon finalement en voyant de mon côte le mieux serait de faire un dossier avec la vba qui créée un onglet avec une synthèse journalières, car la personne qui s'en occupe vérifie tous les jours si les horaires sont respectés donc la synthèse se ferait à partir du fichier journalier et cette synthèse sera comparée au horaires prévues pour la journée je pense que c'est le mieux

Je vous met en copie le résultat final que j'aimerais obtenir (ne prenez pas compte de tous les messages au dessus je ne sais comment les supprimer) :

A l'exécution de la macro, dans les colonnes A,B et C la synthèse précédemment effectuée à la journée pour chaque personne,

Une fois que la synthèse est effectuée, le code me propose d'ouvrir un second fichier (le fichier "heures prévues"), je sélectionne donc ce fichier en fonction de ma semaine et le code va chercher, en fonction du jour par exemple dans ce cas "Vendredi" le nombre d'heures que la personne devait normalement faire dans la colonne en question en fonction de son nom et du jour et note ce nombre dans la colonne E. Ensuite un comparatif dans la colonne F est effectué entre le total personnel du salarié dans la synthèse avec le nombre d'heures normalement prévues. Si le total est supérieur a 00:15:00 ou -00:15:00 alors ce résultat est coloré en rouge

La colonne 25% et 100% ce n'est pas pour tout de suite et dans la colonne M et N, toujours dans le fichier Heures prévues sortir le nom des personnes où il y à un "état" et le type d'état pour chaque personne

Une fois la feuille terminée je renommerais celle ci en la date en question

(Le fichier Compteur 5 est le résultat "final" que j'aimerais avoir par la suite")

Pensez vous que cela est possible notamment pour que les heures de chaque personnes soient remise au bon endroit afin de calculer leur écart avec le fichier heures prévues ?

Bonjour,

Tu as envoyé de nombreux messages, je ne répondrai pas tout de suite à la totalité d'entre eux, pour l'utilisation du fichier que je t'ai fournis, il peut être utilisé quotidiennement ou de façon hebdomadaire, tout dépendera du fichier source à utiliser, si le fichier source contient toutes les infos de la semaine, faire ça de façon hebdomadaire suffira, pour l'histoire des heures prévues je suppose que c'est faisable mais il faudra que je me penche sur les fichiers que tu m'as transmis.

Bonjour, bien-sûr alors ne prenez en compte que le dernier message il resume tout ce qui pourrait etre fait.

Bonne journée à vous

Bonjour, entre temps j'ai combiné les différents fichier que vous avez fait concernant la synthèse pour qu'elle doit "terminée" par contre la boucle ne fonctionne pas sur tous les fichiers, celle ci bloque à un moment. Je vous met les fichiers sur une semaine et le dossier pour la synthèse :

La synthèse fonctionne sur les fichier du 14.05 / 16.05 / 18.08 / 19.08 mais par contre pour ceux du 13.05 / 15.05 / 17.08.

Le code bloque sur cette ligne à chaque fois :

tabFin(2, UBound(tabFin, 2)) = CDate(tableau(i, 5))

Bonne journée

Le fichier Compteur 1.4 c'est le fichier synthèse qui a été combiné

(EDIT : j'ai trouvé de où vient le problème, lorsque mon fichier de connexion est créé, certaines fois au lieu d'enregistrer une heure il met un "-" ce qui pose problème, par contre je ne sais pas comment le régler, est-ce possible d’émettre une condition dans la macro s'il détecte cela dans la boucle qu'il n'en prennent pas compte peut être ? )

Bonjour,

C'est possible de savoir si une valeur contient un tiret avec InStr(), en revanche il faudra que je voie pour changer la valeur en quelque chose d'utilisable, il faut que j'expérimente, que je teste, je ne pense pas te donner une réponse aujourd'hui, je vais essayer de mettre à jour tous les sujets sur lesquels je suis à la traîne ce week-end parce que je n'avance plus bien en semaine en ce moment...

Bonjour, bien-sur aucun problème je comprend tout à fait, si jamais vous avez le temps également de regarder mon message du 21 mai 2019 à 17:54.

Bon courage et bonne journée à vous

Bonjour,

j'ai réglé le problème du tiret la ligne n'est plus prise en compte par le programme car à la colonne l je mets "x".

Il me reste à me pencher sur le plus gros morceau maintenant... voir tout ce que tu souhaites faire de plus ou différemment par rapport au programme que je t'avais fournis, mais j'avance un peu au moins c'est encourageant...

Voici le fichier de synthèse avec la correction du tiret:

J'ai aussi fait en sorte que les différents enregistrements puissent se cumuler sur la feuille de synthèse sans avoir à créer une nouvelle feuille nommée synthèse à chaque fois

Très bien je vais regarder le code, je vous remercie pour cela, oui je comprend je suppose que vous devez être sur plusieurs sujets à la fois, bon courage

Bonjour,

j'ai pas mal travaillé de mon côte et j'ai finalement réussi a faire ce que je voulais faire du fichier, j'ai par contre un problème concernant la boucle que vous avez effectué pour la synthèse, par moment, le total ne se fait pas pour la dernière personne sur certains fichier, par exemple celui-ci lors de la synthèse. Si ce total n'est pas mis il fait planter mes macros pour le fichier actuel (compteur 1.8) car le total est nécessaire. Je vous met donc une ancienne version sans tout ce que j'ai fait afin qu'elle ne plante pas et vous vous voyez que le total ne se fait pas (compteur 1.5).

Bonne journée

1compteur-1-5.xlsm (91.64 Ko)
4compteur-1-8.xlsm (69.23 Ko)
Rechercher des sujets similaires à "boucles vba recuperation donnees"