Macro qui s'éxécute sans renvoyer de résultat...

Résolu/Fermé
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016 - 10 nov. 2016 à 16:56
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016 - 17 nov. 2016 à 14:34
Bonjour,

Je m'intéresse depuis quelques temps au langage VBA dans mon travail ( j'essaie de créer des macros pour des applications logistiques).

D'ordinaire, je passe par l'enregistreur de macros mais cette fois-ci je ne peux pas et je bute sur un problème depuis jours.

Je dois créer un planning de présentéisme pour les salariés cependant j'essaie d'y automatiser certaines tâches pour faciliter le travail des RH en période de paie.

Sur mes colonnes il y a les jours de la semaine (éventuellement plusieurs semaines). Sur mes lignes, les individus avec le code horaire qui leur est attribué (le nb d'heure varie en fonction du service dans lequel ils travaillent).

Identité / Code horaire / Lundi - Mardi - Mercredi - Jeudi - Vendredi ......
Tartanpion 1 / J1 / X(h) X(h) X(h) X(h) X(h)
Tartanpion 2 / J2 / X(h) ....
Tartanpion 3 / N / X(h) ....

La légende des codes horaires se situe dans un autre onglet.

L'objectif est simple: la macro doit calculer le différentiel entre le nombre d'heures réellement travaillées et le nombre d'heure stipulées par le code horaire en remplaçant la valeur initiale par le résultat du calcul. Lorsque je lance mon code, la macro s'exécute mais renvoie "FAUX" dans toute les cellules de ma base.

Voici le code:

    

Sub testmacro()

Dim mabase As Range
Set mabase = Range("A3").CurrentRegion
    For ligne = 4 To mabase.Rows.Count
        For colonne = 11 To mabase.Columns.Count
mabase.Cells(ligne, colonne).Value = mabase.Cells(ligne, colonne).Value - FormulaR1C1 = "=index(Code_horaires!R1C1:R4C6,match(mabase.Cells(ligne,7).value,Code_horaires!R1C1:R1C6,0),match(mabase.Cells(3,colonne).value,Code_horaires!R1C1:R4C1,0))"

    Next
        Next
    
End Sub

 


De plus, la structure: "Cells(X,Y).value=Cells(X,Y).value - formule" est elle admissible dans VBA ?

Je joins un exemple du fichier à la question:
http://www.cjoint.com/c/FKkpVDwtk4A

(classeur sans format macro)
test dans l'onglet base test.

Merci à ceux qui prendront le temps de lire mon pavé et de m'apporter leur aide ;)
A voir également:

2 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
10 nov. 2016 à 19:30
Suggestion : toujours ajouter "option explicit" avant le code de la macro, pour faciliter la détection d'erreurs.
Quand VBA voit :
FormulaR1C1 
= "=index(Code_horaires!R1C1:R4C6,match(mabase.Cells(ligne,7).value,Code_horaires!R1C1:R1C6,0),match(mabase.Cells(3,colonne).value,Code_horaires!R1C1:R4C1,0))"
, il compare la variable FormulaR1C1 (non initialisée) à la chaine de caractères qui suit.
Cela est donc évalué comme FAUX.

Si tu veux utiliser une formule, je pense qu'il faut l’enregistrer dans une ou plusieurs cellules. Et la macro utilise la valeur de la cellule où se trouve la formule.
Donc soit tu enregistres la formule (la macro peut faire cela), soit tu crées du code pour faire, dans la macro, en VBA, ce que fait la formule.
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
14 nov. 2016 à 11:29
Bonjour,

Merci d'avoir pris le temps de répondre. Je prends bonne note du conseil concernant l'option explicit.

Donc si je comprend bien, impossible de procéder de la sorte dans avoir de plus solides connaissance en programmation ?

Enregistrer une formule, j'y ai pensé. Cependant, il me faudrait une formule différente pour chaque jour de la semaine et chaque code horaire (5 jours * 3 possibilités = 15 formules différentes !! ) selon moi: là où la macro me permet d'exprimer "match(mabase.cells(ligne,7)...", la formule m'obligera à spécifier une seul et unique cellule (à moins de passer par une fonction Si imbriquée).

Cependant, si je ne trouve pas d'autres solutions, je me résignerai à celle-ci, même si je trouve qu'elle relève plus du bricolage...
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 12/11/2016 à 09:20
Bonjour,
Je rejoins yg_be que je salue sur option explicit auquel je rajoute l'écriture eb début de macro le thread suivant
application.screenupdating=False

qui évite les défilements d'écran et diminue la durée de traitement.

En regardant ton classeur, il me semble que l'analyse du pb n'a pas été poussée:

déjà, tu ne vas pas recommencer ton classeur chaque année et donc , il serait peut-être intéressant d'écrire l'année dans une cellule qq part (code horaire?)
et d'établir des formules dans le tableau d'une semaine.

Le calcul des heures supp est bon mais le seuil des 35h est de + en + remis en cause et donc ton calcul risque d'^tre faux (je te souhaites de rester aux 35h!)...

Actuellement, tu exécutes ta macro Sur 3 semaines: est ce exact ou travailles tu par mois (ta formule colonne I est fausse) : 4 semaines et des poussières).
Le relevé des heures se fait il hebdomadairement ou mensuellement ?

détail: Vois avec ta direction si elle trouverait intéressant de mettre en évidence les jours fériés et ponts.
 Michel
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 12/11/2016 à 10:40
lire 39h au lieu de 35h !!!


j'ai automatisé par formules les dates et semaines en fonction du mois et de l'année mais voir RH:Comment est gérée la dernière semaine du mois ( les 4 semaines et des poussières)? important pour l'automatisation du tableau
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
14 nov. 2016 à 11:35
Bonjour Tarpin
excuses moi d'avoir passé du temps à essayer de t'aider

bonne continuation
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
14 nov. 2016 à 12:06
Bonjour Michel,

Merci pour votre réponse. J'ai oublié d'intégrer le screenupdating, mais ce sera chose faite sur la version finale.

Effectivement, pour les problème des années, on a prévu de fonctionner comme cela mais je ne me suis pas encore penché sur cet aspect...

Concernant le calcul des heures supp, mon responsable a relevé ce soucis, et je vais donc faire en sorte que la valeur numérique des formules soit remplacée par une cellule de référence dans lequel nous renseignerons le nombre d'heures légal hebdomadaire. Nous modifierons la valeur de la dite cellule en cas de besoin.

Nous travaillons effectivement 4 semaines et des poussières (dans le fichier transmis, j'ai simplement 3 semaines (juste pour tester le code) et la formule en I est donc fausse).

Le relevé des heures est effectué quotidiennement par les chefs d'équipe, et mensuellement par le service RH. Notre planning actuel fonctionne de manière hebdomadaire (1 fichier de 52 onglets, 1 par semaine) et nous souhaitons que le nouveau fonctionne de manière mensuelle et donc avec 1 onglet par mois, ce qui pose effectivement le problème des heures supp (calculées à la semaine) et des semaines partielles en fin de mois.

Après discussion avec la gestionnaire de paie, d'un point de vue légal, si il y a des heures supp les derniers jours de Janvier 2017 (par exemple), le 30 et le 31, celles-ci sont calculées sur la semaine courant du 30/01 au 03/02 et payées avec un mois de décalage. La semaine en question sera considérée comme la 5ième semaine de Janvier.

Concernant le reste de l'année, le découpage exhaustif de chaque mois si nous rencontrons ce problème sera fait ultérieurement.
0
Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016 > Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
14 nov. 2016 à 12:07
Bonjour Michel, veuillez m'excusez par ma réponse tardive, je me suis connecté ce matin....
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > Tarpin-perlinpinpin Messages postés 22 Date d'inscription jeudi 10 novembre 2016 Statut Membre Dernière intervention 2 décembre 2016
15 nov. 2016 à 09:48
Bonjour,

avant de passe au VBA, il y a un travail Important sur des formules. et c'est assez compliqué de travailler avec des dates, des semaines et des mois...

Dans ta feuille "test", la présentation change entre la semaine 1 et la semaine 2
Merci de m'envoyer un classeur cohérent.
0