Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/05/2011, 19h30   #1
Invité de passage
 
Homme maxime
Développeur informatique
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme maxime
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 2
Points : 2
Par défaut Calcul dates prévisionnelles

Bonjour à toutes et à tous !

Voilà je suis en stage actuellement et dois développer une base de données exclusivement sous Access. Mais je suis bloqué depuis quelques jours. J'ai recherché partout sur le net, j'ai bien trouvé quelques réponse, mais rien qui ressemble à ce que je dois faire.

Je dois Calculer à l'aide du VBA une date prévisionnel pour des controles redondants.
Chaque contrôle a un cycle différent, et je dois calculé la date du prochain contrôle. en prenant en compte, les jour/semaine/mois/trimestre/semestre/ans
et le nombre de jour/semaine,etc...


cela se présente comme ça:
Last Done: 23/05/2011 (la date dont je dispose)
Every [ 1 ] [ Week ] (le cycle)
Next Due: 30/05/2011 (date à calculer)

Je n'ais aucune idée de comment m'y prendre, je ne connais que très peu le VBA.
Je vous serais très reocnnaissant de m'aidé à me sortir de cette impasse

Merci à vous
Tiberium76
Tiberium76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 06h05   #2
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 615
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 615
Points : 30 962
Points : 30 962
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Tu devrais regarder du coté de la fonction VBA DateAdd, ce tuto te donnera toutes les astuces pour manipuler les dates.

Cette partie là te concernera plus : http://mhubiche.developpez.com/vba/f...tetime/#LIII-D

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 09h27   #3
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bonjour,

J'ai eu un cas similaire, à partir d'une date et d'une fréquence calculer la prochaine date de computation.

Voici la méthode que j'utilise :
Je met ceci dans une requête :
Code :
1
2
UPDATE NOMTABLE SET NEXTDUE = DateAdd("d",7,LASTDUE)
WHERE Frequency In ("weekly");
Celui-ci te permet d'ajouter 7 jours à ta last date et ainsi d'obtenir ta Nextdue.(en sachant que Lastdue et Nextdue sont des champs différents)
Et pour la fréquence, c'est si tu as un champs avec plusieurs fréquences définient.(du genre weekly, daily, monthly,...)

Alors ensuite soit tu fais plusieurs requêtes comme celle là pour tous les cas de figure que tu peux avoir et tu met du code VBa pour les lancer du genre :

Code :
CurrentDb.Execute "QUERYNAME", dbFailOnError
Pour chaque requête un ligne comme celle-ci avec le nom de ta requête.

Soit si tu as vraiment des cycles embêtant du genre tous les 2 jours, tu dois mettre directement ta requête dans ton code VBA et utiliser des variables pour récupérer et le nombre ( [ 1 ] dans ton exemple) et la fréquence ( [ Week ] dans ton exemple).

Après si tu as des problèmes pour ça, tu peux toujours demander ^^.
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h42   #4
Invité de passage
 
Homme maxime
Développeur informatique
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme maxime
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 2
Points : 2
Merci beaucoup !! Je ne connaissais pas cette fonction. j'ai essayé de la mettre en oeuvre avec une requète mais je ne vois pas comment m'y prendre. Je ne vois pas où mettre le code.

J'ai donc si j'ai bien compris: NextDue = DateAdd ( TimeProfile, Frequency, LastDone)

Ma table contient pour chaque controles, l'intervalle (yyyy,ww,d,etc...) , la fréquence en nombre, et la date de reférence.
Il n'y a que le champ NextDue à calculer.
On ne peut pas faire quelque chose comme dans Excel, où l'on met la fonction, ses paramètre (ici les autres champ) et le petit = pour que tout roule ?

Comment puis-je mettre à jour toutes les NextDue de tout les enregistrement de ma table ? je ne vois pas du tout. c'est complétement flou

Si ce n'est pas possible, au moins les afficher dans une Text Box.
Ce n'est pas très grave qu'ils soient dans la table, mais c'est mieux.

Voici le Code VBA que j'ai essayé mais ça ne fonctionne pas

Code :
1
2
3
4
5
6
Private Sub DA_f_Controls_2_AfterUpdate()
   Dim NextDueDate As Date 'Declare variables.
   Dim DA_f_Controls_2 As Object
   Set NextDueDate = DateAdd([t_controls]![TimeProfile], [t_controls]![Frequency], [t_controls]![LastDone])
   Set DA_f_Controls_2.Value = NextDueDate
End Sub
Merci à vous !
Tiberium76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 20h46   #5
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bon alors dans ton cas je ferais comme cela :

Code :
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
Sub Update_date()
 
Dim oRS as ADODB.Recordset
Dim oConn As ADODB.Connection
Dim Frequence as string, Dim Intervalle as String
 
'Connection à la Base Access
Set oConn = CurrentProject.Connection
 
Set oRS = New ADODB.Recordset
oRS.Open "Select * from NomDeTaTable", oConn, adOpenKeyset, adLockOptimistic
 
Do While Not (oRS.EOF)
 
'Tu mets ici, a la place de * le numéro de ton champs où se trouve l'intervalle, en sachant que les numéros de tes champs commencent a 0
    Intervalle = oRS.Fields(*).value
'Idem mais pour la fréquence
    Frequence = oRS.Fields(*).value
 
'Tu as donc stocker tes valeurs de tes champs pour une ligne dans ses 2 variable : Intervalle et Frequence.
 
' Là tu lances la requête grace à currentdb.execute
 
    CurrentDb.Execute "UPDATE NOMTABLE SET NexTDue = DateAdd(" & Intervalle & "," & Frequence & ",LastDone)", dbFailOnError
 
    oRS.Movenext
Loop
oRS.close
 
Set oRS = Nothing
'Fermeture de la connection Access
Set oConn = Nothing
 
End Sub
Voila, si j'ai pas fait d'erreur cela devrait fonctionner, tu as juste a changer le nom de la table et les champs s'il ne sont pas pareil dans ta table et à ajouter les numéros de champs(comme expliqué dans le programme).

Si tu n'as jamais fait de VBA, tu mets ce code dans un module dans visual basic de access.
Ensuite pour le lancer, soit tu fais simplement play, soit tu te crée une macro de lancement de ce code.(ou un formulaire)

Dernier petit détail, ne pas oublier de référencer ta bibliothèque avec dans Visual Basic : Outils > référence > Microsoft ActiveX Data Objects *.* library.

Bonne soirée.
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 20h49   #6
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Ah oui au fait!

Pour créer une requête de ce type(Type UPDATE) , tu vas dans le gestionnaire de requête, tu ne sélectionne aucune table et tu vas dans le SQL view et tu colles ton Update machin dedans.
Dans ton cas, comme tu as beaucoup de choix différents pour chacune de tes dates, tu devrais créer une requête pour chaque cas, du genre : tous les 7 jours, tous les 2 jours, tous les trimestres, tous les mois,...

Voila j'espère avoir été assez clair, si tu as d'autres questions n'hésites pas.

Cordialement,

Quentin.
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 14h52   #7
Invité de passage
 
Homme maxime
Développeur informatique
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme maxime
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 2
Points : 2
Merci beaucoup pour ton aide. ça fonctionne ! je n'ais même pas eu besoin de créer un module j'ai juste créé une requête comme tu m'as dis:

Code :
UPDATE t_Controls SET NexTDueDate = DateAdd(TIMEPROFILE,FREQUENCY,LASTDONE);
et ensuite je l'execute avec une macro, ou un bouton:

Code :
CurrentDb.Execute "q_NextDueDate", dbFailOnError

Résultat, tous mes enregistrement sont mis à jour avec la date calculée.
Par contre j'ai une dernière petite question. Comment peut-on faire pour executer un Refresh All , après une selection faite dans une Combo Box ?
j'ai essayé:

Code :
 DoCmd.RunCommand acCmdRefresh
mais sans succes, ça ne rafraichie pas tout.

Merci à vous !
Tiberium76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h15   #8
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Cool, tu viens de m'apprendre que l'on pouvait mettre des noms de champs à la place de 'd', 'mm',...

Par contre, ne sachant pas ce qu'est une combo-box(ou zone de liste?...), je ne peux pas t'aider là-dessus, désolé.

Je t'aide dans la limite très limitée de mes connaissances ^^.
En tout cas, bonne continuation !
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h29   #9
Invité de passage
 
Homme maxime
Développeur informatique
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme maxime
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 2
Points : 2
Jolie échange de connaissance en somme

Combo-Box est le nom anglais pour designer une liste déroulante.

je viens de voir que l'on pouvait aussi utilisé .Requery
mais je ne vois pas où mettre cette commande. peut-être directement dans le formulaire... je vais essayé... un truc du style Me.Requery

Bonne continuation à toi aussi !!
Tiberium76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h12   #10
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Au fait, tu peux mettre la discussion en résolue (en bas de page quand tu es connecté).
Et si tu as d'autres questions différentes que celle du titre, mets les plutôt en nouvelle discussion, tu auras plus de chance d'avoir des réponses.

A+
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h59.


 
 
 
 
Partenaires

Hébergement Web