Traduction Formule de "DATE" Excel en VBA

Bonjour,

Je me prends la tête sur une traduction de formule excel en VBA.

La formule excel combine plusieurs formules excel de date. Elle détermine le numéro de semaine d'une date dont l'année est équivalente à aujourd'hui, le mois est égal au mois qui est présent dans la cellule E9 en texte intégral auquel j'ajoute 1 pour décaler d'un mois et je choisi le premier jour du mois. Cela m'évite de mettre la tête sur le jour de la fin de mois.

Ce qui donne.

=NO.SEMAINE(DATE(ANNEE(AUJOURDHUI());MOIS(1&E9)+1;1))

En fait, dans un code que m'a confectionné Banzaï64, j'ai une boucle qui me permet de répéter toutes les semaines. En partant du principe que l'année par défaut fait 52 semaines, Banzaï64 à rédigé

 ElseIf Me.OpB_allweeks = True Then
          FinBoucle = 52 - Application.WorksheetFunction.WeekNum(monthview_calendrier)
          NbJour = 7

Moi, je souhaite introduire une fonction pour choisir jusqu'à quand je veux que ma boucle se fasse, et pas forcément jusqu'à la fin de l'année.

Je me suis dit que de faire une fonction qui me donne le numéro de la semaine du premier jour du mois qui suit, auquel je soustrais la valeur du numéro de la semaine actuelle, me donnerais ce que je veux...

J'ai donc tenté cela

 FinBoucle = Application.WorksheetFunction.WeekNum(CDate(ComboBox_month.ListIndex + 2 / 1)) - Application.WorksheetFunction.WeekNum(monthview_calendrier)

Mais j'ai du mal à mis retrouver dans les fonctions VBA???

14 Min plus tard:

J'ai tenté cela qui n'ai pas mal mais trés dynamique avec les années...

FinBoucle = Application.WorksheetFunction.WeekNum(DateValue("2015," & ComboBox_month.ListIndex + 2 & ",1")) - Application.WorksheetFunction.WeekNum(monthview_calendrier)

Voilà la situation,

En espérant être clair dans ma demande de traduction.

Cordialement,

Leakim

Bonjour,

Une façon de faire si j'ai bien compris la question :

    Dim datFin As Date, mois As Long, numSem As Long
    mois = 11
    datFin = DateAdd("m", 2, DateSerial(Year(Date), mois, 1))
    numSem = DatePart("ww", datFin, vbMonday, vbFirstFourDays)

Je pense qu'il ne faut pas utiliser num.semaine() qui utilise le système américain : ils ont des semaines ne font pas toujours 7 jours... La dernière semaine peut ne faire 3 jours, et la suivante fera 4 jours au changement d'année. Ca te fait 2 semaines pour 1.

Avec DatePart tu peux calculer le n° de semaine ISO (Européen)

DatePart donne quand même des erreurs sur certaines dates (30 et 31/12/2019 et 29 au 31/12/2031 pour les premières erreurs).

Si c'est crucial il y a d'autres formules plus précises.

De toute façon comme ta problématique est une boucle qui peut être sur 2 années, je ferais plutôt qq chose comme nbSem = (dat1 - Date) \ 7 + 1 pour ne pas à avoir à traiter le changement d'année avec les semaines qui redémarrent à 1.

eric

eriiic a écrit :

Je pense qu'il ne faut pas utiliser num.semaine() qui utilise le système américain : ils ont des semaines ne font pas toujours 7 jours... La dernière semaine peut ne faire 3 jours, et la suivante fera 4 jours au changement d'année. Ca te fait 2 semaines pour 1.

P'tite explication ...

  • toutes les semaines font 7 jours
  • le problème est de savoir quelle est la semaine 1
  • le système américain considère que le 1er janvier fait partie de la semaine 1
  • la norme ISO dit 2 choses : la semaine commence un lundi (employer dans ce cas JOURSEM(ladate;2) et la semaine 1 est celle qui comprend une majorité (dont >=4) de jours de l'année
  • Excel a introduit un paramètre valable à partir de Excel 2010 : NO.SEMAINE(ladate;21)
  • en clair, si le 1er de l'an tombe un lundi, mardi, mercredi ou jeudi, alors cette semaine sera la numéro 1, sinon ce sera la semaine 52 ou 53 de l'année précédente
  • mais la semaine entière sera estampillée 52, 53 ou 1

Bonjour à vous et merci pour votre sollicitude.

Les spécifications pour harmoniser le comptage des semaines et très pertinent, pour autant mon souci est le fait de calculer la différence entre les semaines. La semaine du terme (date de fin) et la semaine de programmation (date de début), donc si les semaines sont calculées de la même façon c'est l'essentiel.

Je suis arrivé à cela et çà semble fonctionner, mais peut-être il y a-t-il une rédaction plus VBA

FinBoucle = Application.WorksheetFunction.WeekNum(DateSerial(Year, ComboBox_month.ListIndex + 2, 0)) - Application.WorksheetFunction.WeekNum(monthview_calendrier) - 1

Merci encore pour vos lectures et commentaires.

A me redire,

Leakim

Bonjour,

Tu n'as pas noté que weeknum sans utiliser le 2nd paramètre à 21 (non compatible excel 2003) utilise le système américain où en fin d'année tu as 2 semaines pour 1 ce qui va fausser ton compte.

Comme je te disais je verrai plutôt un truc comme :

for i = 1 to (datFin - Date) \ 7 + 1

pour gérer simplement le nombre de boucles.

Sinon il faut que tu gères le changement d'année en tenant compte du fait que tu as des années à 52 semaines et d'autres à 53 (semaines ISO).

eric

Bonjour Eriiic et les autres,

J'ai allégé le fichier afin que vous puissiez y jeter un œil.

De fait, le calendrier est un calendrier année civile donc pas besoin de faire attention aux valeurs de fin ou début d'année.

Reste que si vous voyez comment faire pour compléter, faites-vous plaisir

Autre question:

Je me demandai, comment faire pour que lorsque je planifie tout les mois, je puisse avoir la valeur du jour plutôt que le numéro du jour les mois suivants.

De fait, si je choisis le mardi 3 mars et que je veux que le RDV se répète pendant trois mois soit jusqu'en juin la date du premier mardi n'est pas le 3 mais le 2.

Actuellement, la répétition se fait tout les 3 du mois... donc avec des décalages de journées

Si vous voyez comment faire pour compléter, faites-vous plaisir

Voilà

A vous relire,

Cordialement,

Leakim

Ps: Je ferme ce post pour donner suite sur

https://forum.excel-pratique.com/excel/amelioration-d-un-fichier-calendrier-de-reservation-t62724.html

Rechercher des sujets similaires à "traduction formule date vba"