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 !