[VBA]Diviser un nombre de moi par deux
Résolu
yacleouf
Messages postés
438
Date d'inscription
Statut
Membre
Dernière intervention
-
yacleouf Messages postés 438 Date d'inscription Statut Membre Dernière intervention -
yacleouf Messages postés 438 Date d'inscription Statut Membre Dernière intervention -
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 :
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
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
A voir également:
- [VBA]Diviser un nombre de moi par deux
- Nombre de jours entre deux dates excel - Guide
- Diviser photo instagram gratuit - Guide
- Diviser pdf - Guide
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
3 réponses
Une formule vaut mieux qu'un discours, ceci devrait convenir :
Patrice
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
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
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
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?
merci encore
Google is your friend!
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!
je vous fait un retour par la suite
Je vous en remercie !