[VBA/SQL] Incrémenter une date
Résolu
eXqO
Messages postés
49
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Comme vous pouvez le voir je code en VBA et j'ai affaire à une base de données sous PL/SQL Developer, et j'aimerai interroger cette base via le VBA et dans le même temps, à chaque interrogation, je voudrais que les dates puissent s'incrémenter dans le même temps d'un "step" de 7 :
select count(*) from e_envoi_souscription, e_cde_document, E_CDE
where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null)
and EES_ETAT='EN_COURS'
and e_cde_document.cde_do_souscrip_ees_id = e_envoi_souscription.ees_id
and e_cde_document.cde_do_ty_se_c='WV2'
--and e_cde_document.cde_do_d between to_date('&date', 'dd/mm/yyyy hh24:mi:ss')-6
--and to_date('&date', 'dd/mm/yyyy hh24:mi:ss')
and e_cde_document.cde_do_d between
to_date('01/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
and to_date('07/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c
and e_cde.cde_d=e_cde_document.cde_do_d
and e_cde.cde_c=e_cde_document.cde_do_cde_c
and ees_duree_mois>0
and e_cde.cde_souscript_eed_ees_id is null;
Merci d'avance pour votre précieuse aide !
Cordialement,
Clément.
Comme vous pouvez le voir je code en VBA et j'ai affaire à une base de données sous PL/SQL Developer, et j'aimerai interroger cette base via le VBA et dans le même temps, à chaque interrogation, je voudrais que les dates puissent s'incrémenter dans le même temps d'un "step" de 7 :
select count(*) from e_envoi_souscription, e_cde_document, E_CDE
where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null)
and EES_ETAT='EN_COURS'
and e_cde_document.cde_do_souscrip_ees_id = e_envoi_souscription.ees_id
and e_cde_document.cde_do_ty_se_c='WV2'
--and e_cde_document.cde_do_d between to_date('&date', 'dd/mm/yyyy hh24:mi:ss')-6
--and to_date('&date', 'dd/mm/yyyy hh24:mi:ss')
and e_cde_document.cde_do_d between
to_date('01/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
and to_date('07/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c
and e_cde.cde_d=e_cde_document.cde_do_d
and e_cde.cde_c=e_cde_document.cde_do_cde_c
and ees_duree_mois>0
and e_cde.cde_souscript_eed_ees_id is null;
Merci d'avance pour votre précieuse aide !
Cordialement,
Clément.
A voir également:
- [VBA/SQL] Incrémenter une date
- Airpods 3 date de sortie - Guide
- Jm date désabonnement - Forum Gmail
- Modifier une date sur un document - Forum PDF
- Publipostage date inversée - Forum Word
- Exif date changer - Télécharger - Albums photo
18 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Oui, tu es sur la bonne voie.
Dans la parenthèse du QueryTables.Add, tu dois ajouter sql:=sql.
Le second "sql" est ne nom de la variable contenant le texte de la requete SQL.
Essaie d'abord sans le SQL, pour voir si ta connexion avec ta base de données est correcte.
As-tu déjà réussi à te connecter à partir d'Excel à cette base ?
Dans la parenthèse du QueryTables.Add, tu dois ajouter sql:=sql.
Le second "sql" est ne nom de la variable contenant le texte de la requete SQL.
Essaie d'abord sans le SQL, pour voir si ta connexion avec ta base de données est correcte.
As-tu déjà réussi à te connecter à partir d'Excel à cette base ?
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Tu dois construire le texte de ta requete SQL dans le programme VBA.
exemple de logique :
dim sql as string
dim debutperiode as date
dim ddeb as string
dim dfin as string
boucle sur debutperiode, à partir de dateserial(2009,1,1) jusqu'à now(), par pas de 7
ddeb=debutperiod, bien formaté
dfin = debutperiode=6, bien formaté
sql="select etc..."
sql=sql+ " "+ ddeb
sql=sql+"...."
sql=sql+dfin
sql=sql+"..."
exécuter sql
fin de boucle
exemple de logique :
dim sql as string
dim debutperiode as date
dim ddeb as string
dim dfin as string
boucle sur debutperiode, à partir de dateserial(2009,1,1) jusqu'à now(), par pas de 7
ddeb=debutperiod, bien formaté
dfin = debutperiode=6, bien formaté
sql="select etc..."
sql=sql+ " "+ ddeb
sql=sql+"...."
sql=sql+dfin
sql=sql+"..."
exécuter sql
fin de boucle
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Le principe est très simple : tu crées le texte de la commande SQL, en y insérant chaque fois les dates que tu veux.
ddeb = format(debutperiode,"dd/mm/yyyy")
dfin=format(debutperiode+6,"dd/mm/yyyy")
sql = "select count(*) from e_envoi_souscription, e_cde_document, E_CDE "+ _
" where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null) " + _
...etc...
+ " and e_cde_document.cde_do_d between to_date('" _
+ ddeb + " 00:00:00' , 'dd/mm/yyyy hh24:mi:ss') + _
" and to_date('" + dfin + " 23:59:59', 'dd/mm/yyyy hh24:mi:ss') " + _
" and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c " + _
...etc...
'exécuter sql
ddeb = format(debutperiode,"dd/mm/yyyy")
dfin=format(debutperiode+6,"dd/mm/yyyy")
sql = "select count(*) from e_envoi_souscription, e_cde_document, E_CDE "+ _
" where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null) " + _
...etc...
+ " and e_cde_document.cde_do_d between to_date('" _
+ ddeb + " 00:00:00' , 'dd/mm/yyyy hh24:mi:ss') + _
" and to_date('" + dfin + " 23:59:59', 'dd/mm/yyyy hh24:mi:ss') " + _
" and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c " + _
...etc...
'exécuter sql
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Tu veux changer des dates dans ta table, ou bien changer les critères de sélection dans ta requête ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Tu veux faire une série de requetes avec chaque fois des dates différentes ?
Tu as deja du code VBA qui crée ta requete ?
Tu as deja du code VBA qui crée ta requete ?
Oui, je veux faire une série de requête de façon hebdomadaire, et récupérer les résultats de ces requêtes dans un fichier Excel (à l'aide d'une macro).
Qu'entends tu part "du code VBA qui créé une requête" ?
Qu'entends tu part "du code VBA qui créé une requête" ?
Merci par contre j'ai pas bien compris cette partie...:
sql=sql+ " "+ ddeb
sql=sql+"...."
sql=sql+dfin
sql=sql+"..."
la macro devrait-elle ressembler à ça du coup :
Sub Macro1()
Dim sql As String
Dim debutperiode As Date
Dim ddeb As String
Dim dfin As String
For debutperiode = DateSerial(2009, 1, 1) To Now() Step 7
ddeb = debutperiode
dfin = debutperiode + 6
sql = "select count(*) from e_envoi_souscription, e_cde_document, E_CDE _
where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null) _
and EES_ETAT='EN_COURS' _
and e_cde_document.cde_do_souscrip_ees_id = e_envoi_souscription.ees_id _
and e_cde_document.cde_do_ty_se_c='WV2' _
--and e_cde_document.cde_do_d between to_date('&date', 'dd/mm/yyyy hh24:mi:ss')-6 _
--and to_date('&date', 'dd/mm/yyyy hh24:mi:ss') _
and e_cde_document.cde_do_d between _
sql = sql + to_date('15/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss') + ddeb _
sql = sql + and to_date('21/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss') + dfin _
and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c _
and e_cde.cde_d=e_cde_document.cde_do_d _
and e_cde.cde_c=e_cde_document.cde_do_cde_c _
and ees_duree_mois>0 _
and e_cde.cde_souscript_eed_ees_id is null;"
'exécuter sql
Next
End Sub
sql=sql+ " "+ ddeb
sql=sql+"...."
sql=sql+dfin
sql=sql+"..."
la macro devrait-elle ressembler à ça du coup :
Sub Macro1()
Dim sql As String
Dim debutperiode As Date
Dim ddeb As String
Dim dfin As String
For debutperiode = DateSerial(2009, 1, 1) To Now() Step 7
ddeb = debutperiode
dfin = debutperiode + 6
sql = "select count(*) from e_envoi_souscription, e_cde_document, E_CDE _
where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null) _
and EES_ETAT='EN_COURS' _
and e_cde_document.cde_do_souscrip_ees_id = e_envoi_souscription.ees_id _
and e_cde_document.cde_do_ty_se_c='WV2' _
--and e_cde_document.cde_do_d between to_date('&date', 'dd/mm/yyyy hh24:mi:ss')-6 _
--and to_date('&date', 'dd/mm/yyyy hh24:mi:ss') _
and e_cde_document.cde_do_d between _
sql = sql + to_date('15/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss') + ddeb _
sql = sql + and to_date('21/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss') + dfin _
and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c _
and e_cde.cde_d=e_cde_document.cde_do_d _
and e_cde.cde_c=e_cde_document.cde_do_cde_c _
and ees_duree_mois>0 _
and e_cde.cde_souscript_eed_ees_id is null;"
'exécuter sql
Next
End Sub
Je veux changer les dates des critères de sélection, celle-ci :
...
and e_cde_document.cde_do_d between
to_date('01/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
and to_date('07/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
...
;)
...
and e_cde_document.cde_do_d between
to_date('01/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
and to_date('07/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
...
;)
On m'a conseillé d'utiliser un trigger mais n'ayant pas de table contenant la date...je vois pas comment utiliser un trigger pour cette situation...! :s
Ok, je comprends ! :)
Pour ce qui est de l'exécution, parles-tu de la connexion à la base ?
Si c'est le cas, je bloque à ce niveau là voilà ce que j'ai concocter :
Private Sub recupNumeroSemaine()
'Récupérer le numéro de la semaine actuelle
Dim iNumeroSemaine As Integer
iNumeroSemaine = DatePart("ww", Now())
End Sub
--------------------------------------------------------------------------------------
Sub RemplirTableau()
For i = 1 To iNumeroSemaine Step 1
Sheets("Semaine " & i - 1).Select
Range("E6").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"FINDER;chemin_de_la_base_.sql" _
, Destination:=Range("E6")) _
End With
Next
End Sub
Suis-je sur la bonne voie, car pour le moment il m'indique une erreur au niveau du chemin, mais cela vient peut être de chez moi...
Pour ce qui est de l'exécution, parles-tu de la connexion à la base ?
Si c'est le cas, je bloque à ce niveau là voilà ce que j'ai concocter :
Private Sub recupNumeroSemaine()
'Récupérer le numéro de la semaine actuelle
Dim iNumeroSemaine As Integer
iNumeroSemaine = DatePart("ww", Now())
End Sub
--------------------------------------------------------------------------------------
Sub RemplirTableau()
For i = 1 To iNumeroSemaine Step 1
Sheets("Semaine " & i - 1).Select
Range("E6").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"FINDER;chemin_de_la_base_.sql" _
, Destination:=Range("E6")) _
End With
Next
End Sub
Suis-je sur la bonne voie, car pour le moment il m'indique une erreur au niveau du chemin, mais cela vient peut être de chez moi...
Avec le code que j'ai posté dans mon message précédent, je n'ai jamais réussi à me connecter...
Je suis actuellement en entreprise, en stage mais avec une macro+connexion à une base qui marche sur plusieurs postes je ne peux pas me connecter non plus, du coup une personne doit venir me paramétrer mon PC pour pouvoir y accéder, le problème vient surement donc de là...!
Quand tu parles de rajouter sql:=sql, c'est en lieu et place de Connection :
...
With ActiveSheet.QueryTables.Add(sql:=sql _
"FINDER;chemin_de_la_base_.sql" _
...
Je suis actuellement en entreprise, en stage mais avec une macro+connexion à une base qui marche sur plusieurs postes je ne peux pas me connecter non plus, du coup une personne doit venir me paramétrer mon PC pour pouvoir y accéder, le problème vient surement donc de là...!
Quand tu parles de rajouter sql:=sql, c'est en lieu et place de Connection :
...
With ActiveSheet.QueryTables.Add(sql:=sql _
"FINDER;chemin_de_la_base_.sql" _
...
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Non, sql:= vient en plus du reste.
connection:= indique le chemin vers la base de donnes
sql:= indique ce qu'on veut en extraire
With ActiveSheet.QueryTables.Add(Connection:= _
"FINDER;chemin_de_la_base_.sql" _
, Destination:=Range("E6"), _
sql:=sql)
connection:= indique le chemin vers la base de donnes
sql:= indique ce qu'on veut en extraire
With ActiveSheet.QueryTables.Add(Connection:= _
"FINDER;chemin_de_la_base_.sql" _
, Destination:=Range("E6"), _
sql:=sql)
Bonjour je sui vraiment desole pour le derangement
voila mon code bien expliquer et il marche bien, mais ya un autre probleme
jai declarer une variable globale dans un module
option explicit
public col As string
dan mon userform2 activate jai mis ca : TextBox1.Text = Sheets("Feuil1").Cells(1, col).Text ( es ce que c bien ici qu'il faut le mettre ?
ca marche mais je peu pas modifier le text du texbox1 , chose normale.
dans mon userform1 jai mis
Private Sub OptionButton1_Click()
col = ("C")
Load UserForm2
UserForm2.Show
End Sub
Private Sub OptionButton2_Click()
col = ("D")
Load UserForm2
UserForm2.Show
End Sub
je veu mettre un autre texbox2 mais cette fois ci je veu pouvoir remplir des cellules avec ce texbox2 , comment je peu faire svp.
voila mon code bien expliquer et il marche bien, mais ya un autre probleme
jai declarer une variable globale dans un module
option explicit
public col As string
dan mon userform2 activate jai mis ca : TextBox1.Text = Sheets("Feuil1").Cells(1, col).Text ( es ce que c bien ici qu'il faut le mettre ?
ca marche mais je peu pas modifier le text du texbox1 , chose normale.
dans mon userform1 jai mis
Private Sub OptionButton1_Click()
col = ("C")
Load UserForm2
UserForm2.Show
End Sub
Private Sub OptionButton2_Click()
col = ("D")
Load UserForm2
UserForm2.Show
End Sub
je veu mettre un autre texbox2 mais cette fois ci je veu pouvoir remplir des cellules avec ce texbox2 , comment je peu faire svp.
Ok ,très bien merci ! :)
Par contre, vu que le VBA se charge de l'incrémentation des jours et du "step" que dois-je faire de la partie ci-dessous, dans ma base de données ?
...
and e_cde_document.cde_do_d between
to_date('15/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
and to_date('21/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
...
Par contre, vu que le VBA se charge de l'incrémentation des jours et du "step" que dois-je faire de la partie ci-dessous, dans ma base de données ?
...
and e_cde_document.cde_do_d between
to_date('15/06/2009 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
and to_date('21/06/2009 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
...
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Je pensais l'avoir expliqué dans mon texte du mercredi 24 juin 2009 à 14:53:55...
Peut-etre que je ne comprends pas ta question : la requete SQL est présente dans ta base, mais tu ne l'utiliseras plus, car ta requete viendra à chaque fois de Excel.
Peut-etre que je ne comprends pas ta question : la requete SQL est présente dans ta base, mais tu ne l'utiliseras plus, car ta requete viendra à chaque fois de Excel.
Ah !!! Ok !
Excel effectuera donc le traitement et récupérera les données en se connectant à la base, si j'ai bien compris :)
Mais du coup, le chemin a spécifier doit se faire vers mon fichier de requête (.sql) ou vers autre chose ?
Merci beaucoup en tout cas, vous avez été d'une grande aide !
Excel effectuera donc le traitement et récupérera les données en se connectant à la base, si j'ai bien compris :)
Mais du coup, le chemin a spécifier doit se faire vers mon fichier de requête (.sql) ou vers autre chose ?
Merci beaucoup en tout cas, vous avez été d'une grande aide !
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Le chemin a spécifier (pour accéder à la base de données) est défini dans le "connection:="
Les détails dépendent du type de base de données, je ne peux pas t'aider.
Si tu peux te connecter à la base "à la main" à partir d'Excel, tu peux t'en inspirer (par exemple en enregistrant une macro) pour l'accés par programme.
Les détails dépendent du type de base de données, je ne peux pas t'aider.
Si tu peux te connecter à la base "à la main" à partir d'Excel, tu peux t'en inspirer (par exemple en enregistrant une macro) pour l'accés par programme.
Me revoilà :P
Première petite erreur vraiment bizarre, lorsque j'enlève le commentaire "exécuter sql" il m'annonce "Erreur de synthaxe"...:
Dim sql As String
Dim debutperiode As Date
Dim ddeb As String
Dim dfin As String
For debutperiode = DateSerial(2009, 1, 1) To Now() Step 7
ddeb = Format(debutperiode, "dd/mm/yyyy")
dfin = Format(debutperiode + 6, "dd/mm/yyyy")
sql = "select count(*) from e_envoi_souscription, e_cde_document, E_CDE" + _
"where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null)" + _
"and EES_ETAT='EN_COURS'" + _
"and e_cde_document.cde_do_souscrip_ees_id = e_envoi_souscription.ees_id" + _
"and e_cde_document.cde_do_ty_se_c='WV2'" + _
"and e_cde_document.cde_do_d between" + _
"and to_date('" + ddeb + " 00:00:00' , 'dd/mm/yyyy hh24:mi:ss')" + _
"and to_date('" + dfin + " 23:59:59', 'dd/mm/yyyy hh24:mi:ss') " + _
"and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c" + _
"and e_cde.cde_d=e_cde_document.cde_do_d" + _
"and e_cde.cde_c=e_cde_document.cde_do_cde_c" + _
"and ees_duree_mois>0" + _
"and e_cde.cde_souscript_eed_ees_id is null;" _
Next
End Sub
-------------------------------------------------------
Autre question, j'ai un soucis sur ma boucle car je dois boucler sur mes onglets (step 1) ET sur ma base SQL (step 7) dans la MEME boucle...Mais pour le moment j'ai 2 variables différentes ("i" et "debutperiode")...
Auriez-vous une solution ?
Première petite erreur vraiment bizarre, lorsque j'enlève le commentaire "exécuter sql" il m'annonce "Erreur de synthaxe"...:
Dim sql As String
Dim debutperiode As Date
Dim ddeb As String
Dim dfin As String
For debutperiode = DateSerial(2009, 1, 1) To Now() Step 7
ddeb = Format(debutperiode, "dd/mm/yyyy")
dfin = Format(debutperiode + 6, "dd/mm/yyyy")
sql = "select count(*) from e_envoi_souscription, e_cde_document, E_CDE" + _
"where ((ees_mab_nume<>'0003' and ees_mab_nume<>'6300') or ees_mab_nume is null)" + _
"and EES_ETAT='EN_COURS'" + _
"and e_cde_document.cde_do_souscrip_ees_id = e_envoi_souscription.ees_id" + _
"and e_cde_document.cde_do_ty_se_c='WV2'" + _
"and e_cde_document.cde_do_d between" + _
"and to_date('" + ddeb + " 00:00:00' , 'dd/mm/yyyy hh24:mi:ss')" + _
"and to_date('" + dfin + " 23:59:59', 'dd/mm/yyyy hh24:mi:ss') " + _
"and e_cde.cde_ty_se_c=e_cde_document.cde_do_ty_se_c" + _
"and e_cde.cde_d=e_cde_document.cde_do_d" + _
"and e_cde.cde_c=e_cde_document.cde_do_cde_c" + _
"and ees_duree_mois>0" + _
"and e_cde.cde_souscript_eed_ees_id is null;" _
Next
End Sub
-------------------------------------------------------
Autre question, j'ai un soucis sur ma boucle car je dois boucler sur mes onglets (step 1) ET sur ma base SQL (step 7) dans la MEME boucle...Mais pour le moment j'ai 2 variables différentes ("i" et "debutperiode")...
Auriez-vous une solution ?
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Tu dois supprimer le caractere de continuation ("_") à la ligne avant le "next".
Pour incrémenter un compteur d'onglet, tu peux, par exemple :
dim c_onglet as int
c_onglet=0
For debutperiode = DateSerial(2009, 1, 1) To Now() Step 7
c_onglet=c_onglet+1
...
Next
End Sub
Pour incrémenter un compteur d'onglet, tu peux, par exemple :
dim c_onglet as int
c_onglet=0
For debutperiode = DateSerial(2009, 1, 1) To Now() Step 7
c_onglet=c_onglet+1
...
Next
End Sub