Excel - Partie de fonction qui se répète

Fermé
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 - 31 août 2010 à 22:19
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 - 3 sept. 2010 à 23:21
Bonjour,
J'ai la fonction suivante :

Function avancement_dispo(ByVal date_situation As Date, ByVal date_av_max As Variant, ByVal annee_dmax As Variant, ByVal mois_dmax As Variant, ByVal jour_dmax As Variant, ByVal deb_dispo, ByVal annee_deb As Variant, ByVal mois_deb As Variant, ByVal jour_deb As Variant, ByVal fin_dispo As Variant, ByVal annee_fin As Variant, ByVal mois_fin As Variant, ByVal jour_fin As Variant, ByVal test As Integer) As Date
'Variable test : Lorsque test a la valeur 0 = soit aucune dispo soit une seule dispo
'Lorsque test a la valeur 1 = L'utilisateur veut saisir une 2eme dispo
'Cette variable permet lors de la saisie d'une 2eme dispo de mémoriser la dernière date d'avancement pour ensuite inclure la 2eme dispo
Dim annee_duree As Variant
Dim mois_duree As Variant
Dim jour_duree As Variant
Dim annee_av As Variant
Dim mois_av As Variant
Dim jour_av As Variant
Dim an_dispo As Variant
Dim ms_dispo As Variant
Dim jr_dispo As Variant
Dim date_av As Date
Dim date_av_2 As Date
Dim i As Integer

If test > 0 And deb_dispo = "" Then
avancement_dispo = date_dispo
Exit Function
End If

If test > 0 And fin_dispo = "" Then
avancement_dispo = date_dispo
Exit Function
End If

'Si pas de dispo alors date avancement = date à la durée max
If deb_dispo = "" And fin_dispo = "" And test = 0 Then
avancement_dispo = date_av_max
Exit Function
End If

'Affichage message si date incohérente
If test = 0 And deb_dispo > date_av_max Then
MsgBox ("Le début de dispo doit être antérieure à la date d'avancement à la durée max !")
Exit Function
End If

If test = 0 And deb_dispo < date_situation Then
MsgBox ("Le début de dispo doit être postérieure à la date de dernière situation !")
Exit Function
End If

'-----------------------------------Calcul de la duree d'une dispo----------------------------------
'Calcul des jours
If jour_fin < jour_deb Then
mois_fin = mois_fin - 1
jour_fin = jour_fin + 30
End If
jour_duree = jour_fin - jour_deb

'Calcul des mois
If mois_fin < mois_deb Then
annee_fin = annee_fin - 1
mois_fin = mois_fin + 12
End If
mois_duree = mois_fin - mois_deb

annee_duree = annee_fin - annee_deb

'-------------------------Calcul date d'avancement si plus d'une dispo--------------------------------
'Ajout de la durée de dispo à la 1ere date de dispo
If test > 0 Then

jr_dispo = jour_dispo + jour_duree
For i = 1 To 2
If jr_dispo > 29 Then
jr_dispo = jr_dispo - 30
ms_dispo = ms_dispo + 1
End If
Next


ms_dispo = mois_dispo + mois_duree

For i = 1 To 2
If mois_dispo > 11 Then
ms_dispo = ms_dispo - 12
an_dispo = an_dispo + 1
End If
Next

an_dispo = annee_dispo + annee_duree

date_av_2 = DateSerial(an_dispo, ms_dispo, jr_dispo)

jour_dispo = jr_dispo
mois_dispo = ms_dispo
annee_dispo = an_dispo
date_dispo = date_av_2
avancement_dispo = date_av_2

Exit Function

End If
If test = 0 Then
'-------------------Calcul date d'avancement si une seule dispo------------------------------
'Ajout durée de dispo à la date av duree max

jour_av = jour_dmax + jour_duree
For i = 1 To 2
If jour_av > 29 Then
jour_av = jour_av - 30
mois_av = mois_av + 1
End If
Next

mois_av = mois_av + mois_dmax + mois_duree
For i = 1 To 2
If mois_av > 11 Then
mois_av = mois_av - 12
annee_av = annee_av + 1
End If

Next

annee_av = annee_av + annee_dmax + annee_duree

annee_dispo = annee_av
mois_dispo = mois_av
jour_dispo = jour_av

'Conversion en format date
date_av = DateSerial(annee_av, mois_av, jour_av)
date_dispo = date_av
avancement_dispo = date_av
End If

End Function


Explication : Calcul date d'avancement incluant 1 ou plusieurs dispo.

Tout fonctionnaire avance à une durée max, certain avanceront 2ans et 6 mois par exemple.

Mais, si le fonctionnaire prend une dispo, sa date d'avancement est reporté à autant de temps que dure sa dispo. Exmple : Admettons, il avance à la duree max le 01/01/2000. Il prend une dispo du 01/10/1999 au 01/11/1999 (=durée de 1mois). Finalement, il avancera le 01/02/2000. //Voir calcul date d'avancement si une seule dispo//

un bouton permet d'archiver la dispo en cours et incrémente la valeur test.

S'il prend une 2eme dispo, du 01/11/1999 au 01/12/1999, il avancera le 01/03/2000. // Voir caclul date d'avancement si plus d'une dispo// Le souci, est que lorsque je souhaite saisir plus d'une dispo, la partie "calcul date d'avancement si plus d'une dispo" boucle 2 fois.

Qui peut m'aider ???!! Je vais mettre une copie du fichier dans quelques minutes


A voir également:

13 réponses

Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
31 août 2010 à 22:25
https://www.cjoint.com/?iFwxH5d6Cc

Voila, c'est la feuille 5_calcul_prochain_ae

Merci !!
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
Modifié par eriiic le 31/08/2010 à 22:39
Bonjour,

Déjà tu ne devrais passer que des dates à ta fonction, et si tu as besoin du jour, mois ou année le récupérer en vba. Ca sera beaucoup plus léger...

Est-ce qu'une dispo est toujours du 1er-1 au 1er du mois ?
En fait explique les règles et le mode de calcul car j'ai l'impression que tu as bien compliqué la réponse

eric
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 00:25
Bonjour !!

Les début et fin de dispo peuvent se faire en cours de mois, fin de mois, ca n'a pas d'importance
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 00:27
On a une date d'avancement prévu.Un début de dispo et une fin de dispo. Et on souhaite obtenir la date d'avancement réelle (colonne X).

Pour ce faire, il faut ajouter la durée de dispo à la date d'avancement prévu.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 00:36
Pour calculer la durée de dispo :
Exemple 1: debut : 01/01/2000 fin : 16/01/2000
soustraire les jours : FIN-DEBUT = 16-1=15
soustraire les mois : 1-1 = 0
soustraire les années : 2000-2000=0
la durée de dispo est donc de 15 jours.

Exemple 2 : debut : 26/03/1999 fin : 15/02/2002
soustraire les jours : 15-26 = impossible donc on ajoute 30 au jour de fin 30+15 =45
on retranche le mois de fin de 1, on obtient donc 2-1 =1
45-26=19
soustraire les mois1-3 = impossible donc ajoute 12 au mois de fin 12+2=14
on retranche l'année de fin de 1, on obtient donc 2002-1=2001
14-3 = 11
on soustrait les années : 2001-1999 = 2
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 00:37
La durée de dispo est de 2 an 11 mois et 19 jours.
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 00:45
Ajout de la durée de dispo à la date d'avancement prévu (colonne O)

Avancement prévu le :
Exemple 1 : 13/01/2000
Additionner les jours : 19+13=32 impossible donc 32-30=2 et on ajoute 1 aux mois
Additionner les mois : 11+1=12 12+1=13 impossible donc 13-12=1 et on ajoute 1 aux années
Additionner les années : 2+2000=2002 2002+1=2003

La date d'avancement réelle : 02/01/2003
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 00:54
S'il y a une 2eme dispo, (on parle de 2eme dispo quand celle ci débute au plus tard à la date d'avancement réelle). Bref ! S'il y a une 2eme dispo, il ne faut plus ajouter la durée de dispo à la date d'avancement prévu (colonne O) mais il faut ajouter cette durée à la dernière date d'avancement réelle.

C'est ce que j'ai essayé de faire dans "Calcul si plus d'une dispo". Quand j'entre une première dispo, ca me donne bien la date d'avancement réelle. Quand j'entre une seconde dispo, ca me donne bien la date d'avancement réelle. Mais quand j'archive cette dispo, la date d'avancement réelle change alors que je n'ai rien saisi en date de début et fin de dispo.
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
Modifié par eriiic le 1/09/2010 à 09:59
Re,

C'est TA méthode de calcul ou la méthode de calcul officielle ?
Parce que, par formule, tu peux avoir le nombre de jour avec :
=MOD(JOUR(V11)-JOUR(U11);30)
le nombre de mois avec :
=(ANNEE(V11)-ANNEE(U11))*12+MOIS(V11)-MOIS(U11)-(JOUR(U11)>JOUR(V11))
et te fabriquer ta date avec :
=date(annéePrévue;moisPrévu+moisCalculés;jourPrévu+joursCalculés)

Par contre pour ton exemple 2 je trouve 19 jours et 34 mois (et non 35 mois)

Et pour ton soucis de double passage dans la boucle n'ayant aucune idée de comment utiliser ta feuille je ne sais pas.
Ce qui me gène c'est que je ne vois qu'une seule zone de saisie pour les dispo (?) par ligne et qu'une ligne semble correspondre à 1 agent.

eric
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 20:05
Bonjour,

Ce n'est pas ma méthode, j'avais pensé utiliser les formules d'excel, mais ce n'est pas possible car "ils" ont un leur façon de calculer.

Mais si ce que tu me proposes me permet d'avoir les memes résultats que la méthode décrite plus haut, je suis preneuse.

Tu as vu qu'il y a 2 boutons sur ma feuille, "Archiver DERNIERE SITUATION" et "Archiver Position".

Bouton "Archiver DERNIERE SITUATION" : Lorsque l'agent atteint la date d'avancement réelle, l'utilisateur doit cliquer sur ce bouton et toute (presque) la ligne sera copiée dans une autre feuille du classeur.

Bouton "Archiver Position" : Admettons, un agent prend une disponibilité, appelons la DISPO 1, on saisi les infos dans "POSITION A PRENDRE EN COMPTE". On obtient donc une date d'avancement réelle, appelons la REEL 1.
Si cet agent souhaite prendre une seconde disponibilité, appelons la DISPO 2, l'utilisateur doit alors cliquer sur le bouton et les infos concernant uniquement la dispo (colonnes "position", "cat", "début", "fin") seront copiées dans une autre feuille. Donc, les cellules ("position", "cat", "début", "fin") seront vides, et la cellule test incrémentée de 1 . Et la date d'avancement réelle sera toujours REEL 1.
Lorsque l'utilisateur saisira DISPO 2, il faut que la durée de DISPO 2 soit ajouté à REEL 1. Et c'est la que j'ai un souci. Je ne parviens pas à gérer la saisie d'une seconde DISPO ....

PS : Merci de me répondre
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
1 sept. 2010 à 21:29
Re,

Ton code est un peu dur à suivre, j'ai essayé en pas à pas mais je me fais éjecter car il manque des saisies.

A la place de ta fonction j'ai mis une formule en X9 (calcul sur les données de la ligne 4 pour que tu puisses comparer).
Si les réponses aux différents tests sont correct, remplace par ma formule et re-teste ton programme.
Si c'est bon on saura que c'est le code de ta fonction qui pêche et on pourra le reprendre (ou tu restes avec la formule si ça t'es autorisé)

Si l'erreur est dans le code d'appel à la fonction je crois que je ne pourrais pas t'aider plus.
http://www.cijoint.fr/cjlink.php?file=cj201009/cijt9Pwvp4.xls

eric
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 21:51
Pour pouvoir archiver il faut renseigner toute la ligne ou mettre des zéros, je teste ta formule et te répond
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 22:07
Re,

En ce qui concerne ta formule, dans beaucoup de cas ca marche mais pas toujours,
Date avancement prévu : 18/05/2010
deb dispo : 21/09/2009
fin dispo : 20/08/2011
avancement réel : 17/04/2012

avec ta formule l'avancement reel : 16/04/2012
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 22:08
Refaire ma fonction n'est pas un souci, mais il faut garder le meme mode de calcul.
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
1 sept. 2010 à 22:33
C'est ma fonction qui a un souci. Tu vois la colonne test (colonne W). A chaque fois qu'on clique sur "Archiver Position", il s'incrémente de 1.

Dans la partie « Caclul date d'avancement si plus d'une dispo »
If test>0 then
Partie 1
Else
Partie 2
end if

La Partie 2 s'exécute si test =0, donc aucune dispo n'a encore été saisi.

Si ce n'est pas le cas, Partie 1 s'exécute, donc si on a déjà saisi une dispo.

Dans les 2 parties le mode de calcul est le même. La seule différence c'est :
Partie 1, pour calculer la date d'avancement reelle on part de la dernière date d'avancement réelle.

Partie2, pour calculer la date d'avancement reelle on part de la date d'avancement prévu.

Partie 1 s'exécute tant qu'on a pas cliqué sur le bouton « Archiver DERNIERE SITUATION ».

Mon souci est le suivant, j'archive une 1ere dispo, la date d'avancement reelle reste la meme.
Je saisi une 2eme dispo, j'obtient donc une date d'avancement reelle. Quand j'archive cet dispo, ma date d'avancement réelle change alors qu'elle ne devrait pas. Le souci c'est que Partie 1 s'exécute 2fois au lieu d'une fois, et je ne sais pas pourquoi.
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
1 sept. 2010 à 23:21
Je ne vois aucune variable dans la fonction qui s'appelle 'date d'avancement reelle'
Ca serait bien d'utiliser leur vrai nom (quitte à compléter par une explication sur le rôle)
Avec toi c'est comme conduire les yeux bandés...
Si elle est déclarée à l'intérieur de la fonction essaie en la déclarant à l'extérieur qu'elle ne soit pas réinitialisée à chaque appel.
Et contrôle que le reste du code n'utilise pas le même nom en la modifiant...
0
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 949
Modifié par Mytå le 2/09/2010 à 02:36
Salut le forum

Pour faire l'extraction, voici les trois fonctions VBA

Pour la jour.....Day(Date)  
Pour le mois.....Month(Date)  
Pour l'année.....Year(Date)  

Mytå
Merci de donner suite à votre question, nous ne sommes pas des robots...
Versions installées [MsProject 2003(FR), Excel 2003-2007(FR)]
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
2 sept. 2010 à 03:11
Cool Merci Myta !!
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
3 sept. 2010 à 06:59
Bonjour,

eriiic - 1 sep 2010 à 23:21
Je ne vois aucune variable dans la fonction qui s'appelle 'date d'avancement reelle'
Ca serait bien d'utiliser leur vrai nom (quitte à compléter par une explication sur le rôle)
Avec toi c'est comme conduire les yeux bandés...
Si elle est déclarée à l'intérieur de la fonction essaie en la déclarant à l'extérieur qu'elle ne soit pas réinitialisée à chaque appel.

Je crois que tu avais la réponse ici : tes variables sont déclarées à l'intérieur de la fonction.
Ca ne suffira peut-être pas mais déjà tu es sûre que ça ne pouvait pas fonctionner.

Par ailleurs ça serait bien que tu lises attentivement les réponses et que tu en tiennes compte. Déjà ici je te demandais d'utiliser les noms des variables, sinon ce que tu dis est incompréhensible...

eric
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
3 sept. 2010 à 23:16
http://www.cijoint.fr/cjlink.php?file=cj201009/cijMIq6F2K.xls
0
Tehani_t Messages postés 240 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 20 décembre 2011 21
3 sept. 2010 à 23:21
Voici un fichier, j'ai simplifié du moins j'ai essayé. Tu as une fonction avance_reel qui permet de calculer la date reelle d'avancement en colonne X (=variable date_av_reel)

La fonction ne permet de gérer qu'une seule dispo. On saisi dans le fichier les début et fin (colonne U et V) et la date correspondante s'affiche en X.

Quand je clique sur "Archiver Position", les début et fin seront collées dans une autre feuille.
Ce que j'aimerais avoir, c'est, lorsque je dois saisir une nouvelle dispo, que la duree de cette dernière s'ajoute à date_av_reel.
0