La Macro1 avec le nom MaMacro est elle deja presente dans ta base Access.
Version imprimable
La Macro1 avec le nom MaMacro est elle deja presente dans ta base Access.
Oui, mais sous le nom de Update()
Pièce jointe 7480
Je sais ouvrir Access et charger la base, je ne sais pas s'il faut utiliser < #include <utilcls.h> >, je ne l'ai pas fait.
Le code
Je cherche pour lancer la macro.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 void __fastcall TForm1::Button1Click(TObject *Sender) { Variant vMSAccess; vMSAccess = Variant::CreateObject("Access.Application"); vMSAccess.OlePropertySet("Visible", true); Variant vFileName; // ouverture d'une table Access vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\MySQL\\UtilisationBDE\\fichiers\\maBdd\\maBdd1.mdb"; vMSAccess.OleFunction("OpenCurrentDatabase", vFileName, false); }
J'ai repris ton code, :
il me manque la façon de faire l'appelCode:
1
2
3
4
5
6
7
8
9
10 Variant vMSAccess; vMSAccess = Variant::CreateObject("Access.Application"); vMSAccess.OlePropertySet("Visible", true); Variant vFileName; // ouverture d'une table Access vFileName = "E:\\MDB\\GDO.mdb"; vMSAccess.OleFunction("DoCmd.RunMacro \"update\", false, false");
Comme je ne connais pas Access, et que je n'ai aucune Doc, je n'arrive pas a programmer une Macro pour tester, je te donne donc le code pour ouvrir et fermer Access charger ta base, la je suis sur que cela fonctionne, pour lancer la Macro a voir?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void __fastcall TForm1::Button1Click(TObject *Sender) { Variant vMSAccess; vMSAccess = Variant::CreateObject("Access.Application"); vMSAccess.OlePropertySet("Visible", true); Variant vFileName; // ouverture d'une base Access vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\MySQL\\UtilisationBDE\\fichiers\\maBdd\\maBdd1.mdb"; vMSAccess.OleFunction("OpenCurrentDatabase", vFileName, false); // ici la base est chargee dans Access // AccessApplication1.DoCmd.RunMacro('Macro1.MaMacro',emptyparam,emptyparam); vMSAccess.OlePropertyGet("DoCmd").OlePropertySet("RunMacro", "essai"); // les parametres NULL sont optionnels // fermeture d'Access vMSAccess.OleProcedure("CloseCurrentDatabase"); // on ferme la base vMSAccess.OleFunction("Quit"); // on quitte Access // liberation memoire vMSAccess = Unassigned; }
J'ai reussi avec Access 2003 a ouvrir Access charger une base executer une macro integree a la base fermer la base quitter Access.
le code:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 // je ne suis pas sur mais au cas ou ne pas oublier #include <utilcls.h> void __fastcall TForm1::Button1Click(TObject *Sender) { Variant vMSAccess; vMSAccess = Variant::CreateObject("Access.Application"); vMSAccess.OlePropertySet("Visible", true); Variant vFileName; // ouverture d'une table Access vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\MySQL\\UtilisationBDE\\fichiers\\maBdd\\maBdd1.mdb"; vMSAccess.OleFunction("OpenCurrentDatabase", vFileName, false); // executer la macro vMSAccess.OleProcedure("Run", "essai"); // fermeture d'Access vMSAccess.OleProcedure("CloseCurrentDatabase"); // on ferme la base vMSAccess.OleFunction("Quit"); // on quitte Access // liberation memoire vMSAccess = Unassigned; }
Merci pour vos efforts.
1- J'ai créé une nouvelle base de données, sauvée dans c:\\mabd.mdb
2- Créé une macro "Macro1" comme action j'ai fait: BoitMsg ,
elle affiche juste une boite de dialogue // comme ShowMessage.
J'ai executer les deux solutions que tu as proposé :
Pour la première solution, il me génère une exception : Membre introuvale ??
pour la deuxième solution, il me génère une exception : EOleSysError ???
Je ne comprend pas tout cela :furieux:.
Merci encore une fois "Blondelle" ;)
A tu essaye ta macro directement dans Access.
Sur quelle ligne se situe l'erreur.
Je joind la base avec la macro qui affiche une boite de dialogue
OK j'ai trouver mon erreur.
voici le code final :
Ce code sert pour executer une procédure stockée dans Access, implémentée dans un module.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
35
36
37
38
39
40
41 // // DECLARATION // Variant vMSAccess, // Application ACCESS vFileName; // Nom de la base de données // // LANCEMENT DE MS ACCESS : en arrière plan // vMSAccess = Variant::CreateObject("Access.Application"); vMSAccess.OlePropertySet("Visible", false); // // OUVERTURE DE LA BASE DE DONNES // vFileName = "C:\\maBdd1.mdb"; vMSAccess.OleFunction("OpenCurrentDatabase", vFileName, false); // // EXECUTION DE LA PROCEDURE :: ESSAI // vMSAccess.OleProcedure("Run", "essai"); // // FERMETURE DE LA BASE DE DONNEES // vMSAccess.OleProcedure("CloseCurrentDatabase"); // // FERMETURE DE MS ACCESS // vMSAccess.OleFunction("Quit"); // // LIBERATION DE LA MEMOIRE // vMSAccess = Unassigned;
MERCI "BLONDELLE" :)
Supposons que l'on veux executer une macro, comment-faire.
j'ai fais ceci :
Mais sans succé !!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 // // LANCEMENT DE MS ACCESS : en arrière plan // vMSAccess = Variant::CreateObject("Access.Application"); vMSAccess.OlePropertySet("Visible", false); // // OUVERTURE DE LA BASE DE DONNES // vFileName = "C:\\maBdd1.mdb"; vMSAccess.OleFunction("OpenCurrentDatabase", vFileName, false); // // EXECUTION DE LA MACRO:: Macro1 // vMSAccess.OleProcedure("RunMacro", "Macro1"); // // FERMETURE DE LA BASE DE DONNEES // vMSAccess.OleProcedure("CloseCurrentDatabase"); // // FERMETURE DE MS ACCESS // vMSAccess.OleFunction("Quit"); // // LIBERATION DE LA MEMOIRE // vMSAccess = Unassigned ;
Salut kmaniche:
Je suis tres content pour toi que cela marche.
Pour pouvoir te repondre je suis alle faire un tour sur la FAQ Access, il y a des commandes qui ne fonctionnent que pour Access 97, "RunMacro" refuse de fonctionner en Access 2003? quand a appeler Macro1 dans Access, a voir comment c'est concu Macro1 semble correspondre a Module1 (en Excel), et un Module peut contenir plusieurs procedures, d'ailleurs la fonction RunMacro demande la Macro puis la procedure puis deux parametres Null (facultatifs).Citation:
vMSAccess.OleProcedure("RunMacro", "Macro1");
Pour ecrire la Procedure VBAccess j'ai galere, je ne connais pas Access, et je n'ai aucun document sur son fonctionnement, l'essentiel est d'avoir trouve une solution de depannage.
Merci encore une fois,
Alors je fais :resolu:
Ce qui est dommage c'est qu'il faut access sur le poste, contrairement à OLEDB pour l'accès aux requêtes et tables.
Merci pour vos recherches.
Je pense que certaines solutions pourraient aller en FAQ
Ben oui, et tout ça grace à BLONDELLECitation:
Envoyé par Fbartolo
C'est propose a la FAQ comme il n'existe rien pour gerer Access avec BCB c'est un debut.Citation:
Fbartolo a écrit :
Ce qui est dommage c'est qu'il faut access sur le poste, contrairement à OLEDB pour l'accès aux requêtes et tables.
Merci pour vos recherches.
Je pense que certaines solutions pourraient aller en FAQ
Bonsoir,
Histoire de mise au point,
Comment dois-je faire si ma base de donnée été protégée par mot de passe.:oops:
Merci "Blondelle"
kmaniche a ecrit:
Sans garantie car je ne connais pas Access et je n'ai pas de DOC dans la FAQ access j'ai trouve ca.Citation:
Bonsoir,
Histoire de mise au point,
Comment dois-je faire si ma base de donnée été protégée par mot de passe.
Je pense donc que le code devrait ressembler a ca.Citation:
Il est possible d'intégrer le mot de passe au code lors de l'ouverture de la base de données :
Dim db as Dao.DataBase
Set db = DBEngine.OpenDatabase("C:\MaBase.mdb", False, False, ";pwd=password")
'Effectuer le traitement sur la base de données ici.
db.Close
Code:
1
2
3
4 Variant password; password = "MotDePasse"; vMSAccess.OleFunction("OpenDatabase", vFileName, false, false, password);
J'ai trouve dans l'aide une autre facon qui correspond a la facon qui avait servi au debut pour lancer ton appli.
Code:
1
2 vMSAccess.OleFunction("OpenCurrentDatabase", vFileName, false, password);
Peut tu me dire si les fonction d'ouverture de fichier proteges fonctionnent.