Bonjour,
J’aimerai récupérer le n° de mois en VBA à partir d’un n° de semaine et d’une année : 2016-sem21.
Quelqu’un pourrais m’aider svp ??
Bonjour,
J’aimerai récupérer le n° de mois en VBA à partir d’un n° de semaine et d’une année : 2016-sem21.
Quelqu’un pourrais m’aider svp ??
Bonjour
Prends un café, puis reviens après avoir réfléchi à la durée d'une semaine (elle peut commencer à l'intérieur d'un mois et se terminer à l'intérieur du mois suivant).
Ta question est donc à reformuler avec plus de précision.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
Pour les semaines à cheval, j'aimerais le mois où il y a le plus de jours dans ces semaines là.
Je m'exprime mal donc pour exemple : semaine 13 2016 il y a 3 jours en mars et 2 en avril j'aimerai donc qu'il me récupère le mois de mars.
Pour les semaines complètes d'un mois tel que : semaine 14 2016 les 5 jours sont en avril je veux qu'il me récupère le mois d'avril.
Ah ! Que voilà une définition rigolote !
Mais on va jouer ce jeu-là :
Il commence par la définition de la date de début de la première semaine de l'année concernée (le reste n'est qu'arithmétique).
Questions, donc :
1) sais-tu déterminer cette date ?
2) si oui : comme,t t'en sers-tu ensuite ? Si non : comment entrevois-tu de t'en servir ensuite ? (juste pour "voir" si tu "vois" bien).
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
Salut, via une recherche ?
re
bonjour
perso les dates et mois avec excel ca fait 3
mais si je raisonne logiquement
semaine 13 = 13*7 jour de l'année
on ajoute donc ce nombre a la date du 01/01/xxxx
on obtiens ainsi une date complete
il est facile apres d'en récupérer le mois avec "month"
et si le jour correspond a "lundi,"mardi" et.... on devine aisément si l'on doit enlever ou pas 11 au mois obtenu
je le redis c'a n'est qu'une idée
une base
format(unedate,"ddd") nous donne le jour en texte
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Sub test() 'nombre de jour = 13 semaines * 7 jour jour = 13 * 7 mois = Month(CDate("01/01/2016") + jour) ' on ajoute ce nombre de jour a la date du 1 1 2016 avec la fonction month on obtient le mois days = Weekday(CDate("01/01/2016") + jour) weekday nous donne si je ne me trompre pas le jour de la semaine (1,2,3,et....) MsgBox Format("01/" & mois & "/2016", "mmmm") & " (" & mois & ")" End Sub
je suis certain qu'avec ca on doit pouvoir trouver le bon truc
re
de même que encore plus facile finalement
si le mois de (la date obtenu -4 jour) <> du (mois de la date obtenu ) alors c'est mois -1
en ayant controlé si date obtenu est bien la 13 eme auparavant bien sur avec worksheetfunction.weeknum(ta date obtenue)
c'est juste un raisonnement
edit:
logiquement c'est même 4 jour 3 d'un coté 3 de l'autre qui nous font 7 avec le 4 eme
Bon il ne fallait pas aller chercher bien loin finalement le probleme avait déjà été posé
ICI!!
CODE vba
J 'AVAIS ZAPER LE DATEADD
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Public Function SemaineToMois(annee As String, semaine As String) As Integer Dim jour As Date jour = DateAdd("ww", semaine, DateSerial(annee, 1, 1)) Debug.Print jour SemaineToMois = Month(DateAdd("ww", semaine, DateSerial(annee, 1, 1))) End Function Sub essai() Debug.Print SemaineToMois(2016, 13) End Sub
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Bonjour patricktoulon
T'as surtout zappé deux autres "petites choses" :J 'AVAIS ZAPER LE DATEADD
1) la norme ISO applicable
et
2)
Je m'exprime mal donc pour exemple : semaine 13 2016 il y a 3 jours en mars et 2 en avril j'aimerai donc qu'il me récupère le mois de mars.
Pour les semaines complètes d'un mois tel que : semaine 14 2016 les 5 jours sont en avril je veux qu'il me récupère le mois d'avril.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
re
tu lis pas tout unparia dans le post précèdent celui ci j'ai bien dis
en ayant controlé si day(unedate) est plus petit que 4 évidementsi le mois de (la date obtenu -4 jour) <> du (mois de la date obtenu ) alors c'est mois -1
c'est le principe du vbfirsfourday qui intégré dans VBA
autrment dit si semaine X tombe un 03/0x/2016
on fait ladate-4 et le mois devrais changer par "month"
voila
re
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Public Function SemaineToMois(annee As String, semaine As String) As String Dim jour As Date mdate = DateAdd("ww", semaine, DateSerial(annee, 1, 1)) If WorksheetFunction.WeekNum(mdate) > semaine Then mdate = mdate - 7 joursem = Weekday(mdate) - 1 '(-1 pour le calendrier francais) le jour 1 de la semaine c'est le lundi debutsem = mdate - joursem + 1 finsem = mdate - joursem + 7 Debug.Print "date " & mdate Debug.Print "ce jour est un " & Format(mdate, "dddd") & " c 'est le " & joursem & " (er/eme) jour de la semaine " Debug.Print "c'est la " & WorksheetFunction.WeekNum(mdate) & " semaine " Debug.Print "cette semaine se situe dans le mois de " & Format(mdate, "mmmm ") Debug.Print "cette semaine demarre le " & Format(debutsem, "ddd dd mm yyyy") Debug.Print "et se termine le le " & Format(finsem, "dddd dd mm yyyy") Debug.Print " Du moins chez nous les gaulois!!" SemaineToMois = Month(mdate) End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Sub essai() Debug.Print "mois N°:" & SemaineToMois(2016, 13) End Sub
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
A patricktoulon
la norme ISO compte pour des prunes ?
Fais donc un test de ton code avec la semaine N° 5 de l'année 2012 ...
Sur ce : bonne nuit.
L'erreur devient flagrante si l'on teste avec la semaine 5 de l'année 2021...
Voici d'ailleurs ce que l'on peut alors lire dans la fenêtre d'exécution :
Je ne sais pas quels Gaulois tu fréquentes, mais la 5ème semaine de l'année 2021 démarre le 1er février 2021 et non le 25 janvier 2021.date 29/01/2021
ce jour est un vendredi c 'est le 5 (er/eme) jour de la semaine
c'est la 5 semaine
cette semaine se situe dans le mois de janvier
cette semaine demarre le lun. 25 01 2021
et se termine le le dimanche 31 01 2021
Du moins chez nous les gaulois!!
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
re
Bonjour unparia
tiens boucler sur 365 jour ca fait un peu .....hein mais bon!!! ca matche
j'ai fait une fonction qui devient un object (type) qui renvoie les date et valeur demandées
declaration type
sub de test
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Type infoDate MonthName As String MonthNumber As Long debutsemaine As Date finsemaine As Date Numbersemaine As Long End Type Dim info As infoDate
fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub essai() Debug.Print "mois N° :" & info_date(2012, 52).MonthNumber Debug.Print "mois en lettre :" & info_date(2012, 52).MonthName Debug.Print "debut de semaine :" & info_date(2012, 52).debutsemaine Debug.Print "fin de semaine :" & info_date(2012, 52).finsemaine Debug.Print "Numero de semaine :" & info_date(2012, 52).Numbersemaine Debug.Print "==========================" Debug.Print "mois N° :" & info_date(2016, 53).MonthNumber Debug.Print "mois en lettre :" & info_date(2016, 53).MonthName Debug.Print "debut de semaine :" & info_date(2016, 53).debutsemaine Debug.Print "fin de semaine :" & info_date(2016, 53).finsemaine Debug.Print "Numero de semaine :" & info_date(2016, 53).Numbersemaine Debug.Print "==========================" Debug.Print "mois N° :" & info_date(2021, 53).MonthNumber Debug.Print "mois en lettre :" & info_date(2021, 53).MonthName Debug.Print "debut de semaine :" & info_date(2021, 53).debutsemaine Debug.Print "fin de semaine :" & info_date(2021, 53).finsemaine Debug.Print "Numero de semaine :" & info_date(2021, 53).Numbersemaine Debug.Print "==========================" End Sub
voila j'ai testé pour 2016 OK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Function info_date(année, sem) As infoDate For i = 1 To 364 mdate = DateSerial(année, 1, i) If WorksheetFunction.WeekNum(mdate) = sem Then info_date.MonthName = Format(mdate + 1, "mmmm") info_date.MonthNumber = Month(mdate + 1) info_date.Numbersemaine = Format(mdate + 1, "ww") 'sem info_date.debutsemaine = mdate + 1 info_date.finsemaine = mdate + 7 Exit For End If Next End Function
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Tu voudras bien m'excuser, patricktoulon, mais j'arrête de passer mon temps à vérifier tes "essais"... avec des "tiens .." ou non ..
La solution est simple et tout "écart" n'est que diversion :
Elle a été indiquée depuis bien plus haut et commence par la détermination de la date de départ de la première semaine de l'année considérée, le reste n'étant dès lors qu'arithmétique élémentaire.
Amitiés et bonne chance dans ce genre-là ...
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
bonjour,
justement c'est à cela que je pensais, car je me souviens de cette discussion dont Docmarti avait donné un lien : https://support.microsoft.com/fr-fr/kb/200299
afin de définir le n° se semaine correctement, sur cette base il n'y a plus qu'à faire les calcul pour aller au numéro de semaine voulu et voir si tous les jours sont à l'interieur d'un même mois ou à cheval et dans ce cas là déterminé sur quel mois on a le plus de jour
Cordialement
Ryu
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein
Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple
Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
Tout-à-fait, RyuAutodidacte.
et cela évitera de se "promener" ...
Amitiés.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
re
se promener non mais si un peu quand même
car dans cette discussion qui a été cité on part d'une date
alors ici on part de la semaine
il nous faut donc repérer le jour 1 de la semaine 1 de l'année
avant d'y ajouter X semaines pour en ressortir le mois, que la date correspondante a cette semaine chevauche entre deux mois ou pas
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
pardi !nous faut donc repérer le jour 1 de la semaine 1 de l'année
avant d'y ajouter X semaines pour en ressortir le mois, que la date correspondante a cette semaine chevauche entre deux mois ou pas
Et c'est ce qui est dit depuis le tout début ... et que j'aimerais que le demandeur essaye enfin de faire (et c'est on ne peut plus simple) en respectant la norme ISO !
EDIT
Pour mémoire : mon message d'hier 13 h 23 :
Le demandeur n'a depuis plus donné signe de vie. Il est à noter à ce propos que sa dernière présence remonte à Hier 12h36Mais on va jouer ce jeu-là :
Il commence par la définition de la date de début de la première semaine de l'année concernée (le reste n'est qu'arithmétique).
Questions, donc :
1) sais-tu déterminer cette date ?
2) si oui : comme,t t'en sers-tu ensuite ? Si non : comment entrevois-tu de t'en servir ensuite ? (juste pour "voir" si tu "vois" bien).
On ne lui a pour l'instant donné aucune chance de répondre. il n'a probablement même pas encore lu les questions qui lui ont été posées ...
Et il va retrouver ici plusieurs codes au demeurant sujets à caution ... (parmi, heureusement des "pistes" sur ce qu'il doit faire et utiliser).
EDIT2 : pour ton information : j'avais un peu de temps à perdre et ai voulu donc écrire le code (que je ne montrerai qu'après que le demandeur se sera manifesté) :
J'obtiens en très exactement deux lignes de code (pas une seule de plus) la date de démarrage de la énième semaine spécifiée de la énième année spécifiée, le tout en parfaite conformité avec la norme ISO. et je n'ai utilisé pour ce faire que deux -pas une de plus non plus- fonctions de VBA : weekday et Dateserial et de l'arithmétique plus qu'élémentaire.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
re
Bonsoir unparia
perso avec la date du 01/01/xxxx
et la fonction weekday
je remonte la date au "lundi"
on ajoute n(semaine) après avec dateadd("ww" x semaine, date)
normalement on retombe sur le lundi que contient cette semaine
c'est OK pour toi comme ca
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Cela dépend. Ce ne sera pas suffisant à tous les coups (norme ISO à appliquer)c'est OK pour toi comme ca
Lis mon dernier édit (message précédent) et attendons, si tu le veux bien, le retour du demandeur.
Edit : je commence à me demander si tu as bien lu et compris la norme ISO.
EDIT2 : et je me demande également si tu as bien compris que WorksheetFunction.WeekNum ne permet pas de satisfaire à tous coups cette nome ISO (expliqué dans l'aide VBA, d'ailleurs).
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
re
je n'utilise plus la worksheetfunction
en effet je comprends pas trs bien la norme iso
tout ce que je sais c'est que
une semaine qui commence au moins par "jeudi" est compter comme une semaine
le demandeur a demander le depart d'un numero de semaine
j'en conclu donc qu'il veut le lundi que ca chevauche ou pas entre deux mois
donc si je raisonne logiquement
je fait
ensuite je fait
Code : Sélectionner tout - Visualiser dans une fenêtre à part madate =cdate(01/01/2016") '2016 pour l'exemple
je soustrait donc
Code : Sélectionner tout - Visualiser dans une fenêtre à part j = Weekday(mdate) - 1 ' -1 parce que en France nous c'est lundi le debut de semaine
voila maintenant on a le lundi que contient la semaine 1, il se peut que ce lundi tombe dans l'année inferieur c'est pas un problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part madate=madte-j+ 1' +1 car dans les 7 jours ca contient mémé le lundi contenu dans la semaine
normalement si on fait
on doit tomber en toute logique sur le lundi que contient la semaine 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part madate =dateadd("ww",2,madate)
lundi+7 jours =lundi d'après
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Pour mémoire, donc :
Et j'y tiens.Lis mon dernier édit (message précédent) et attendons, si tu le veux bien, le retour du demandeur.
Amitiés
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
re
c'est bon apres verif que tout est bon j'ai réduit le moteur de l'exemple en MP a 3 lignes
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager