IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Format de date en VBA


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Labo
    Inscrit en
    Octobre 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Labo
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Format de date en VBA
    Bonjour à tous,
    J'ai bien trouvé la réponse à mon problème en fouillant, mais je n'arrive pas à l'appliquer.

    J'ai une table contenant des identités (Nom, prénom, date de naissance) ainsi que d'autres renseignements.
    A la saisie dans mon formulaire d'une nouvelle entrée, l'identité est recherchée dans la table afin d'indiquer si la personne est déjà connue.
    Je me suis rendue compte que cela ne fonctionnait pas toujours, et j'ai vite mis le doigt sur le fait que ça ne fonctionnait pas si la date (saisie format français) pouvait être interprétée au format US ou non.
    (Par exemple, le 15/06/2000 sera retrouvé, le 05/06/2000 non).
    Donc après quelques recherches, j'ai eu confirmation de cette histoire de format US, j'ai trouvé la fonction Format().
    Mais je ne dois pas l'utiliser correctement... Donc je viens quérir un petit coup de main !

    Le bout de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strSQL = "SELECT * FROM [Table] WHERE Nom='" & Me.Nom & "' AND Prenom='" & Me.Prenom & "' AND [Date de naissance]=#" & Me.[Date de naissance] & "# "
    Merci si vous pouvez m'éclairer là dessus !

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 075
    Points : 24 701
    Points
    24 701
    Par défaut
    Bonjour,

    Plusieurs solutions :

    Travailler explicitement avec le format FR, voir la fonction Format().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "SELECT * FROM [Table] WHERE Nom='" & Me.Nom & "' AND Prenom='" & Me.Prenom & "' AND [Date de naissance]=#" & format(Me.[Date de naissance],"dd/mm/yyyy") & "# "
    Travailler avec le format de stockage natif des dates. Une date est avant tout un double, c'est l'affichage qui le montre au format date.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "SELECT * FROM [Table] WHERE Nom='" & Me.Nom & "' AND Prenom='" & Me.Prenom & "' AND cdbl([Date de naissance])=#" & cdbl(Me.[Date de naissance]) & "# "
    Attention au Null quand on utilise des fonctions.

    Cordialement,

    ERRATUM :
    Il ne faut pas le séparateur de date avec le format numérique :
    DONC NON !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "SELECT * FROM [Table] WHERE Nom='" & Me.Nom & "' AND Prenom='" & Me.Prenom & "' AND cdbl([Date de naissance])=#" & cdbl(Me.[Date de naissance]) & "# "
    MAIS OUI !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "SELECT * FROM [Table] WHERE Nom='" & Me.Nom & "' AND Prenom='" & Me.Prenom & "' AND cdbl([Date de naissance])=" & cdbl(Me.[Date de naissance]) & ";"
    Le copier coller peut poser des problèmes, la preuve.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Labo
    Inscrit en
    Octobre 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Labo
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, ça fonctionne avec le format ().
    J'étais assez proche de ce code au final, je devais mal positionner mes guillemets ou parenthèses..

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 022
    Points
    2 022
    Par défaut
    Peut-être tard pour répondre:

    Le meilleur moyen de s'affranchir des problèmes de format de données (ce dont le moteur de base de données ne se soucie pas, et n'a pas à s'en soucier),
    est encore de passer par une requête paramétrée (à ne pas confondre avec construire une requête par concaténation).

    On définit une requête en dur, sans variables.
    Elle est composée de 2 parties:
    - La déclaration des paramètres.
    - Le corps de la requête proprement dit, qui utilise les paramètres.
    On instancie un objet QueryDef.
    On fournit les valeurs des paramètres à l'objet QueryDef.
    On appelle la methode execute ou OpenRecordset de l'objet QueryDef
    On fait les traitements.
    On détruit l'objet QueryDef.

    Dans l'exemple ci dessous, je declare un paramètre de type DateTime, et j'utilise un ou exclusif dans la clause WHERE pour prendre en charge une valeur null:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Public Sub test()
    On Error GoTo Error
        Dim Dt As Date
        Dt = DateSerial(Year(Now), Month(Now), Day(Now))
     
        Const SQL As String = _
        "PARAMETERS DateDesiree DateTime;" & vbCrLf & _
        "SELECT Nom, DateEnregistrement" & vbCrLf & _
        "FROM   TableTest" & vbCrLf & _
        "WHERE  (DateEnregistrement Is Null And [DateDesiree] Is Null)" & vbCrLf & _
        "   OR  (DateEnregistrement = [DateDesiree] And [DateDesiree] Is Not Null);"
     
        Dim Db As DAO.Database
        Set Db = CurrentDb
     
        Dim Qd As DAO.QueryDef
        Set Qd = Db.CreateQueryDef("TempQuery", SQL)
        '// Qd.Parameters("DateDesiree").Value = dt
        Qd.Parameters("DateDesiree").Value = Null
     
        Dim Rs As DAO.Recordset
        Set Rs = Qd.OpenRecordset
     
        While Not Rs.EOF
            Debug.Print Rs.Fields("Nom").Value & " : " & Rs.Fields("DateEnregistrement").Value
            Rs.MoveNext
        Wend
        Db.QueryDefs.Delete Qd.Name
    Exit Sub
    Error:
        Db.QueryDefs.Delete Qd.Name
    End Sub
    Avantages:
    Les types de données sont pris en charge, il est inutile de se soucier du format.
    Si un type de données ne correspond pas, une exception sera levée.
    Les valeurs null sont supportées.
    Protège contre les injections SQL.

    Désavantage:
    plus de code à écrire.

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 003
    Points
    20 003
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Ça dépend en fait de la finalité du code. Si c'est pour une recherche multi-critère avec affectation de la chaîne SQL comme source d'un sous-formulaire, alors il est plus simple et naturel de composer le code SQL comme proposé par loufab.

    Cdlt,

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 022
    Points
    2 022
    Par défaut
    Je me permet de réagir:

    Je ne propose pas une solution simple, ni naturelle (programmer n'est ni simple, ni naturel), mais une solution fonctionnelle et fiable.

    Quand aux cas particuliers, ils doivent rester ce qu'ils sont: Des cas particuliers.
    En aucun cas ils ne doivent devenir la norme, ni encourager la paresse (ce que le net fait depuis bien trop longtemps).

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 003
    Points
    20 003
    Billets dans le blog
    67
    Par défaut
    Pas de souci et bonne année

    Si c'est simplement pour tester la présence d'une valeur dans une table alors on peut simplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not rs.EOF then
        '...
    End if
    Il y a aussi les fonctions de domaine comme dlookup conçue en partie pour ça. mais avec les mêmes inconvénients

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Octobre 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut Problème similaire avec une date dans une requête Update
    Bonjour,

    J'ai une table avec des noms de fichiers et je veux la mettre à jour, en VBA, avec la date de dernière modification du fichier.
    J'ài écrit ce qui suit, après avoir cherché la meilleure syntaxe pour les dates (y compris la dernière solution proposée par Loufab):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim strChemin As String
    Dim fso As FileSystemObject
    Dim f As File
     
        strChemin = "C:\Data\Essai.xlsx"
     
        Set fso = New FileSystemObject
        Set f = fso.GetFile(strChemin)
     
        MsgBox "Modification : " & f.DateLastModified
     
        DoCmd.RunSQL "UPDATE tblFilDates SET tblFilDates.FilDateMod =#" & cdbl(f.DateLastModified) & "# WHERE (((tblFilDates.FilNom)= ""Essai.xlsx""));"
     
        Set fso = Nothing
    Que ce soit avec cette solution, ou mes précédents essais, j'ai toujours l'erreur 3075 sur le DoCmd:

    Nom : 2024-01-10_165634.jpg
Affichages : 120
Taille : 11,5 Ko

    La solution doit être relativement simple mais je tourne depuis pas mal de temps sans trouver.

    Merci d'avance pour votre aide.


    Bidule

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 855
    Points : 14 966
    Points
    14 966
    Par défaut
    bonjour,
    il faut être logique: si tu convertis ta date en double, il ne faut pas mettre les séparateurs (#):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "UPDATE tblFilDates SET tblFilDates.FilDateMod =" & cdbl(f.DateLastModified) & " WHERE (((tblFilDates.FilNom)= ""Essai.xlsx""));"

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 075
    Points : 24 701
    Points
    24 701
    Par défaut
    C'est ma faute, j'ai fait un copier coller dans mon message et j'ai laissé les séparateurs de date avec une expression numérique.

    Mais effectivement, si on recopie du code sur le net sans le comprendre ça pose des problèmes. Je n'ose pas imaginer les résultats dans Chatgpt.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Octobre 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Merci tee_grandbois pour la correction, et à Loufab pour sa précision.

    En fait, j'avais fait la même erreur et recopié ma précédent ligne de code où il n'y avait pas le Cdbl. J'avais déjà l'erreur 3075 et quand j'ai vu la solution "Cdbl", je n'ai pas fait attention aux #.

    Merci encore.

    Bidule

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Format de dates dans VBA
    Par mikhaelN dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/01/2019, 20h11
  2. FORMAT DE DATE EN VBA
    Par HAMIDOU AMERI dans le forum Excel
    Réponses: 6
    Dernier message: 15/03/2016, 21h12
  3. Format de date en VBA
    Par lucien(67) dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/01/2013, 20h44
  4. format de date de vba
    Par flamel dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/04/2010, 12h31
  5. format de date dans vba
    Par Invité dans le forum VBA Access
    Réponses: 2
    Dernier message: 08/07/2008, 21h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo