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 :

Problème de date - Requète SQL


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Problème de date - Requète SQL
    Bonjour le forum,

    Je réalise une requête SQL sur un classeur Excel fermé pour récupérer des données.

    Dans une colonnes il y a des dates au format 'Français' mais je suppose que le SQL ne prend pas en compte que le même format.
    Du coup je me retrouve avec un grand n'importe quoi au niveau des dates.

    Y a t-il une astuce pour travailler sur un format unique ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir vcottineau

    Une astuce, je n'en connais pas...
    Il faut juste travailler sur les dates au format américain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaDate = Format(Date,"mm/dd/yyyy")
    A+

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je m'explique:
    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
    Option Explicit
     
    Private Sub cmbChargement_Click()
     
      Dim strFichier$, strFeuille$, strSQL$, strFileName$
      Dim Cn As ADODB.Connection, Rs As ADODB.Recordset
      Dim strDonnees() As Variant
     
      'Choix du fichier
      strFichier$ = ""
      strFeuille$ = ""
     
      'Connection au fichier Excel source
      Set Cn = New ADODB.Connection
      Set Rs = New ADODB.Recordset
     
      With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
          & strFichier$ & ";Extended Properties=""Excel 12.0;HDR=NO;"""
        .Open
      End With
     
      'Requète pour récupérer les données d'entrées
      strSQL$ = "SELECT * FROM [" & strFeuille$ & "$] WHERE YEAR(F1) = " & strAnnee
      Set Rs = Cn.Execute(strSQL$)
      strDonnees = Application.Transpose(Rs.GetRows)
     
      'Fermeture de la connexion
      Cn.Close
      Set Rs = Nothing
      Set Cn = Nothing
     
      'Copie des données
      With Worksheets("DATA")
        .Range(.[A2], .Cells(UBound(strDonnees, 1) + 1, UBound(strDonnees, 2))) = strDonnees
      End With
     
    End Sub
    Dans la feuille 'strFeuille$' il y a une colonne avec des dates.
    Je n'ai pas la main sur le format des dates dans ce fichier (et elles sont au format 'Français').

    Quand je colle le résultat de ma requête dans un autre fichier Excel les dates se retrouvent mélangées entre le format 'Français' et le format 'Anglais'.
    Du coup je ne vois pas comment intégrer ta proposition 'BrunoM45'.

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    j'ai du mal à visualiser mais pour tout souci de date la fonction CDate est plutôt utile …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Ton problème vient du fait qu'avec le code suivant, tu transfères de VBA à la feuille Excel, tes dates en tant que valeurs STRING et non valeurs DATE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Copie des données
      With Worksheets("DATA")
        .Range(.[A2], .Cells(UBound(strDonnees, 1) + 1, UBound(strDonnees, 2))) = strDonnees
      End With
    Trouve une autre facon de transférer les valeurs de strDonnees vers la feuille Excel de facon à ne JAMAIS envoyer une date sous format STRING vers une feuille, car Excel interprète alors la date comme étant une date STRING au format américain:

    cells(ligne,col).value= CDate(DateValue(DateOutput) & " " & TimeValue(DateOutput))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 0 to ubound(strDonnees)
    'Si la valeur est une date
     cells(ligne,col).value = Cdate (DateValue(strDonnees(i)) & " " & TimeValue(strDonnees(i)))
    next
    CDate(DateValue(DateOutput) & " " & TimeValue(DateOutput))

    Cordialement
    Cordialement

    Docmarti.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci 'Docmarti' pour ta proposition qui fonctionne très bien.

    Cependant je suis obligé de traiter chaque ligne au lieu de copier directement le tableau.

    Y a-t-il une possibilité d'appliquer cette opération sur un tableau que l'on copie dans Excel ?

    Parce que le but des requêtes SQL c'était de gagner du temps d’exécution.
    Dernière modification par AlainTech ; 22/09/2013 à 12h11. Motif: y a t'il -> y a-t-il

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Une date dans Excel est d'abord une valeur numérique. Par exemple 41 875 correspond au 1/1/2013 …

    Tu pourrais donc aussi ouvrir la feuille en ayant auparavant désactiver le rafraîchissement de l'écran
    puis effectuer directement une copie :

    ClasseurCopie.FeuilleCopie.RangeDestination.Value2 = ClasseurSource.FeuilleSource.RangeSource.Value2
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Sauf que mon 'RangeSource' est une suite de ligne mélangées aléatoirement avec des années différentes et c'est pourquoi je filtre en SQL pour ne garder qu'une seule année.
    Dernière modification par AlainTech ; 22/09/2013 à 12h21. Motif: Suppression de la citation inutile

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Oui évidemment …

    En dehors de la solution de Docmarti dans la continuité de mon indication (CDate),

    tester auparavant de modifier la ligne n° 36 ainsi : .Range().Value2 = strDonnees, sait-on jamais …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Essaie de mettre les dates dans un tableau de type DATE puis de remplacer par ce tableau les dates de type STRING et d'attribuer le format "m/d/yyyy" aux cellules destination. Car il semble que les dates du tableau de type date soient interprétées comme étant de type DOUBLE.
    Cordialement

    Docmarti.

  11. #11
    Invité
    Invité(e)
    Par défaut
    convertis tes dates au format internationnale derctement dans ta requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql ="select format(date,'yyyy-mm-dd hh:mm:ss') as dates,...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    convertis tes dates au format internationnale derctement dans ta requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql ="select format(date,'yyyy-mm-dd hh:mm:ss') as dates,...
    Super ça marche. Merci à vous !

  13. #13
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 419
    Points : 16 262
    Points
    16 262
    Par défaut
    Bonjour

    A quoi sert la ligne 27 ?

    Chez moi elle plante.

    Si je la remplace par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      With Worksheets("DATA")
        Range("A2").CopyFromRecordset Rs
      End With
    je récupère bien les lignes avec des dates au bon format...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  14. #14
    Invité
    Invité(e)
    Par défaut
    Je ne connaissais pas cette méthode.
    Effectivement elle fonctionne du premier coup.

    Merci pour cette proposition que je garde.
    Dernière modification par AlainTech ; 22/09/2013 à 12h23. Motif: Suppression de la citation inutile

  15. #15
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Il manque un point devant le Range.

    Sinon autant le faire directement en une seule ligne : Worksheets("DATA").Range("A2").CopyFromRecordset Rs
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #16
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 419
    Points : 16 262
    Points
    16 262
    Par défaut
    Bonjour
    Citation Envoyé par Marc-L Voir le message
    Il manque un point devant le Range.

    Sinon autant le faire directement en une seule ligne : Worksheets("DATA").Range("A2").CopyFromRecordset Rs
    Effectivement je l'ai vu après avoir posté mais ai oublié de rectifier...
    C'est bien tu veilles...

    Au passage, coucou à Bruno45 que j'ai oublié de saluer...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  17. #17
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par Docmarti Voir le message
    Essaie de mettre les dates dans un tableau de type DATE puis de remplacer par ce tableau les dates de type STRING et d'attribuer le format "m/d/yyyy" aux cellules destination. Car il semble que les dates du tableau de type date soient interprétées comme étant de type DOUBLE.
    Correction : Mettre plutôt les dates dans un tableau de type VARIANT. Les dates du tableau de type VARIANT sont interprétées correctement lorsque transmises à une feuille Excel à partir de VBA.
    Cordialement

    Docmarti.

Discussions similaires

  1. [SQL] Problème de " dans requête SQL
    Par cciocc dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/05/2006, 10h22
  2. [SQL] Problème PHP et requête SQL
    Par Pepito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/05/2006, 02h41
  3. [MySQL] Problème avec une requête SQL
    Par chobol dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 11/05/2006, 12h29
  4. [VB]Problème avec une requête SQL
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/03/2006, 17h47
  5. Problème pour bâtir requête SQL
    Par Val2005 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/11/2005, 15h49

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