[VBA]Diviser un nombre de moi par deux

Résolu/Fermé
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 - 1 juil. 2010 à 19:27
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 - 2 juil. 2010 à 09:24
Bonjour,
je suis entrain de créer une application basé sur des calculs de dates, et la je me trouve coincé face à un calcul assez ... bizarre :)
voici les données :
en A1 l'utilisateur donne une date (par exemple 01/07/2010)
en A2 il donne un nombre compris entre 12 et 18 (qui correspond à une période en mois)
en A3 le résultat...
mon calcul doit enfaite diviser le nombre donnée en A2 par 2 exemple (15/2= 7,5) et ce résultats doit être retranscrit en nombre de jour/mois, j'additionne ce résultat à la date pour obtenir le jour exacte 7mois et demi plus tard (au jour prés :) )je vous donne une ébauche de ce que j'ai fait :

Dim dat1 As Date    ' Déclare les variables.
Dim IntervalType As String
Dim Num As Integer
Dim Msg1
IntervalType = "m"  ' "m" indique l'intervalle en mois.
dat1 = ActiveWorkbook.ActiveSheet.Range("E10").Value
If textbox1.Value < 12 Then
MsgBox ("la durée ne doit pas être inférieure à 12 mois !")
Exit Sub
End If
If textbox1.Value > 18 Then
MsgBox ("la durée ne doit pas être suppérieure à 18 mois!")
Exit Sub
End If
If textbox1.Value > 12 < 18 Then
Num = ActiveWorkbook.ActiveSheet.Range("E12") / 2
End If
Msg1 = DateAdd(IntervalType, Num, dat1)
ActiveWorkbook.ActiveSheet.Range("H14").Value = Msg1

ce code est fonctionnel ! mais si on donne comme date 01/07/2010 et que l'on donne un nombre de mois impair (13 par ex) on se retrouve au 01/01/2011...
si vous avez besoin de plus d'explication je vous écoute




3 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
2 juil. 2010 à 01:13
Une formule vaut mieux qu'un discours, ceci devrait convenir :

Dim D1 As Date 'Date située à (partie entiere de N/2) mois après la date initiale
Dim D2 As Date 'Si N est pair = D1 sinon exactement un mois après D1
Dim D3 As Date 'Résultat : date située au milieu entre D1 et D2

D1 = DateSerial(Year([E10]), Month([E10]) + Int([E12] / 2), Day([E10]))
D2 = DateSerial(Year([E10]), Month([E10]) + Int(([E12] + 1) / 2), Day([E10]))
D3 = D1 + (D2 - D1) / 2


Patrice
2
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
2 juil. 2010 à 01:28
PS : Comme je l'ai dis plus tôt il n'y a pas vraiment de jour exact, tout est question de référence et de coutumes. Il serait intéressant de connaitre la finalité de ce calcul pour déterminer la meilleure méthode.
0
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 39
2 juil. 2010 à 09:00
merci pour votre réponse, je vais effectuer des test tout de suite,
je vous fait un retour par la suite
0
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 39
2 juil. 2010 à 09:24
Parfait sa marche, j'ai juste eu à ajouté une ligne pour traiter le résultat.
Je vous en remercie !
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
1 juil. 2010 à 21:28
1) Num est une variable de type integer (en français : nombre entier), elle ne peut donc pas prendre la valeur 7,5. pour cela il faut un type Single, Double, Decimal, ...

2) la fonction mois ("m") correspond à des mois entier. En effet, il est difficile de déterminer la durée correspond à 0,5 mois (elle varie en fonction du mois : ½ mois de janvier ne correspond ni à ½ mois de février ni à ½ mois d'avril !)

3)VBA est puissant mais il n'est pas devin !

En d'autres termes, il ne peut pas préjuger du résultat que vous attendez : Est-ce que 6 mois ½ après le 1/7/10 est le 14, le 15 ou le 16/1/11 ?
Sachant que dans une année non bissextile, le 1er semestre comprend 3 jours de moins que le second on comprend rapidement qu'en terme de calendrier, la notion de ½ (mois ou année) est sujette à différentes interprétations !

Pour obtenir le dernier ½ mois, une solution acceptable consiste à calculer le nombre de jours exact entre le jour J du dernier mois entier et le même jour du mois suivant et à ajouter au jour J du dernier mois la moitié de cette différence.

Autre possibilité, si la précision du ½ mois n'est pas requise on peut aussi considérer que ½ mois = 15 jours !

Dans les deux cas il faut faire un calcul en nombre de jours.

Pour appréhender la complexité des calculs liés au calendrier je vous conseille l'excellentissime site de Claus Tondering (en anglais et en danois) :

https://www.tondering.dk/claus/cal/calendar29.html

Cordialement
Patrice
0
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 39
Modifié par yacleouf le 1/07/2010 à 23:05
Bonsoir, tout d'abord merci de votre réponse,
par contre j'ai du ma à suivre, j'ai compris que les mois était des entier et que pour VBA il était difficile de lui faire comprendre la notions de 5 mois ½, je suis en ce moment entrain d'essayer plusieurs choses, mais aucune ne marche car pour la solution des mois a 30 jours (comme pour les années comptable) cette solution ne me convient pas en effet j'ai vraiment besoin d'arriver au jour exact ;)
j'ai essayer ceci qui ne marche pas évidement ... mais est ce que je serait sur une piste?

DateSerial(year for ("E10") + month as E12 / 2,Day as E10)


merci encore
Google is your friend!
0