Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
Sommaire > VBA > Manipulation des données > Dates et Heures
        Pourquoi utiliser le type date ?
        Comment afficher des durées supérieures à 24 heures ?
        Comment obtenir, pour une date donnée, la date du dernier jour du mois ?
        Quel format de dates utiliser pour les requêtes, les calculs VBA, les contrôles de formulaires ?
        Comment calculer la différence entre 2 dates ?
        Comment calculer l'âge d'une personne ?
        Comment ajouter des jours, des mois ou des années à une date ?
        Le format de la date ne correspond pas à ce que je demande
        Problème de format de date. Le jour et le mois sont parfois inversés.
        Comment transformer une valeur numérique en format 'heures : minutes : secondes' ?
        Comment récupérer les informations d'une date (quantième, trimestre ...) ?
        Extraire la date ou l'heure avec Int(), à partir d'un champ ou d'une variable date.
        Calcul de durées par soustraction.
        Je veux afficher la date d'aujourd'hui sans l'heure.
        Comment fonctionne le type Date/Heure ?
        Comment obtenir un mois en toutes lettres à partir d'une Date ?
        Comment changer le jour, mois, année d'une date ?
        Comment connaître le jour de la semaine à partir d'une date ?
        Comment savoir si un jour est ouvré ?
        Comment convertir une chaîne de caractères en date ?
        Comment déterminer la date du premier jour d'une semaine ?
        Comment obtenir la date tout en lettres.
        Comment additionner deux champs aux valeurs de type ..h..mn ?
        Comment transformer les heures en centièmes
        Comment convertir Date Julienne vers Date normale ?

precedent    sommaire    suivant   


Pourquoi utiliser le type date ?
auteur : Team Access

La réponse expéditive serait : Parce qu'il est fait pour cela et donc il est le mieux adapté !


En fait, il y a souvent confusion entre les données réellement stockées dans la base et le format d'affichage.
Pour simplifier, sachez que l'on stocke les données horaires (dates, heures, durées) dans des champs de type Date/Heure, mais que l'on affiche des chaines de caractères (String).



Dans une application, quelques fois vous afficherez mardi 26 août 2003 et d'autres fois 26/08/03... Tous les formattages sont possibles. Mais du moment que l'on dinstingue correctement les notions de stockage et d'affichage, l'utilisation de plusieurs formats d'affichage n'empêche pas de stocker l'information suivant un seul et même principe : celui du type Date/Heure.



Utiliser un champ de type Date/Heure plutôt qu'un ou plusieurs champ texte ou numérique pour stocker vos données horaires rend votre système de données plus cohérent, plus performant et plus souple à maintenir.



En effet, les données de type Date étant en interne des valeurs numériques de type Réel double mais le type Date étant lui-même reconnu par Visual Basic, vous disposez de nombreuses fonctions permettant d'automatiser et réaliser vos traitements précis des données horaires (formattage, extraction d'une partie de la date, addition/soustraction de durées...).



Une date est en fait une valeur décimale en nombre de jours depuis le samedi 30 décembre 1899 à 00:00. Pour le vérifier, exécutez le code suivant :



Remarque : les durées constituent un cas un peu spécifique et peuvent ne pas être stockées dans un champ Date.


Comment afficher des durées supérieures à 24 heures ?
auteur : Team Access
Par défaut MS-Access formate les champs date/heure comme des dates et non comme des durées. Lorsque les valeurs sont supérieures à 24 heures on est obligé de passer par des fonctions, car contrairement à Excel, ce format n'existe pas dans MS-Access.


Quand on utilise un champ de type date formaté pour afficher les heures, en fait MS-Access ne donne pas le nombre d'heures au total mais il extrait de la date l'heure qui lui correspond.
MsgBox Format(Now,"hh:nn:ss")   '  affiche l'heure courante dans une boîte de dialogue
Voici 2 fonctions qui renvoient une chaîne de caractères, elles ne doivent donc être utilisées que pour l'affichage.
Celle-ci renvoie la durée sous la forme Jour J Heure:minutes:secondes
Function JourHeure(dtm As Date) As String 
    JourHeure = "" 
    If CDbl(dtm) > 1 Then  
         ' On calcule le  nombre de jours
        JourHeure = CInt(dtm - 0.5) & " J " 
    End If 
    ' On ajoute les heures, minutes et secondes
    JourHeure = JourHeure & Format(dtm,"hh:nn:ss")
End Function
Tandis que celle-la renvoie la durée sous la forme Heure:minutes:secondes
Function HeureSup24(dtm As Date) As String
    'calcule le nombre d'heures
    HeureSup24 = DateDiff("h", 0, dtm)
    'on ajoute les minutes et les secondes
    HeureSup24 = HeureSup24 & Format(dtm, ":nn:ss")
End Function

Comment stocker et gérer les informations relatives aux Durées ?


MS-Access gère les données des champs Date/Heure comme des dates et non comme des durées. Il n'existe pas comme dans Excel, de type ou de format pour les durées.

Faut-il utiliser le type Date ou bien faut-il préférer un type Entier numérique pour stocker des durées ?

Pour savoir comment déterminer notre choix, détaillons nos besoins.


Une durée peut être exprimée en une ou plusieurs unités dont les plus utilisées sont :

  • Centième
  • Seconde
  • Minute
  • Heure
  • Jour
  • Semaine
  • Mois
  • Année

NOTE : une durée en mois ou en année est subjective, tout dépend de la convention prise. Par exemple en comptabilité on définit : 1 Mois = 30 jours, une année = 360 jours. Donc dire que deux dates sont séparées d'un mois tout juste n'est pas vraiment exact.



De nombreuses combinaisons sont possibles pour représenter précisément une durée. Lorsqu'une durée est représentée à travers plusieurs unités, la plus grande unité peut ne pas avoir de limite dans sa valeur. Mais ce n'est pas le cas des unités inférieures qui, passée une certaine valeur, incrémentent l'unité immédiatement supérieure et reviennent à zéro.
Ces rappels élémentaires sont nécessaires pour bien comprendre comment utiliser le type Date/Heure afin de stocker des durées.


En effet, les formats de champs Date/Heure qu'autorise Access ne vous laisserons combiner que trois unités au maximum: Heure, Minute et Seconde.
En outre, chaque unité possède une limite de valeur qu'elle ne peut dépasser ; comme nous le savons tous : 23 pour les heures, 59 pour les minutes et les secondes.


Ce sont les deux limites qu'impose Access pour le formatage des heures. Et ces limites sont bien compréhensibles puisque les formats sont prévus pour être appliqués à des heures et non à des durées.


En conclusion, le type Date/Heure est pratique et "transparent" tant que vous ne devez pas sortir de ces limites.


Dans le cas contraire, l'utilisation de ce type revient à coder la durée sur un nombre décimal. La partie entière représentera le nombre de jours complètement écoulés depuis une date référence fixée arbitrairement au 30/12/1899. La partie décimale représentera, le cas échéant, la fraction écoulée du dernier jour s'il n'est pas complètement écoulé.


Pour gérer des durées aux des formats "sans limites", il est souvent plus pratique de recourir à un champ de type entier numérique.
Ce champ correspondra tout simplement à l'unité la plus petite nécessaire à vos formats d'affichage. Généralement, le type Long est très suffisant.


Ceci dit, que vous ayez choisi de stocker vos données sous un type numérique entier ou sous le type Date/Heure, dès lors que les formats d'heure autorisés par Access pour les champs de type Date/Heure ne vous conviennent pas, vous serez obligés de développer vos propres fonctions pour afficher vos durées dans la/les unité(s) voulues.


Voici donc quelques exemples de telles fonctions.
Attention : ces fonctions renvoient une chaîne de caractères, elles ne doivent donc être utilisées que pour l'affichage.


Stockage des durées dans un champ de type Date/Heure.


Renvoyer la durée sous la forme Jour J Heure:minutes:secondes
Ici, l'unité des jours n'a pas de limite de valeur et les jours sont comptés à partir du 30/12/1899. (cf. lien en bas)

Function JourHeure(dtm As Date) As String
    JourHeure = ""
    If CDbl(dtm) > 1 Then 
         ' On calcule le  nombre de jours
JourHeure = CInt(dtm - 0.5) & " J "
    End If
    ' On ajoute les heures, minutes et secondes
    JourHeure = JourHeure & Format(dtm,"hh:nn:ss")
End Function

Renvoyer la durée sous la forme Heure:minutes:secondes
Ici, l'unité des heures n'a pas de limite de valeur et les heures sont comptés à partir du 30/12/1899. (cf. lien en bas)

Function HeureSup24(dtm As Date) As String
    'calcule le nombre d'heures
    HeureSup24 = DateDiff("h", 0, dtm)
    'on ajoute les minutes et les secondes
    HeureSup24 = HeureSup24 &  Format(dtm, ":nn:ss")
End Function

A vous ensuite d'adapter ces fonctions à vos besoins exacts.

lien : Comment fonctionne le type Date/Heure ?

Comment obtenir, pour une date donnée, la date du dernier jour du mois ?
auteur : Maxence HUBICHE
'Cette fonction vous renvoie la date du dernier jour du mois :</paragraph>
Function LastDayOfMonth(ByVal LaDate As Date) As Date
    LastDayOfMonth = CDate(DateSerial(Year(LaDate), Month(LaDate) + 1, 0))
End Function
Pour obtenir des information plus précises comme par exemple le nom ou le numéro du dernier jour, vous pouvez vous contenter d'utiliser cette partie de code :
DateSerial(Year(LaDate), Month(LaDate) + 1, 0)
comme argument Date d'une fonction Day() ou DatePart()...
Par exemple, ceci vous donnera uniquement le numéro du jour :
Dim derJour As Integer
LaDate = Date
derJour = Day(DateSerial(Year(LaDate), Month(LaDate) + 1, 0))
MsgBox derJour
lien : Comment récupérer les informations d'une date (quantième, trimestre ...) ?

Quel format de dates utiliser pour les requêtes, les calculs VBA, les contrôles de formulaires ?
auteur : Papy Turbo
Requête SQL:
- Access et le moteur Jet utilisent toujours la notation US (format "mm/dd/yyyy") en interne, pour les calculs et opérations.
- Access traduit ces dates au format indiqué dans le panneau de contrôle Windows, uniquement dans l'interface QBE (Query By Exemple = création de requêtes, dans le mode Création).
Pour illustrer cela, pendant la création d'une requête,
- saisir "=#09/11/2004#" comme Critère, sous n'importe quel champ date d'une requête en mode création,
- passer en mode SQL : le texte contient "= #11/09/2004#", mode US, pour exécution de la requête par le moteur Jet.

Calculs VBA : n'utiliser que le format US, le seul que les fonctions de date peuvent interpréter.

Contrôles de Formulaires : comme l'interface QBE pour les requêtes, Access affiche par défaut les dates au format défini dans le panneau de contrôle de Windows.
Pour nous, format français "dd/mm/yyyy".
La propriété Format du contrôle n'a aucune influence sur la valeur qui sera stockée dans les tables (voir ci-dessous : c'est un nombre Double qui est stocké). Donc, vous pouvez mettre n'importe quel format dans un contrôle, y compris le format japonais ("yyyy/mm/dd", très utilisé pour les tris alphabétiques).

Dernière règle : lors d'une saisie dans l'interface QBE, directement dans un champ de table, de requête ou dans un contrôle :
- il y a systématiquement interprétation/inversion des jours/mois, comme ci-dessus, si les 2 chiffres sont <= 12.
- si l'un des deux est > 12, c'est obligatoirement un jour. Ça ne peut pas être un n° de mois.


Comment calculer la différence entre 2 dates ?
auteur : Team Access

Pour calculer la différence entre deux dates, il faut utiliser la fonction DateDiff.

DateDiff(interval, date1, date2)   

Où interval est une chaine de caractères correspondant à l'intervalle à prendre en compte.

  • y Année
  • m Mois
  • d Jour
  • h Heure
  • n Minute
  • s Seconde
  • q Trimestre
  • w Semaine

DateDiff("s", #1/1/1990#, #1/1/1992#)  

Comment calculer l'âge d'une personne ?
auteurs : Cafeine, Tofalu
Première possibilité :
Function CalculAge(ByVal Dat1 As Date, ByVal Dat2 As Date) As Integer
If Month(Dat2) > Month(Dat1) Then
    CalculAge = DateDiff("yyyy", Dat1, Dat2)
ElseIf Month(Dat2) = Month(Dat1) Then
    If Day(Dat2) >= Day(Dat1) Then
        CalculAge = DateDiff("yyyy", Dat1, Dat2)
    Else
        CalculAge = DateDiff("yyyy", Dat1, Dat2) - 1
    End If
Else
    CalculAge = DateDiff("yyyy", Dat1, Dat2) - 1
End If
End Function
Seconde possibilité :

Function CalculAge2(dateNaissance As Date, Optional dateReference As Date)
If dateReference = 0 Then dateReference = Date
CalculAge2 = Year(dateReference) - Year(dateNaissance) + _
(Format(dateNaissance, "mmdd") > Format(dateReference, "mmdd"))
End Function
Le paramètre dateReference est optionnel. Ainsi, s'il n'est pas précisé, ce sera la date du système qui sera utilisé.

Exemples :
Age aujourd'hui

MsgBox CalculAge2(#06/22/1983#)
Age le 15 novembre 2005

MsgBox CalculAge2(#06/22/1983#,#11/15/2005#)

Comment ajouter des jours, des mois ou des années à une date ?
auteur : Demco
Ajouter des jours, des mois ou des années à une Date : Voici le code VBA pour : Ajouter 3 mois à la date.
DateAdd("m", 3, #05/20/2003#)
Ajouter 3 jours :
DateAdd("d", 3, #05/20/2003#)
Ajouter 3 années :
DateAdd("yyyy", 3, #05/20/2003#)
ATTENTION : La date doit être au format : mm/jj/aaaa


Le format de la date ne correspond pas à ce que je demande
auteur : Team Access
Il faut aller dans les paramètres régionaux de Windows et changer le format à sa guise.


Problème de format de date. Le jour et le mois sont parfois inversés.
auteur : Demco
Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library

A savoir : Access ne stocke en dur qu'un nombre entier long (le nombre de jours écoulés depuis le 30 décembre 1899). La date que vous voyez apparaître dans votre table est une valeur numérique, formatée avec les spécifications que vous avez données dans la définition de votre champ.
La conversion implicite que fait Access sur les dates est source d'erreurs.
Le plus simple reste d'insérer dans le champ table une valeur numérique de type double :
Dim madate As Date, monRs As DAO.Recordset 

madate = Date 
DoCmd.RunSQL "Insert into table1 (ladate) values(" & CDbl(madate) & ")"
ou
Dim madate As Date, monRs As DAO.Recordset 

madate = Date 
Set monRs = Application.CurrentDb.OpenRecordset("select * from table1") 
monRs.AddNew 
monRs.Fields("ladate").Value = CDbl(madate) 
monRs.Update
lien : faq Pourquoi utiliser le type date ?
lien : faq Quel format de dates utiliser pour les requêtes, les calculs VBA, les contrôles de formulaires ?
lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment transformer une valeur numérique en format 'heures : minutes : secondes' ?
auteur : grafikm_fr
Vous avez un champ ou simplement une valeur contenant un nombre de secondes, et vous souhaitez changer son format.

Exemple pour 32295 secondes :

Solution 1 : Il faut diviser 32295 par 3600 et garder la partie entière : 8. Nous avons le nombre d'heure. Ensuite il faut calculer le reste de : 32295 - 3600*8 = 3495 Il reste donc 3495 secondes. Pour avoir les minutes, c'est comme pour les heures, sauf que l'on divise par 60: 3495/60 => 58 Puis : 3495 - 58*60 => 15 Donc le résultat est 8:58:15

Solution 2 : TimeSerial(0,0,32295) -> 08:58:15 ATTENTION ! Le nombre de secondes doit être inférieur à 32768.


Comment récupérer les informations d'une date (quantième, trimestre ...) ?
auteur : Maxence HUBICHE
Il faut utiliser DatePart() :
PartDate("T",[LeChampDate])
Le premier argument donne l'intervalle voulu. En voici la liste :
Francais Anglais Signification
aaaa yyyy Année
a y Jour de l'année
m m Mois
j d Jour
h h Heure
n n Minute
s s Seconde
t q Trimestre
e w Semaine
ee ww Numéro de la semaine

Après pour avoir ceux qui manquent, quelques calculs simples permettent d'y arriver...

Par exemple, pour avoir le semestre, il faut les 2 premiers trimestres.

Donc il faut faire :
Semestre = (PartDate("T",[LeChampDate])+1)\2

Extraire la date ou l'heure avec Int(), à partir d'un champ ou d'une variable date.
auteur : Papy Turbo
En dehors des fonctions Year(), Month(), Day(), Hour(), Minute(), Second() qui renvoient une partie de la date ou de l'heure, le moyen le plus simple est de considérer que les dates sont enregistrées dans la base sous la forme d'un nombre réel double (8 octets). Dans l'aide Access, voir le type de données Date.

La partie entière donne la date,

la partie décimale donne l'heure.

Appuyez sur [Alt+F11] -> environnement VBA, puis [Ctrl-G] pour utiliser la fenêtre Exécution (F1), et testez les commandes suivantes :
? now
07/04/2004 12:04:38 

'Date seule, SANS les heures, minutes et secondes.
? int(Now) 
07/04/2004 

'juste pour rire, la même avec les fonctions de date !!!
? DateSerial(Year(Now), Month(Now), Day(Now))
07/04/2004 

'Heures, minutes et secondes seules, SANS la date. Affichage décimal.
? now - int(now) 
0,50459490740468 

'Idem, en renvoyant une date, pour l'affichage
? cdate(now - int(now)) 
12:05:57
? format(now - int(now), "hh:mm:ss"
12:06:08
Il faut un cDate() ou un Format() pour afficher l'heure correctement parce que l'opération de soustraction renvoie un nombre réel double. La soustraction "perd" la notion de date/heure.

Dans une procédure, vous pouvez déclarer une variable Date. Vous n'aurez pas besoin de convertir avec cDate(). Si DateHeure est une variable, un paramètre ou la valeur d'un contrôle de type Date :
Dim HeureSeule As Date    
     [...]    
     HeureSeule = DateHeure - int(DateHeure)
Noter que, dans une table ou un calcul, il n'y a aucune différence entre 0,50459490740468 et 12:05:57. C'est juste une question d'affichage (F1 sur la fonction Format(), le type de données Date, la fonction cDate()).


Calcul de durées par soustraction.
auteur : Papy Turbo
La différence entre 2 dates indique le nombre de jours. La partie décimale indique une fraction de jour (Ex. 12 heures = 0,5 jour).

Ces nombres peuvent être utilisés dans tout calcul, sans utiliser aucune fonction, même dans une requête SQL.

Pour les calculs sur des heures, multiplier ce nombre par 24.

De même pour les minutes ou les secondes : multipliez par 24*60, ou par 24*60*60.

Exemple 1 : Temps passé sur une activité ou un projet.

Si vous avez travaillé sur une activité quelconque, depuis la date/heure Debut jusqu'à la Date/heure Fin. Utiliser la fenêtre Exécution (F1) pour tester :
Debut = #4/26/2004 22:07:32#
Fin = #4/27/2004 02:38:41#
Duree = (Fin - Debut)*24
? Duree 
4,51916666678153
soit un peu plus de 4 heures et demi. Le résultat est un Numérique Double, et non plus une date.

Pour effectuer le même calcul avec DateDiff(), vous devrez extraire d'abord la différence en jours, puis en heures, puis en minutes… puis les ajouter les unes aux autres !

Si vous avez enregistré DebutTempsPasse et FinTempsPasse de chaque activité dans une table des Temps Passés, vous pouvez, dans une requête, calculer directement un total des heures par projet.

Par exemple, utiliser cette requête dans un état pour afficher un résumé des heures par projet :
Select TP.CLEPROJET, Sum([FIN_TEMPS_PASSE]-[DEBUT_TEMPS_PASSE])*24 As HeuresTotales
From TEMPSPASSE TP
Group By TP.CLEPROJET;
De même, vous pouvez ajouter directement des jours, entiers ou partiels, à une date. Utiliser la fenêtre Exécution (F1) :
? now, now + 120
27/04/2004 12:14:04         25/08/2004 12:14:04
120 jours au-delà du 27 avril, nous serons le 25 août.
? now, now + (75/24)
27/04/2004 12:19:35         30/04/2004 15:19:35
75 heures au-delà du 27 avril à midi, nous serons le 30 avril, à 15 heures.

Exemple 2 : Pour chronométrer l'exécution de 2 procédures, et déterminer la plus efficace.

Nous pouvons également stocker le résultat dans une variable de type Date, afin de bénéficier immédiatement du format d'affichage Date/Heure.
Public Function CompareProcedures() As String
     Dim Debut As Date, Fin As Date
     Dim Duree1 As Date, Duree2 As Date
     Dim Pointeur As Long
     'Commencez avec 1000 et augmentez ce chiffre, 
     '    jusqu'à ce que les résultats soient significatifs.
     Const NBITERATIONS = 1000000    

     'Tester la 1ère procédure    
     Debut = Now    
     For Pointeur = 1 To NBITERATIONS
         Procedure1    
     Next    
     Fin = Now    
     Duree1 = Fin - Debut        
     'Tester la seconde procédure    
     Debut = Now    
     For Pointeur = 1 To NBITERATIONS
          Procedure2 
     Next    
     Fin = Now    
     Duree2 = Fin - Debut    
     'Renvoyer les résultats :    
     CompareProcedures = "Chaque procédure a été exécutée " & NBITERATIONS & " fois, en " _
        & vbCrLf & "1ère : " & Duree1 _
        & vbCrLf & "2ème : " & Duree2    
     Beep    
     MsgBox CompareProcedures
End Function
L'affichage de Duree1 et Duree2, variables de type Date, sera directement exprimé en hh:min:sec. Exemple, dans la fenêtre Exécution (F1) :
? CompareProcedures
Chaque procédure a été exécutée 1000000 fois, en 
1ère : 00:00:42
2ème : 00:00:29
La seconde procédure est plus efficace que la 1ère. On a souvent des surprises ! :D


Je veux afficher la date d'aujourd'hui sans l'heure.
auteur : Demco
Vous ne devez pas utiliser la fonction Now(), essayez plutôt de récupérer la date du jour avec la fonction Date().


Comment fonctionne le type Date/Heure ?
auteur : Maxence HUBICHE
Ce type est en fait un numérique dans Access.
Une date de référence a été choisie de façon arbitraire : le 1/1/1900.
un nombre correspondant lui a été associé : 2 (l'année 1900 n'étant pas bissextile, un décalage d'une journée a été pris en considération pour ce départ) donc, nous avons : 1/1/1900 = 2
Chaque jour vaut 1. Ainsi, on peut créer la suite :
1 = 31/12/1900
2 = 01/01/1900
3 = 02/01/1900
4 = 03/01/1900
5 = 04/01/1900
6 = 05/01/1900
7 = 06/01/1900
...

Cela est très appréciable, car ainsi, la différence entre 2 dates donne le nombre de jours les séparant, et pour savoir quel jour on sera dans 3 jours, il suffit d'ajouter 3 à la date en cours.

Maintenant, le type s'intitule Date/Heure. il doit donc aussi gérer les heures.
Puisqu'un jour vaut 1, et qu'il y a 24 heures dans une journée, une heure vaut 1/24 on a donc :
1h = 1/24 1mn = (1/24)/60 1s = ((1/24)/60)/60

Petite réflexion : quand sommes-nous avec ce numérique ci : 3,75 ?
Réponse : le 2 janvier 1900 à 18h00

A propos des fonctions De nombreuses fonctions sont utilisées pour la gestion des données de type Date/heure.

Les plus importantes (les noms et usage US sont soulignés) :
DATE()/date
Cette fonction renvoie la date système
TEMPS()/time
Cette fonction renvoie l'heure système
MAINTENANT()/now
Cette fonction renvoie la date ET l'heure système

AJDATE(intervalle;Nbre;Date)/DateAdd
Cette fonction permet d'ajouter un Nbre d'intervalles à une Date
DIFFDATE(intervalle;Date1;Date2)/DateDiff
Cette fonction renvoie le nombre d'intervalles entre 2 dates
PARTDATE(intervalle;Date)/DatePart
Cette fonction renvoie l'intervalle correspondant à la date
Que signifie intervalle
Il s'agit d'une chaîne de caractères, qui caractérise une durée de temps, et qui peut prendre l'une des valeur suivante:
Pour
la notion d'année : "aaaa" / "yyyy"
la notion de mois : "m" / "m"
la notion de jour : "j" / "d"
la notion d'heure : 'h" / "h"
la notion de minute : "n" / "n"
la notion de seconde : "s" / "s"
la notion de trimestre : "t" / "q"
la notion de semaine : "ee" / "ww"
la notion de jour de la semaine : "e" / "w"
la notion de jour de l'année : "a" / "y"

FORMAT(Date;Format)/Format
Cette fonction renvoie le un texte correspondant à la date mise en forme.
SéRIEDATE(Année;Mois;Jour)/DateSerial
Cette fonction revoie une date reconstruite à partir des éléments passés dans les arguments.
SérieTemps(Heure;Minute;Seconde)/TimeSerial
Cette fonction revoie une heure reconstruite à partir des éléments passés dans les arguments.

lien : Comment afficher des durées supérieures à 24 heures ?

Comment obtenir un mois en toutes lettres à partir d'une Date ?
auteur : Gaël Donat
Public Sub test() 

Dim LaDate As Date 
LaDate = Now() 

MsgBox Format(LaDate, "mmm")  
 '-> renvoie le nom abrégé du mois actuel. Pour le nom complet utilisez "mmmm"

End Sub

Comment changer le jour, mois, année d'une date ?
auteur : Maxence HUBICHE
"MonNombre" contient le nouveau jour :
Madate = DateSerial(Year([ChampDate],Month([ChampDate], MonNombre)

Comment connaître le jour de la semaine à partir d'une date ?
auteur : Maxence HUBICHE
La fonction WeekDay() permet celà.
A savoir : 1 correspond au dimanche et 7 au samedi.


Comment savoir si un jour est ouvré ?
auteur : MC2
La fonction à appeler est EstFerie(). Celle-ci en appelle une autre fLundiPaques() qui renvoie la date du lundi de Pâques.
Function EstFerie(ByVal QuelleDate As Date) As Boolean
Dim anneeDate As Integer
Dim joursFeries(1 To 11) As Date
Dim I As Integer
  anneeDate = Year(QuelleDate)
 
  joursFeries(1) = DateSerial(anneeDate, 1, 1)
  joursFeries(2) = DateSerial(anneeDate, 5, 1)
  joursFeries(3) = DateSerial(anneeDate, 5, 8)
  joursFeries(4) = DateSerial(anneeDate, 7, 14)
  joursFeries(5) = DateSerial(anneeDate, 8, 15)
  joursFeries(6) = DateSerial(anneeDate, 11, 1)
  joursFeries(7) = DateSerial(anneeDate, 11, 11)
  joursFeries(8) = DateSerial(anneeDate, 12, 25)

  joursFeries(9) = fLundiPaques(anneeDate)
  joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Paques + 38
  joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
 
  For I = 1 To 11
    If QuelleDate = joursFeries(I) Then
      EstFerie = True
      Exit For
    End If
  Next
End Function
 
Private Function fLundiPaques(ByVal Iyear As Integer) As Date
        'Adapté de +ieurs scripts...
        Dim L(6) As Long, Lj As Long, Lm As Long
       
        L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
        L(4) = (19 * L(1) + 24) Mod 30
        L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
        L(6) = 22 + L(4) + L(5)
       
        If L(6) > 31 Then
                Lj = L(6) - 31
                Lm = 4
        Else
                Lj = L(6)
                Lm = 3
        End If
       
        ' Lundi de Pâques = Paques + 1 jour
        fLundiPaques = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
       
End Function
Attention : Cet article prend en compte le lundi de Pentecôte qui n'est à ce jour plus férié.


Comment convertir une chaîne de caractères en date ?
auteur : Team Access
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.
Dim Rep As String, DateDeNaissance As Date
Do
    Rep = InputBox("Quelle est votre date de naissance ?")
Loop While (Not IsDate(Rep))
DateDeNaissance = CDate(Rep)
lien : FAQ VB

Comment déterminer la date du premier jour d'une semaine ?
auteur : HPJ
Voici une petite fonction :
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
Utilisation :
Msgbox PremierJourSemaine(26, 2005)

Comment obtenir la date tout en lettres.
auteur : Drosera
'***********************************************************************************************************
'   Transforme une date en toutes lettres
'   l'argument boo est utilisé pour mettre une majuscule en début de chaîne
'***********************************************************************************************************
Function DateEnLettre(dtm As Date, Optional boo As Boolean = False) As String

    Dim strJour As String
    Dim strMois As String
    Dim strAnnée As String

    If Format(dtm, "dd") = 1 Then
        If boo Then
            strJour = "Premier"
            Else
            strJour = "premier"
            End If
        Else
        strJour = NbVersTexte(Format(dtm, "dd"), boo)
        End If
    strMois = CStr(Format(dtm, "mmmm"))
    strAnnée = NbVersTexte(Format(dtm, "yyyy"))
    DateEnLettre = strJour & " " & strMois & " " & strAnnée
End Function

'***********************************************************************************************************
'   Transforme un nombre en lettres

'***********************************************************************************************************
Public Function NbVersTexte(ValNum As Double, Optional boo As Boolean = False) As String

    Static Unites() As String
    Static Dixaines() As String
    Static LesDixaines() As String
    Static Milliers() As String
   
    Dim i As Integer
    Dim nPosition As Integer
    Dim ValNb As Integer
    Dim LesZeros As Integer
    Dim strResultat As String
    Dim strTemp As String
    Dim tmpBuff As String
   
    Unites = Split("zéro;un;deux;trois;quatre;cinq;six;sept;huit;neuf", ";")
    Dixaines = Split("dix;onze;douze;treize;quatorze;quinze;seize;dix-sept;dix-huit;dix-neuf", ";")
    LesDixaines = Split(";dix;vingt;trente;quarante;cinquante;soixante;soixante-dix;quatre-vingt;quatre-vingt-dix", ";")
    Milliers = Split(";mille;million;milliard", ";")

    On Error GoTo NbVersTexteError
   
    strTemp = CStr(Int(ValNum))
    'pluriel des millions
    If Len(strTemp) > 6 Then
        tmpBuff = left(strTemp, Len(strTemp) - 6)
        tmpBuff = right(tmpBuff, 3)
        If Val(tmpBuff) > 1 Then
            Milliers(2) = Milliers(2) & "s"
        End If
    End If
    'pluriel des milliards
    If Len(strTemp) > 9 Then
        tmpBuff = left(strTemp, Len(strTemp) - 9)
        tmpBuff = right(tmpBuff, 3)
        If Val(tmpBuff) > 1 Then
            Milliers(3) = Milliers(3) & "s"
        End If
    End If
    'élaboration de la chaîne
    If ValNum = 0 Or ValNum = 1 Then
        strResultat = Unites(ValNum)
    End If
    For i = Len(strTemp) To 1 Step -1
        ValNb = Val(Mid$(strTemp, i, 1))
        nPosition = (Len(strTemp) - i) + 1
        Select Case (nPosition Mod 3)
            Case 1
                LesZeros = False
                If i = 1 Then
                    If ValNb > 1 Or (ValNb = 1 And nPosition > 4) Then
                        tmpBuff = Unites(ValNb) & " "
                    Else
                        tmpBuff = ""
                    End If
                ElseIf Mid$(strTemp, i - 1, 1) = "1" Then
                    tmpBuff = Dixaines(ValNb) & " "
                    i = i - 1
                ElseIf Mid$(strTemp, i - 1, 1) = "9" Then
                    tmpBuff = LesDixaines(8) & " " & Dixaines(ValNb) & " "
                    i = i - 1
                ElseIf Mid$(strTemp, i - 1, 1) = "7" Then
                    If ValNb = 1 Then
                        tmpBuff = LesDixaines(6) & " et " & Dixaines(ValNb) & " "
                    Else
                        tmpBuff = LesDixaines(6) & " " & Dixaines(ValNb) & " "
                    End If
                    i = i - 1
                ElseIf ValNb > 0 Then
                    tmpBuff = Unites(ValNb) & " "
                Else
                    LesZeros = True
                    If i > 1 Then
                        If Mid$(strTemp, i - 1, 1) <> "0" Then
                            LesZeros = False
                        End If
                    End If
                    If i > 2 Then
                        If Mid$(strTemp, i - 2, 1) <> "0" Then
                            LesZeros = False
                        End If
                    End If
                    tmpBuff = ""
                End If
                If LesZeros = False And nPosition > 1 Then
                    tmpBuff = tmpBuff & Milliers(nPosition / 3) & " "
                End If
                strResultat = tmpBuff & strResultat
            Case 2
                If ValNb > 0 Then
                    If strResultat = "un " And ValNb <> 8 Then
                        strResultat = LesDixaines(ValNb) & " et " & strResultat
                    Else
                        strResultat = LesDixaines(ValNb) & " " & strResultat
                    End If
                End If
            Case 0
                If ValNb > 0 Then
                    If ValNb > 1 Then
                        strResultat = Unites(ValNb) & " cent " & strResultat
                    Else
                        strResultat = "cent " & strResultat
                    End If
                End If
        End Select
    Next i
    strResultat = RTrim(strResultat)
    'pluriel des centaines
    If Len(strTemp) > 2 And right(strTemp, 2) = "00" Then
        tmpBuff = Mid(strTemp, Len(strTemp) - 2, 1)
        If Val(tmpBuff) > 1 Then
            strResultat = strResultat & "s"
        End If
    End If
    'masjuscule optionnelle
    If Len(strResultat) > 0 Then
        If boo Then
            strResultat = UCase$(left$(strResultat, 1)) & Mid$(strResultat, 2)
        End If
    End If
   
EndNbVersTexte:
    NbVersTexte = strResultat
    Exit Function
NbVersTexteError:
    strResultat = "Erreur de conversion !"
    Resume EndNbVersTexte
End Function

Comment additionner deux champs aux valeurs de type ..h..mn ?
auteur : Zorro
Text1, Text2 et Text3 contiennent les deux valeurs à ajouter. zdtResult est la zone de texte affichant le résultat :
h = Val(Mid(Text1, 1, 2)) + Val(Mid(Text2, 1, 2)) + Val(Mid(Text3, 1, 2))
m = Val(Mid(Text1, 5, 3)) + Val(Mid(Text2, 5, 3)) + Val(Mid(Text3, 5, 3))

If m > 60 Then
    Hplus = Fix(m / 60)
    m = m Mod 60
End If
h = h + Hplus
zdtResult.Value = Str(h) & " h " & Str(m) & " min" 

Comment transformer les heures en centièmes
auteur : Maxence HUBICHE
la question : Comment faire pour passer de 02:15:47 à 135,78'

la réponse en français :

MsgBox Heure([ChampDate])*60+Minute([ChampDate]) & "," & Format(Seconde([ChampDate])/60*100;"00")
la réponse en anglais :

MsgBox Hour([ChampDate]) * 60 + Minute([ChampDate]) & "," & Format(Second([ChampDate]) / 60 * 100, "00")
lien : fr Solution trouvée ici

Comment convertir Date Julienne vers Date normale ?
auteur : random

Voici un code permettant de convertir une date de type Julienne (ex. 107142) vers une date 2007/05/22.
Function cjulian(julian As Long) As Date
cjulian = DateSerial(1900 + CInt(Left(julian, 3)), 1, CInt(Right(julian, 3)))
End Function

Appel de la fonction :
Dim MaDate As Date
    
MaDate = Format(cjulian(107142), "yyyy/mm/dd")

precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2004  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com