[Déplacé VB6 --> VBA] Des questions de dates...

cs_VinceGe Messages postés 6 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 28 avril 2010 - 13 nov. 2009 à 10:26
cs_VinceGe Messages postés 6 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 28 avril 2010 - 13 nov. 2009 à 17:41
Bonjour !

Etudiant en Finance, on nous fait apprendre tant bien que mal à utiliser VBA sur Excel, et je dois avouer que c'est pas simple tout le temps.

Je viens poster ici car j'ai deux problèmes sur lesquels je galère sans trouver de solution depuis quelques heures :/

Premier problème, on me demande de ressortir les 3emes vendredis de chaque mois pour une année donnée (via une MsgBox). Je n'ai pas la moindre idée de quelle commande utiliser sous VBA.

Second problème, on nous demande de trouver une fonction qui converti une date au format AAAAMMJJ au format date excel: Là j'ai déjà une meilleur idée de quelles fonctions utiliser, le problème c'est que cela ne fonctionne absolument pas avec des suites de chiffres du style "20030314" (14/03/2003), excel n'arrive absolument pas à le reconnaître comme date...


Merci d'avance pour votre aide.

9 réponses

Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
13 nov. 2009 à 10:49
Quelques pistes pour ton 1er pb :
Il faut déterminer la date du 1er Vendredi du mois. La fonction Weekday te permet de connaître le jour d'une date donnée.
La fonction dateserial te permet de constituer une date en lui fournissant un jour, un mois, une année.
La fonction DateAdd permet de faire des opérations sur les dates

Tu pars du 1er jour du mois.
Quel est le jour du 1er ?
A partir de là, additionner 0 à 6 jours pour arriver au vendredi.
Tu as la date du 1er vendredi, tu lui ajoutes 2 semaines et tu auras la date du 3eme vendredi du mois.


Pour ton 2ème pb, j'ai un peu de mal à te suivre, mais pour les formats de date, utilise la fonction Format (vive F1 ^^).
Attention, les critères se donnent en anglais en VBA alors que dans les formats personnalisés d'Excel, c'est en Français.
Par ex. Format("13/11/2009","yyyymmdd") en VBA alors que dans Excel même, tu ferais aaaammjj.

Molenn
0
cs_VinceGe Messages postés 6 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 28 avril 2010
13 nov. 2009 à 10:51
Oops, que dis-je, c'est bien sûr à l'aide d'une InputBox qu'on rentre l'année dans le premier problème >_<
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
13 nov. 2009 à 10:51
Hello,
Pour les 3ème vendredi
Je ferais une boucle sur les dates jusqu'à ce que l'année change.
Dans cette boucle un compteur qui se réinitialise à 0 au changement de mois et qui augmente de 1 chaque jour 6 (weekday).
A la condition qu'on soit un jour 6 et que le compteur soit à 3 on alimente une variable texte style :
texte= texte & chr(10) & ladate

à la fin de la boucle on affiche le texte dans la MSGbox.
Reste à réfléchir à la valeur d'entrée (année donnée): comment la récupérer ?
Inputbox, valeur d'une cellule donnée...

BR


USERRRQI115
Simple user
Great brain
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
13 nov. 2009 à 10:58
Re,

Pour le second, ton entrée est une donnée string pour la convertir en date :
Dateserial(left(texte,4),right(left(texte,6),2),right(texte,2))

NB Dateserial(year, month, day)
BR
USERRRQI115
Simple user
Great brain
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 nov. 2009 à 10:58
Salut
-1- Le troisième vendredi de chaque mois :
Il te suffit de faire deux boucles imbriquées For-Next :
La première une boucle pour énumérer les mois de l'années, de 1 à 12.
La seconde entre 1 et 21 (3 semaines entières)
Pour reconstituer un format de date à partir des chiffres des mois et du jour : Voir DateSerial
Pour retrouver le jour de la semaine : Voir WeekDay
Pour ressortir d'une boucle volontairement : Voir Exit For

-2- Conversion de format date :
Puisque le format fourni est Année-Mois-Jour et que Excel ne sait pas reconnaitre ce format nativement, il faut faire un découpage de chaine : Voir Left, Mid, Right pour isoler l'année, le mois et le jour
Ensuite, avec DatePart, tu reconstitues une date valide

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_VinceGe Messages postés 6 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 28 avril 2010
13 nov. 2009 à 11:27
Merci pour vos réponses !

Pour le premier exo, j'ai ma boucle qui se présente comme ceci:

Dim annee As Integer
annee = InputBox("Quelle année ?")
For i = 1 To 12
For j = 1 To 21
Range("E1:E366") = Weekday(DateSerial(annee, i, j))
Next j
Next i
End Sub

J'espérais pouvoir sortir le jour de la semaine dans ma colonne E, jour de la semaine trouvé à l'aide de mon dateserial, mais force est de constater que ça ne fonctionne pas !

Je pense que j'emploie mal ces deux commandes weekday et dateserial, et je comprend pas trop comment employer le 21 des trois premières semaines dans mon DateSerial (qui demande année/mois/jour comme arguments)...
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 nov. 2009 à 12:24
Re
"Ca ne fonctionne pas" ne veut rien dire : à toi de dire ce qui se passe.
En fait, les instructions liées aux dates fonctionne bien.
C'est toin utilisation de Range qui est mauvaise.
Tel que écrit, tu stockes dnas chaque cellule du Range la dernière valeur calculée.

Ta question était "comment trouver la date du 3ème vendredi"
Il faut donc détecter si la date calculée dans ta boucle correspond à un vendredi
+ Compter les vendredis
Du tout cuit :
    Dim annee As Integer
    Dim i As Integer, j As Integer, t As Integer
    
    annee = 2009
    For i = 1 To 12
        t = 0
        For j = 1 To 21
            If Weekday(DateSerial(annee, i, j)) = vbFriday Then
                t = t + 1 ' un vendredi de plus
                If t = 3 Then
                    Range("E1").Offset(i, 0).Value = DateSerial(annee, i, j)
                    Exit For
                End If
            End If
        Next j
    Next i

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
13 nov. 2009 à 14:21
Comme quoi, chacun sa méthode

Public Sub TroisiemeVendrediDuMois()
    
    Const Annee As Integer = 2009
    Dim Mois As Integer
    Dim CalculDate As Date
    
    For Mois = 1 To 12
        'Date du 1er jour du mois
        CalculDate = DateSerial(Annee, Mois, 1)
        'Date du 1er vendredi du mois
        If Weekday(CalculDate, vbMonday) < 5 Then
            CalculDate = DateAdd("d", 5 - Weekday(CalculDate, vbMonday), CalculDate)
            Else
            If Weekday(CalculDate, vbMonday) > 5 Then
                CalculDate = DateAdd("d", 7 - Weekday(CalculDate, vbMonday) + 5, CalculDate)
            End If
        End If
        'Date du 3ème Vendredi du mois
        Debug.Print DateAdd("ww", 2, CalculDate)
    Next Mois
    
End Sub


Molenn
0
cs_VinceGe Messages postés 6 Date d'inscription vendredi 13 novembre 2009 Statut Membre Dernière intervention 28 avril 2010
13 nov. 2009 à 17:41
Merci pour votre aide :) j'ai réussi à pondre quelque chose de correct pour les deux exos
0
Rejoignez-nous