huascaran01
Messages postés35Date d'inscriptionmercredi 12 août 2009StatutMembreDernière intervention25 août 2012
-
8 août 2011 à 15:28
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 2013
-
14 août 2011 à 11:32
Bonjour,
J'utilise dans mon boulot une base access et un word 2003. J'utilise la base pour faire du publipostage mais, à partir de word, j'envoie aussi des info dans accesse.
Jusqu'à présent, j'avais uniqument utilisé une macro qui envoyait des info sous forme d'un nouvel enregistrement dans access.
Le bout de macro était le suivant :
Dim rsT As ADODB.Recordset
Dim fd As ADODB.Field
Dim maTable As String
Set Conn = New ADODB.Connection
Set rsT = New ADODB.Recordset
If valeurtache = 229 Then
maTable2 = "T_Tâche_2"
tachexéc = "True"
End If
With Conn
.Provider = "Microsoft.JET.OLEDB.4.0"
.Open "C:\base\cabinet.mdb"
End With
With rsT
.ActiveConnection = Conn
.Open maTable2, LockType:=adLockOptimistic
.AddNew
.Fields("Code_tâche_nécessaire").Value = TN
.Fields("Code_dossier").Value = valeurdossier
.Fields("Date_réalisation").Value = datetache
.Update
End With
rsT.Close
Conn.Close
Je voudrais pouvoir utiliser la macro pour modifier un enregistrement de cette table (plus concrètement, je voudrais modifier l'enregistrement sélectionné pour qu'un champ case à cocher soit affecter de "true").
Je suppose que je vais devoir virer le Addnew mais franchement je suis bloqué.
Si quelqu'un peut m'aider, ce serait génial.
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 14 août 2011 à 09:07
Dim fd As ADODB.Field
Dim maTable As String
Inutiles (je pensais pas que c'était utile de le préciser vu qu'on voit clairement qu'on ne mentionne jamais leur nom). Ou alors y'a encore d'horribles bouts de code avec rs.Update
Ici le SQL est forcé à "Update T_Tâche_2 Set tâche_exécutée=True where N°Tâche=valeurtache;". Pour faire simple, il ne s'occupe pas des variables dont tu aurais pu parler dedans (logique, vu que c'est une bête chaine entre Dguillemets). Tu dois concaténer avec &. Pas besoin de mettre la valeur du champ dans une variable si tu ne t'en sers que là : .Execute "UPDATE T_Tâche_2 SET tâche_exécutée=True WHERE N°Tâche=" & ActiveDocument.MailMerge.DataSource.DataFields(NumDetache).Value . Il faut absolument que dans la BDD, ce champ est un entier. J'espère que tu as un Option Explicit en tête de module/form sinon le reste du code ça doit pas être du joli. T'as plusieurs subs comme ça ?
VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 14 août 2011 à 11:32
Utilise Réponse acceptée à mes réponses qui t'ont aidé, ça permettra peut-être à d'autres gens de gagner du temps (et le topic sera marqué comme résolu, plus facile pour ceux qui aident). Bon dimanche
VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
huascaran01
Messages postés35Date d'inscriptionmercredi 12 août 2009StatutMembreDernière intervention25 août 2012 9 août 2011 à 20:23
j'obtiens une erreur 461 erreur de compilation - membre de méthode ou de données introuvable.
J'avais pourtant adapter le code de la façon suivante :
Dim Conn As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim fd As ADODB.Field
Dim maTable As String
Set Conn = New ADODB.Connection
Set rsT = New ADODB.Recordset
maTable2 = "T_Tâche_2"
datetache = Date
TN = 230
TB = 15
With Conn
.Provider = "Microsoft.JET.OLEDB.4.0"
.Open "C:\base\cabinet.mdb"
End With
With rsT
.ActiveConnection = Conn
.Open maTable2, LockType:=adLockOptimistic
.Execute "update maTable2 set tâche_exécutée =true where NTâche=872"
.Update
End With
rsT.Close
Conn.Close
Le NTâche est un code artificiel pour tenter de modifier l'enregistrement 872. Evidemment dans la version non test, le NTâche est déterminé par une recherche dans la macro.
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 9 août 2011 à 20:40
Désolé de ne pas avoir précisé, je parlais du .Open de la connexion (le reste du code est inutile, à part la fermeture de la connexion et la destruction de l'objet). Pour info, tu peux faire l'insertion de la même façon via un INSERT INTO.
VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Dim Conn As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim fd As ADODB.Field
Dim maTable As String
Set Conn = New ADODB.Connection
Set rsT = New ADODB.Recordset
With Conn
.Provider = "Microsoft.JET.OLEDB.4.0"
.Open "C:\base\cabinet.mdb"
.Execute "Update T_Tâche_2 Set tâche_exécutée=True where N°Tâche=valeurtache;"
End With
Superplantage.
Valeurtache est un champ d'une base access. Dans mon exemple, la valeur du champ est 871.
Si je suis ma macro, j'ai bien une valeurtache de 871. Quand j'arrive au .execute...plantage.
Si dans cette partie, je remplace le valeurtache par 871, ça marche.
Mais ce que je voudrais, c'est évidemment que mon execute utilise la valeur récupérée ailleurs.
Si tu as une idée....
huascaran01
Messages postés35Date d'inscriptionmercredi 12 août 2009StatutMembreDernière intervention25 août 2012 14 août 2011 à 10:27
oui, tu as raison, j'étais très distrait. Tout fonctionne. Merci. Pour mes codes, tu as sans doute raison. Au fur et à mesure que je développe, je rajoute du code souvent de façon anarchique et c'est pas très joli.
En tout cas merci beaucoup pour ton aide.