Utilisation des dates dans sql en VBA

Bonjour,

Ca fait des jours que je suis bloqué et j'ai besoin de votre aide les amis

En effet je suis entrain de développer un outil en vba qui va lire une requête sql et charger le résultat dans un onglet. Le problème qui se pose est que je n'arrive pas à faire des conditions sur les dates dans mon code VBA.

Je voudrais exécuter la requête suivante :

Select * from TAB01 where date_debut >=Sysdate ( ma Table est = TAB01 et le champ sur le quel je vais conditionner est la date de début =date_debut)

Cette requête s’exécute bien sur sqldeveloper, mais lorsque j'exécute la même requête dans mon code VBA, j'ai un message d'erreur :

"erreur d'execution -2147467259(80004005) : ORA-01861 : Le literal ne concorde pas avec le format de caractère"

Est ce que quelqu'un aurait une idéé sur comment faire pour pouvoitr conditionner ma requête sur les dates en sql VBA svp ?

Merci d'avance pour votre aide.

Visiblement la requête vise une base Oracle.

Dans Oracle, il me semble qu'un champs Date inclus automatique l'heure.

Il suffit alors d'enlever l'heure de la date avec un Cast dans ta requête, du genre :

Select * from TAB01 where CAST(date_debut) >=Sysdate

(ceci dit, je ne suis pas sûr que CAST soit bien effectif via excel?)

Bonjour Pierre56,

J'ai essayer avec la fonction Cast(), mais elle ne fonctionne pas sur Excel. en fait lorsque j'exécute sur SQLDEVELOPER j'obtiens un résultat, mais lorsque je passe la même requête dans mon code vba, je n'obtient aucun résultats.

Tu peux essayer d'envoyer depuis excel une requête simple genre

SELECT date_debut FROM TAB01

pour voir quel est le format lu par excel.

Autre piste : découper la date du genre :

SELECT * FROM TAB01 WHERE DAY(date_debut)=DAY(Sysdate) AND MONTH(date_debut)=MONTH(Sysdate) AND YEAR(date_debut)=YEAR(Sysdate)

(ok c'est un peu lourdingue ...)

Merci pour ton aide pierrep56 ,

en recupérant la date dans une cellule excel, j'ai pu récupérer le format et modifier ma requête sous la forme :

Select * from TAB01 where date_debut >=to_date(Sysdate, 'DD/MM/YYYY');

cella fonctionne maintenat sur sqldeveloper et sur Excel.

Mon problème a donc été résolu.

Merci

Bonjour,

J'ai une question sur le même sujet, j'ai une base de données avec une référence et sa date de création.

J'aimerais extraire les références de la base dont la date de création est supérieure à celle de la dernière extraction (cette date étant renseignée dans le fichier excel, en E1). J'ai essayé deux choses mais les deux ne fonctionnent pas (en E2 j'avais mis la date du jour).

Private Sub CommandButton2_Click()

Set bds = OpenDatabase(ThisWorkbook.Path & "\Base_papiers_exemple1.accdb")
'Set re = bds.OpenRecordset("SELECT Nom FROM Papiers_décors WHERE Date_création<'" & E2 & "'(Sysdate, 'DD/MM/YYYY')")
'Set re = bds.OpenRecordset("SELECT Nom FROM Papiers_décors WHERE Date_création BETWEEN '" & E1 & "' AND '" & E2 & "';")
re.MoveFirst
ligne = 5

Do
        Cells(ligne, 2) = re.Fields("Nom").Value
        re.MoveNext
        ligne = ligne + 1
    Loop Until re.EOF = True

End Sub

Merci d'avance pour votre aide

Bonne après midi

Bonjour Man,

Alors visiblement dans ce cas il s'agit de lire des données d'une base Access (et non plus Oracle).

Pour tester les dates d'un accdb, il faut les comparer avec des entiers longs, soit par exemple dans la requête une clause Where du genre :

" WHERE `Date_de_la_table_access`>=" & CLng(Ma_date)

Ma_date pouvant être une valeur date stockée dans une cellule excel quelconque

Pierre

Bonjour Pierre,

Effectivement j'ai omis de préciser que je travaille avec Access.

Merci pour ta réponse rapide j'ai essayé la comparaison avec long malheureusement ça ne donne rien j'ai une erreur incompatibilité de type...

Private Sub CommandButton2_Click()
Dim E1, E2 As Long

E1 = Feuil1.Cells(1, 5) 'date de la dernière extraction
E2 = Feuil1.Cells(2, 5) 'date du jour

Set bds = OpenDatabase(ThisWorkbook.Path & "\Base_papiers_exemple1.accdb")

'Set re = bds.OpenRecordset("SELECT Nom FROM Papiers_décors WHERE Date_création<'" & E2 & "'(Sysdate, 'DD/MM/YYYY')")
'Set re = bds.OpenRecordset("SELECT Nom FROM Papiers_décors WHERE Date_création BETWEEN '" & E1 & "' AND '" & E2 & "';")
'Set re = bds.OpenRecordset("SELECT Référence FROM Papiers_décors WHERE Date_création># " & E1 & "# And " & E2 & "#;")

Set re = bds.OpenRecordset("SELECT Référence FROM Papiers_décors WHERE Date_création>" & CLng(E1) & ";")

re.MoveFirst
ligne = 5
Do
        Cells(ligne, 2) = re.Fields("Référence").Value
        re.MoveNext
        ligne = ligne + 1
    Loop Until re.EOF = True

End Sub

Plus qu'un long discours, voici une démo fonctionnelle (sur mon PC avec Office 2016 32bits)

C'est une démo avec requête très simplette qui récupère les lignes de la table [Facture] dont la 'date facture' est le 17/10/2017 comme ceci =>

    With ActiveSheet
        Req = "SELECT * FROM [Factures] WHERE `Dt_Fctr`=" & CLng(.Range("A1").Value)

Les 2 fichiers sont à copier/coller dans un même dossier de son PC

Cf code complet dans le fichier (les données de démo sont factices...)

Pierre

Juste une remarque (de sale type) en passant :

1. Quand on écrit : Dim E1, E2 As Long si E2 est bien déclaré en Long, ici E1 est déclaré sans type et donc considéré par défaut en tant que Variant par excel.

2. Ensuite la ligne E1 = Feuil1.Cells(1, 5) place en E1 un type indéterminé et non une Value (sans erreur puisqu'un variant accepte sans broncher n'importe quel type de donnée)

Il n'est donc pas illogique que CLng(E1) renvoie une incompatibilité de type puisque là E1 est considéré alors comme Range ou qq chose d'autre par excel

Il aurait été mieux de dire explicitement :

Dim E1 As Long, E2 As Long

     E1 = Feuil1.Cells(1, 5).Value
     E2 = Feuil1.Cells(2, 5).Value

Avec ça ce serait probablement ok pour utiliser E1 directement dans la requête :

"SELECT `Référence` FROM [Papiers_décors] WHERE `Date_création`>" & E1

Sans nécessiter de transtypage puisque ici E1 est déjà un Long

Dim E1 est bien un sale type ...

Pierre

Merci de ta réponse j'ai depuis trouvé une autre solution en rentrant ces valeurs dans des textbox !

Rechercher des sujets similaires à "utilisation dates sql vba"