traduction Formule de "DATE" excel en VBA Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
Avatar du membre
leakim
Membre impliqué
Membre impliqué
Messages : 1'809
Appréciations reçues : 13
Inscrit le : 11 décembre 2012
Version d'Excel : 2010 - 2016 FR
Téléchargements : Mes applications

Message par leakim » 30 mars 2015, 22:52

Bonjour,
Je me prends la tête sur une traduction de formule excel en VBA. :scritch:
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
On apprend par des essais/erreurs. L'erreur, serait de ne pas en faire... :noel:
Image
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'727
Appréciations reçues : 453
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 31 mars 2015, 00:38

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
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 15'074
Appréciations reçues : 900
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR
Téléchargements : Mes applications

Message par Steelson » 31 mars 2015, 03:37

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

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
Avatar du membre
leakim
Membre impliqué
Membre impliqué
Messages : 1'809
Appréciations reçues : 13
Inscrit le : 11 décembre 2012
Version d'Excel : 2010 - 2016 FR
Téléchargements : Mes applications

Message par leakim » 31 mars 2015, 11:51

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 :mrgreen:
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
On apprend par des essais/erreurs. L'erreur, serait de ne pas en faire... :noel:
Image
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'727
Appréciations reçues : 453
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 31 mars 2015, 14:04

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
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Avatar du membre
leakim
Membre impliqué
Membre impliqué
Messages : 1'809
Appréciations reçues : 13
Inscrit le : 11 décembre 2012
Version d'Excel : 2010 - 2016 FR
Téléchargements : Mes applications

Message par leakim » 31 mars 2015, 16:12

Bonjour Eriiic et les autres,
J'ai allégé le fichier afin que vous puissiez y jeter un œil. :dacc:
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 :wink:
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 :wink:

Voilà
A vous relire,

Cordialement,

Leakim

Ps: Je ferme ce post pour donner suite sur
http://forum.excel-pratique.com/excel/a ... 62724.html
On apprend par des essais/erreurs. L'erreur, serait de ne pas en faire... :noel:
Image
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message