Menu

Le modulo année [Résolu]

robbybasch 89 Messages postés lundi 14 juillet 2014Date d'inscription 21 septembre 2017 Dernière intervention - 12 juil. 2017 à 18:00 - Dernière réponse : robbybasch 89 Messages postés lundi 14 juillet 2014Date d'inscription 21 septembre 2017 Dernière intervention
- 14 juil. 2017 à 18:32
Bonjour,
Faire un modulo dans une feuille excel je sais faire. Mais ce dont je n'arrive pas à finaliser avec des recherches sur ce site, c'est établir une variable avec le nb jours année. (bissextile = 366, normal = 365)
Cela pourrait donner en mode excel
Si(mod(année; 4)=0;NBJOURS=366;NBJOURS=365)
Je voudrais la même chose en vba
Est ce possible ?
Merci
Robby


Afficher la suite 

9 réponses

Répondre au sujet
NHenry 14135 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 24 avril 2018 Dernière intervention - 12 juil. 2017 à 19:55
0
Utile
YEAR(now) pour l'année
IIF( pour le IF en une ligne
Commenter la réponse de NHenry
0
Utile
1
Bonjour Robby,

Attention : il manque une partie dans ta condition !  ;)

Une année est bissextile si elle est divisible par 4,
sans être divisible par 400.

Exemple pour l'année 2000 : 2000 / 400 = 5 tout rond
(nombre entier sans décimales) => même si 2000 est
divisible par 4, ce n'est pas une année bissextile !

Tu peux vérifier : sur le calendrier 2000 : pas de 29 février !
ce sera idem en 2400, mais d'ici là, t'as l'temps d'voir venir !  ;P
Bien sûr, en 1600, y'avait pas eu non plus de 29 février.  ;)

Tu m'diras, c'est tous les 400 ans, alors... mais on sait jamais :
si t'es en réalité Duncan MacLeod de la série Highlander.  ;)

https://fr.wikipedia.org/wiki/Duncan_MacLeod

Fichier Excel 2007 : https://mon-partage.fr/f/c1IJTOtE/

Fais Ctrl e et dis-moi ce que tu en penses.

Cordialement.
 
 
Edit : J'ai bêtement oublié d'utiliser modulo ; de plus, je m'étais trompé :
2000 est bien une année bissextile, car la règle est la suivante :

Une année est bissextile si elle est divisible par 400 ou
(si elle est divisible par 4 sans être divisible par 100).

⚠  Il ne faut donc pas utiliser mon code VBA précédent !
 
Commenter la réponse de lucien
yg_be 5307 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 25 avril 2018 Dernière intervention - Modifié par yg_be le 12/07/2017 à 22:22
0
Utile
bonsoir, je suggère ceci pour le code VBA:
Function nbjour(annee As Long) As Integer
nbjour = DateSerial(annee + 1, 1, 1) - DateSerial(annee, 1, 1)
End Function


La formule serait donc
=nbjour(annee)


Les années multiples de 100 ne sont pas bissextiles, sauf si elles sont des multiples de 400. Donc 2000 est bissextile, mais 1900 et 2100 ne le sont pas.

qu'en penses-tu?
nous ne voyons pas ce que tu vois, nous ne savons pas ce que tu sais. 
si tu ne nous donnes pas d'information, nous ne pouvons pas les deviner. 
Commenter la réponse de yg_be
0
Utile
Bonjour Robby,

Une année est bissextile si elle est divisible par 400 ou
(si elle est divisible par 4 sans être divisible par 100).

Mon ancien code VBA était erroné ; voici le nouveau,
corrigé et optimisé :


Option Explicit


Function IsBissextile(An As Integer) As Boolean
  ' vrai si An : divisible par 400 ou (divisible par 4 sans être divisible par 100)
  IsBissextile = (An Mod 400 = 0) Or (An Mod 4 = 0 And An Mod 100 > 0)
End Function


Sub TestAn(An As Integer)
  Dim NbJours As Integer: NbJours = 365 - IsBissextile(An)
  MsgBox "An " & An & " bissextile : " & IsBissextile(An) _
    & vbLf & "=> NbJours = " & NbJours & " jours"
End Sub


Sub Essai()
  Dim An As Integer
  TestAn 1900
  For An = 1996 To 2003
    TestAn An
  Next An
  TestAn 2100: TestAn 2400
End Sub


Ce qui donnera :

An Bissextile Nombre de jours
1900 Faux 365
1996 Vrai 366
1997 Faux 365
1998 Faux 365
1999 Faux 365
2000 Vrai 366
2001 Faux 365
2002 Faux 365
2003 Faux 365
2100 Faux 365
2400 Vrai 366

Lis aussi le message de yg_be du 12 juillet à 22:22 ; sa fonction nbjour()
calcule ce nombre de jours : 1er janvier (An + 1) - 1er janvier An
(An étant l'année transmise).

Cette méthode est plus simple que la mienne, et elle est valable pour toutes
les années comprises par Excel : de 1900 à 9999 ; donc pour une année qui
est avant 1900, il faut utiliser la méthode plus générale indiquée au début :
celle qui est utilisée par ma nouvelle fonction IsBissextile().

Cordialement
 
Commenter la réponse de lucien
robbybasch 89 Messages postés lundi 14 juillet 2014Date d'inscription 21 septembre 2017 Dernière intervention - 13 juil. 2017 à 16:05
0
Utile
Bonjour à tous. Je vous remercie de votre contribution, mais je veux intégrer nbjour dans une macro déjà réalisée ou j'apporterais d'autres modifs. (On y va pas à pas ... je débute en vba).
Voici la macro :
Private Sub Kommentaire()




Dim counter As Long, lili As Long, Col_commentaire As Long, colTAV As Long, Ncol_tav As Long, Ncell As Long,
lili = 8
Ncol_tav = 4

Do
Col_commentaire = Val(InputBox("colonne à traiter 3 ou 5 ou 7 ou 9 ou 11 ou 13 ou 15 ou 17 ou 19 ou 21 ou 23 ou 25 ou 29", , "3"))


Loop Until Col_commentaire = 3 Or Col_commentaire = 5 Or Col_commentaire = 7 Or Col_commentaire = 9 Or Col_commentaire = 11 Or Col_commentaire = 13 Or Col_commentaire = 15 Or Col_commentaire = 17 Or Col_commentaire = 19 Or Col_commentaire = 21 Or Col_commentaire = 25 Or Col_commentaire = 27 Or Col_commentaire = 29
For n_cell = 3 To 33 Step 2
If n_cell = Col_commentaire Then
colTAV = Ncol_tav
End If
Ncol_tav = Ncol_tav + 1
Next n_cell
'____________________________________________________________
'partie ou je veux le calcul de nbjour---------------------------------
'____________________________________________________________
For counter = 1 To nbjour

'si année normale la valeur doit etre nbjour= 365
'si année bissextile la valeur doit etre nbjour=366
Tout cela doit pouvoir se faire en interne. Transparent pour l'ulisateur.. Le code vba va chercher l'année du PC, fait sa sauce interne et rejette nbjour=365 ou 366 selon que l'année est bissexctile ou non..

If .Cells(counter, Col_commentaire) = 9 Then
If Not Worksheets("TAV").Cells(lili, colTAV).Comment Is Nothing Then
.Cells(counter, Col_commentaire + 1) = Worksheets("TAV").Cells(lili, colTAV).Comment.Text
End If
End If
lili = lili + 1
Next counter
'___________________________________________________________
et je ne vois pas comment mettre le code de yg_be dans la macro. Excusez moi je ne suis pas expert.. Le reste de la macro fonctionne très bien.. avec votre aide bien entendu. Je vous en remercie.
CDL
Robby
Commenter la réponse de robbybasch
robbybasch 89 Messages postés lundi 14 juillet 2014Date d'inscription 21 septembre 2017 Dernière intervention - 13 juil. 2017 à 16:24
0
Utile
1
Rebonjour
Ne vous prenez pas la tete..
Avec year(now) de Henry, et des if en cascade j'ai réussi à gerer jusqu'à la prochaine année bissextile.
Cela pousse à dans 7 ans ... on a le temps de voir..
Merci encore à tous
Robby
CDL
yg_be 5307 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 25 avril 2018 Dernière intervention - 13 juil. 2017 à 16:31
ou bien:
annee=year(now)
nbjour = DateSerial(annee + 1, 1, 1) - DateSerial(annee, 1, 1)
Commenter la réponse de robbybasch
robbybasch 89 Messages postés lundi 14 juillet 2014Date d'inscription 21 septembre 2017 Dernière intervention - 14 juil. 2017 à 18:32
0
Utile
Bonsoir yg_be. J'arrive que maintenant j'essaie cela de suite. Beaucoup plus simple que mes if..
CDL
Robby
Commenter la réponse de robbybasch