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

Macros et VBA Excel Discussion :

format date et sql [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut format date et sql
    salut le phorum

    je me bats depuis 4 heures avec une requête sql intégré dans du vba
    je m'explique
    j'ai un lien DAO avec une base access
    dans cette base j'ai une colonne Date au format Date/heure
    je souhaiterai par invite lors du lancement du vba choisir une période
    seulement le problème c'est que j'ai l'erreur
    type de données incompatibles dans le cas ou j'inscris cette ligne de code pour mes variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Période = "((Date)>='" + dDateDéb + "'  And (Date)<= '" + dDateFin + "')"
    ou cette erreur
    erreur de syntaxe dans la date de l'expression
    si je modifie pour le format spécifique des date dans le sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Période = "((Date)>=#" + dDateDéb + "#  And (Date)<= #" + dDateFin + "#)"
    les erreurs se manifestent à l'arrivée de la ligne ci dessous ??
    et voici le sql qui va taper dans la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    recordset.Open ("SELECT * FROM T002_SAISIE_QUALIF WHERE " & Période & "ORDER BY Séquentiel;"), cnx
    une personne charitable pourrait elle m'indique ou le bas blesse

    merci

    munity

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,
    la fonction Date est spécifique à VBA, elle renvoie la date du jour, il faut modifier le champ en l'encadrant de crochets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Période = "([Date]>=#" + dDateDéb + "#  And [Date]<= #" + dDateFin + "#)"
    qui soit dit en passant peut être remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Période = "([Date] BETWEEN #" + dDateDéb + "#  And #" + dDateFin + "#)"
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    salut jpcheck

    merci pour ta réponse mais j'ai toujours le même problème quelquesoit l'instruction sql AND ou BETWEEN
    Dans le doute au cas ou j'aurais foiré à un autre endroit (j'en doute mais on sait jamais) je mets le code
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Public cnx As ADODB.Connection
    Public recordset As ADODB.recordset
    Sub ConnectDB(ByRef cnx As ADODB.Connection, ByVal strPath As String)
    'Définition répertoire et chemin base
        strPath = "c:\TRAITEMENT.mdb"
    'Test si fichier accessible
         If Len(Dir(strPath)) > 0 Then
            Set cnx = New ADODB.Connection
                If cnx.State <> adStateClosed Then cnx.Close
    'Définition du pilote de connexion
                cnx.Provider = "Microsoft.Jet.Oledb.4.0"
    'Définition de la chaîne de connexion
                cnx.ConnectionString = strPath
    'Ouverture de la base de données
            cnx.Open
        Else
            MsgBox "La base n'a pas pu être trouvée" & vbCrLf & _
                    strPath & vbCrLf & _
                    "n'est pas un chemin valide.", vbCritical + vbOKOnly
        End If
    End Sub
    Public Sub QUALIF()
        Connexion_BDD.ConnectDB cnx, strPath
     
        Set recordset = New ADODB.recordset
           recordset.CursorType = adOpenStatic
        Dim dDateDéb, dDateFin As String
        Dim dDatePériode As String
      Dim data_recherchee As String
        'data_recherchee = Sheets("Gestion BDD Nécrologie").rechercher_data_necro.Value
     
        Vider_Liste_Qualif
     
        dDateDéb = Sheets("QUALIFICATION").TextBox1.Value
        dDateFin = Sheets("QUALIFICATION").TextBox2.Value
     
        If IsDate(dDateDéb) Or IsDate(dDateFin) Then
            Période = "([Date] BETWEEN #" + dDateDéb + "#  And #" + dDateFin + "#)"
            Else
            Période = ""
        End If
     
        'récupération de la table Qualif
         'If (detect_num(data_recherchee)) Then
        recordset.Open ("SELECT * FROM T002_SAISIE_QUALIF WHERE " & Période & "ORDER BY Séquentiel;"), cnx ' ORDER BY Séquentiel"), cnx
        i = [C_Sequentiel].Row + 1
        While Not recordset.EOF
            For j = 1 To recordset.Fields.Count
                Sheets("QUALIFICATION").Cells(i, j) = recordset(j - 1)
            Next
            i = i + 1
            recordset.MoveNext
        Wend
        'End If
     
    End Sub

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    ajoute une espace avant le ORDER BY, ca devrait débloquer...

    quel est le numéro et la description de l'erreur qui reste après cela ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    re

    ajout de l'espace comme ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    recordset.Open ("SELECT * FROM T002_SAISIE_QUALIF WHERE " & Période & " ORDER BY Séquentiel;"), cnx
    avec comme variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Période = "([Date] BETWEEN '#" + dDateDéb + "#'  And '#" + dDateFin + "#')"
    pour la syntaxe ci dessus le message est
    "Type de données incompatible dans l'expression du critère"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Période = "[Date] BETWEEN #" + dDateDéb + "#  And #" + dDateFin + "#"
    pour la syntaxe ci dessus le message est
    "erreur de syntaxe dans la date dans l'expression"

    pour les 2 erreurs j'ai le même numéro
    le numéro d'erreur est le suivant
    erreur d'execution
    '-2147217913 (80040e07)

  6. #6
    Membre éclairé Avatar de casavba
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 462
    Par défaut
    et si tu testais comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    période = "([Date] BETWEEN '" + dDateDéb + "'  And '" + dDateFin + "')"

    NB: Evites dans tes projets d'utiliser des noms propres à Excel, Access... ;



    Aussi, j'ai remarqué dans la fin de ton code, tu ne fermes pas la base Access et tu ne vides pas la mémoire.

    essaies de rajouter ce bout de code à la fin du tien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cnx.Close
        Set recordset = Nothing
        Set cnx = Nothing

  7. #7
    Membre chevronné
    Inscrit en
    Janvier 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 483
    Par défaut
    Bonsoir
    essai comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        If IsDate(dDateDéb) Or IsDate(dDateFin) Then
            Période = "Date Between #" & dDateDéb & "#And#" & dDateFin & "#"
            Else
            Période = ""
        End If
    Bonne nuit

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    salut le phorum

    merci pour les conseils casavba (j'ai bien ajouté ta fermeture de base c vrai que j'avais omis cette partie) et Abed_H mais par contre pour la syntaxe toujours le même problème d'erreur
    je desespère de trouver la solution
    a savoir que dans la base access le format de la colonne [date] est un format date/heure c'est pour cela que je comprends pas le problème d'erreur


  9. #9
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Peut etre pas la solution mais a tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Période = "Date Between '" & datevalue(dDateDéb) & "' And '" & datevalue(dDateFin) & "'"
    Avec ' ou #

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    salut jfontaine

    merci pour la proposition mais non toujours pas snif snif snif

    à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recordset.Open ("SELECT * FROM T002_SAISIE_QUALIF WHERE " & période & " ORDER BY Séquentiel;"), cnx ' ORDER BY Séquentiel"), cnx
    toujours le même message
    "type de données incompatibles dans l'expression du critères"

    c'est à desespérer

    munity

  11. #11
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    comme tu manipules une requête dans Access, le format à utiliser reste #MM/DD/YYYY#.

    Passe par une variable strSQL qui contient la requête, et affiches nous son contenu pour qu'on voit à quel niveau il y a une erreur potentielle.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    salut jp

    ci joint le code utilisé
    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
     
    Dim dDateDéb As Date
        Dim dDateFin As Date
        Dim Période As String
     
    dDateDéb = Sheets("QUALIFICATION").Range("Date_Début").Value
        dDateFin = Sheets("QUALIFICATION").Range("Date_Fin").Value
     
        If IsDate(dDateDéb) Or IsDate(dDateFin) Then
            période = "(Date BETWEEN '" & dDateDéb & "' And '" & dDateFin & "')"
            Else
            période = ""
        End If
     
        'récupération de la table Qualif
         'If (detect_num(data_recherchee)) Then
         'recordset.Open ("SELECT * FROM T002_SAISIE_QUALIF ORDER BY Séquentiel;"), cnx ' ORDER BY Séquentiel"), cnx
     
         strSQL = "SELECT * FROM T002_SAISIE_QUALIF WHERE " & période & " ORDER BY Séquentiel;"
        recordset.Open (strSQL), cnx ' ORDER BY Séquentiel"), cnx
    et voici le contenu du strSQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM T002_SAISIE_QUALIF WHERE (Date BETWEEN '01.10.2009' And '31.10.2009') ORDER BY Séquentiel;
    mais je ne vois pas ou je dois lui indiquer qu'il doit inverser la date "#mm/dd/yyyy""
    et qu'il me récupére bien une date au format france depuis excel afin de comparer les 2


  13. #13
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Ta requete devrait plutot ressembler a quelques chose comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM T002_SAISIE_QUALIF WHERE ([Date] BETWEEN '01/10/2009' And '31/10/2009') ORDER BY Séquentiel;
    Pour etre sur que le format utiliser est le meme dans les 2 systemes j'utilise datevalue.
    Cela évite surtout que le 1 octobre (01/10/2009) devienne dans le format US le 10 janvier (10/01/2009)

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    oups j'avais oublié les crochets je les ai ajouté mais toujours le même problème
    "type de données incompatibles dans l'expression du critères"

  15. #15
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    2 choses :
    - les dates entre #
    - au format US #MM/DD/YYYY#

    la requête que tu dois obtenir sera la suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM T002_SAISIE_QUALIF WHERE ([Date] BETWEEN #10/01/2009# And #10/31/2009#) ORDER BY Séquentiel;
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    j'ai trouvé grace à vous tous et à un autre forum également

    ci dessous la soluce proposée (peut être plus simple mais en tout cas cela marche en l'état)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim dDateDéb As String
    Dim dDateFin As String
    Dim Période As String
     
       dDateD = Sheets("QUALIFICATION").Range("Date_Début").Value
       dDateF = Sheets("QUALIFICATION").Range("Date_Fin").Value
     
       dDateDéb = MakeUSDateD(dDateD)
       dDateFin = MakeUSDateF(dDateF)
     
    Période = "([Date] BETWEEN " & [dDateDéb] & " And " & [dDateFin] & ")"
    et création d'une fonction comme suit pour mettre au format US les dates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function MakeUSDateD(dDateD As Variant)
     If Not IsDate(dDateD) Then Exit Function
        MakeUSDateD = "#" & Month(dDateD) & "/" & Day(dDateD) & "/" & Year(dDateD) & "#"
    End Function
    Function MakeUSDateF(dDateF As Variant)
     If Not IsDate(dDateF) Then Exit Function
        MakeUSDateF = "#" & Month(dDateF) & "/" & Day(dDateF) & "/" & Year(dDateF) & "#"
    End Function
    j'ai également ajouter dans les cellules excel ou la date doit être saisie une validation obligeant la personne a saisir un date et pas autre chose
    on sait jamais.....

    merci encore j'ai mis 1 journée pour trouver mais c'est bon j'espère que cela aidera d'autres personnes qui ont ce type de problème

    munity

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

Discussions similaires

  1. Group By Format([DATE]) VBA - SQL
    Par Bastien06 dans le forum VBA Access
    Réponses: 4
    Dernier message: 25/03/2010, 15h53
  2. Format Date sur sql server 2000
    Par randriamanana dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 29/01/2008, 09h01
  3. Pb de Format date en sql
    Par Bombar dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/01/2008, 10h55
  4. Format date en SQL et ACCESS
    Par mic352 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/04/2007, 21h18
  5. [SQL]Format date en SQL
    Par mic352 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 16/04/2007, 10h26

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