Le modulo année

Résolu/Fermé
robbybasch Messages postés 100 Date d'inscription lundi 14 juillet 2014 Statut Membre Dernière intervention 19 août 2022 - 12 juil. 2017 à 18:00
robbybasch Messages postés 100 Date d'inscription lundi 14 juillet 2014 Statut Membre Dernière intervention 19 août 2022 - 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


7 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
12 juil. 2017 à 19:55
YEAR(now) pour l'année
IIF( pour le IF en une ligne
0
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.
 
0
 
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 !
 
0
yg_be Messages postés 22733 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 avril 2024 1 477
Modifié le 12 juil. 2017 à 22:22
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. 
0
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
 
0

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

Posez votre question
robbybasch Messages postés 100 Date d'inscription lundi 14 juillet 2014 Statut Membre Dernière intervention 19 août 2022
13 juil. 2017 à 16:05
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
0
robbybasch Messages postés 100 Date d'inscription lundi 14 juillet 2014 Statut Membre Dernière intervention 19 août 2022
13 juil. 2017 à 16:24
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
0
yg_be Messages postés 22733 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 avril 2024 1 477
13 juil. 2017 à 16:31
ou bien:
annee=year(now)
nbjour = DateSerial(annee + 1, 1, 1) - DateSerial(annee, 1, 1)
0
robbybasch Messages postés 100 Date d'inscription lundi 14 juillet 2014 Statut Membre Dernière intervention 19 août 2022
14 juil. 2017 à 18:32
Bonsoir yg_be. J'arrive que maintenant j'essaie cela de suite. Beaucoup plus simple que mes if..
CDL
Robby
0