FAQ Visual Basic Consultez toutes les FAQ

Nombre d'auteurs : 50, nombre de questions : 300, dernière mise à jour : 9 février 2020 

 
OuvrirSommaireDivers bisManipulation de dates
vb
Sélectionnez
Public Function InvDatePart(ByVal PosJour As Integer, ByVal NumSemaine As Integer, ByVal Annee As Integer) As Date
 
    Dim tmpDate As Date
 
    tmpDate = CDate("1/1/" & Format$(Annee))
    If Weekday(tmpDate, vbMonday) < 6 Then NumSemaine = NumSemaine - 1
    tmpDate = DateAdd("ww", NumSemaine, tmpDate)
    tmpDate = DateAdd("d", PosJour - Weekday(tmpDate, vbMonday), tmpDate)
    InvDatePart = tmpDate
 
End Function

Par exemple, InvDatePart(3, 10, 2004) vous renvoie la date correspondant au troisième jour de la dixième semaine de l'année 2004.

Créé le 28 juin 2004  par Jean-Marc Rabilloud, Khany, Romain Puyfoulhoux

NOTE : Ce code considère que la semaine n°1 est celle qui contient au moins quatre jours dans la nouvelle année.

vb
Sélectionnez
Public Function PremierJourSemaine(ByVal numSemaine As Byte, ByVal annee As Integer) As Date 
 
    Dim d As Date 
    Dim numS As Integer 
 
    ' premier jour de l'année 
    d = DateSerial(annee, 1, 1) 
 
    ' numéro de la semaine du 1er janvier 
    numS = DatePart("ww", d, vbMonday, vbFirstFourDays) 
 
    ' si le 1er janvier fait partie de la dernière semaine de l'année précédente 
    ' alors passe à la semaine suivante (la première de la nouvelle année) 
    If numS <> 1 Then d = DateAdd("d", 7, d) 
 
    ' calcule le premier jour de la première semaine de l'année 
    d = DateAdd("d", 1 - Weekday(d, vbMonday), d) 
 
    ' ajoute (numSemaine-1) semaines 
    PremierJourSemaine = DateAdd("ww", numSemaine - 1, d) 
 
End Function
Créé le 13 juin 2005  par hpj

Pour convertir une expression en date, vous pouvez utiliser la fonction CDate(expression). Si l'expression à convertir n'est pas une date correcte d'après le format indiqué dans les paramètres régionaux de Windows, CDate essaie d'utiliser un autre format. Si la fonction ne réussit pas à faire la conversion, elle génère une erreur de type "Type Mismatch". Dans l'exemple ci-dessous, une date est demandée à l'utilisateur. Sa réponse est alors convertie en date.

vb
Sélectionnez
Dim Rep As String, DateDeNaissance As Date
Do
    Rep = InputBox("Quelle est votre date de naissance ?")
Loop While (Not IsDate(Rep))
DateDeNaissance = CDate(Rep)
Créé le 29 juillet 2002  par Romain Puyfoulhoux

Vous pouvez utiliser la fonction DateAdd (intervalle, nombre, date)

intervalle : chaîne de caractères indiquant l'intervalle de temps que vous voulez ajouter ("m" : mois, "d" : jour, "yyyy" : année, etc...)
nombre : nombre d'intervalles que vous voulez ajouter

valeur renvoyée : une date contenant le résultat (la date passée en argument n'est pas modifiée)

Quelques exemples :

vb
Sélectionnez
today = Now()
 
DateAdd("m", 3, today)   'renvoie today + 3 mois
DateAdd("d", 2, today)   'renvoie today + 2 jours
DateAdd("ww", 1, today)  'renvoie today + 1 semaine
DateAdd("h", 1, today)   'renvoie today + 1 heure
Créé le 6 janvier 2003  par Romain Puyfoulhoux

Avec la fonction DateDiff() :

vb
Sélectionnez
Dim date1 As Date, date2 As Date
 
date1 = "01/01/2004"
date2 = "01/01/2005"
 
MsgBox "Durée en jours : " & DateDiff("d", date1, date2)
MsgBox "Durée en nombre de mois : " & DateDiff("m", date1, date2)
Créé le 6 septembre 2004  par Romain Puyfoulhoux
vb
Sélectionnez
Dim DateJulienne  As String
Dim Reponse As Date
 
DateJulienne = "2002211"
Reponse = DateSerial(CInt(Left(JulianVal, 4)), 1, CInt(Mid(JulianVal, 5)))
 
' La valeur renvoyée est une date
 
MsgBox Reponse
Créé le 13 juin 2005  par Jean-Marc Rabilloud

Il suffit de passer au mois suivant et de retirer 1 jour. Le code suivant se base sur le mois en cours.

vb
Sélectionnez
Dim Reponse As Date
 
Reponse = CDate("01/" & Month(Date) + 1 & "/" & Year(Date))
Reponse = DateAdd("d", -1, Reponse)
 
MsgBox Reponse
Créé le 13 juin 2005  par cafeine

Extrait de l'aide Microsoft Visual Basic :
Les dates sont stockées sous la forme d'une partie d'un nombre réel.
Les valeurs situées à gauche du séparateur décimal représentent la date, tandis que celles situées à sa droite représentent l'heure. Les valeurs négatives correspondent à des dates antérieures au 30 décembre 1899.

L'astuce consiste donc à transformer les dates en valeurs décimales, avant de les comparer ou de les trier !

Exemple :

vb
Sélectionnez
If CDec(CDate(MaDate1)) >= CDec(CDate(MaDate2)) And CDec(CDate(MaDate3)) < CDec(CDate(Now)) Then



Un autre exemple de Tri d'une ListView sur une colonne Date par SilkyRoad

Créé le 6 octobre 2006  par Jacques Malatier

2 solutions vous sont proposées pour répondre à la question posée :

1) Fun, avec toutes les explications adéquates :

vb
Sélectionnez
Function IsBisextile(maDate As Date) As Boolean
'Fonction de contrôle de la bisextilité d'une année à partir d'une date
 
'Les conditions pour avoir une année bisextile sont les suivantes:
' - année divisible par 4 : année bisextile
' - exception : année divisible par 100 : année non bisextile
' - exception de l'exception : année divisible par 400 : année bisextile
 
    If Year(maDate) Mod 4 = 0 And (Year(maDate) Mod 100 <> 0 Or Year(maDate) Mod 400 = 0) Then
        IsBisextile = True
    Else
        IsBisextile = False
    End If
 
End Function

2) Moins fun mais tout aussi efficace, par code direct sur le 29 février :

vb
Sélectionnez
Function IsBisextile(madate As Date) As Boolean
    IsBisextile = Day(DateSerial(Year(madate), 3, 0))=29
End Function

A vous de choisir celle que vous préférez !

Créé le 18 septembre 2006  par random, Theo

A défaut d'utiliser le contrôle Timer, il existe les API SetTimer et KillTimer qui ont l'avantage : * de pouvoir créer un timer sans le contrôle donc éventuellement sous VBA * de pouvoir créer un timer dont la fréquence est codée sur un long, soit une fréquence supérieure à 65535ms, ce qui évite la solution d'appeler une variable publique servant de multiple dans le contrôle timer * de pouvoir créer un timer sans form en faisant pointer sur une classe

vb
Sélectionnez
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
 
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    '-- ici, le code a éxécuter par le Timer
End Sub
 
Public Sub main()
    KillTimer 0, 0
    SetTimer 0, 0, 5000, AddressOf TimerProc
End Sub
Créé le 22 décembre 2008  par ThierryAIM
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.