Adodb word access [Résolu]

Signaler
Messages postés
35
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
25 août 2012
-
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
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.

Merci à tous

12 réponses

Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
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
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
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
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Après le .Open, fais .Execute "UPDATE maTable2 SET tonChamp=True WHERE critere=x;"

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
35
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
25 août 2012

Merci beaucoup pour l'aide mais en fait, ça ne marche pas. Il me refuse le .execute
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Quelle erreur obtiens-tu ?


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
35
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
25 août 2012

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.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
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
Messages postés
35
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
25 août 2012

rien de mieux.
J'ai pourtant modifié comme ça :


With rsT
.ActiveConnection = Conn
.Execute "update maTable2 set tâche_exécutée =true where NTâche=872"
.Update
End With

et toujours le même message. Erreur de compilation.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
.Open de la connexion = .Open après .Provider =xxx

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
35
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
25 août 2012

ça marche. Merci infiniment pour ton aide.
Messages postés
35
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
25 août 2012

En fait, j'ai encore un plantage.
Mon code est le suivant :


valeurtache = Val(ActiveDocument.MailMerge.DataSource.DataFields(NumDetache).Value)

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....
Messages postés
35
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
25 août 2012

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.