Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Lancement d'access depuis excel

  • Initiateur de la discussion Adrien
  • Date de début
A

Adrien

Guest
Bonjour, je ne suis que novice voire meme ignorant en VB, mais on me demande d'effectuer la tâche suivante, et j'aimerai savoir si quelqu'un peut m'aider :
Je dois, à partir d'excel, éxécuter une macro contenue dans ma base de données access, et copier dans une boite de dialogue la valeur de la colonne B (par exemple) de la ligne d'excel activée lorsque j'appelle la macro, puis valider, pour voir ainsi mon résultat s'afficher. J'ai déja trouvé diverses réponses partielles sur d'autres sites (voir fichier joint), mais qui ne fonctionnent pas, pour cause de "problème de compilation"....
Si jamais vous pouviez m'aider, je vous en serai infiniment reconnaissant.
Merci d'avance
Adrien
 

Pièces jointes

  • VB.zip
    318 bytes · Affichages: 28
  • VB.zip
    318 bytes · Affichages: 27
  • VB.zip
    318 bytes · Affichages: 27
K

K@d

Guest
Salut !

Le plus facile est encore de faire un bouton qui lance la macro ci-dessous. C'est un appel à Access avec comme argument la valeur de ta colonne B (attention à utiliser la bonne déclaration, string, integer... en fonction de son type).

Macro EXCEL :


Sub Macro_Access()

'********************
'FONCTION : lance la macro Access 'Macro_Access'
'ARGUMENT(S) : la valeur à envoyer à Access
'RESULTAT: éxécute la macro Access et renvoie un résultat si c'est une 'function' et non une sub
'********************
'============
' VARIABLES
'============

Dim AppAccess As Object ''' l'application Access proprement dite
Dim StrBaseAcc As String ''' la base Access
Dim StrMacro As String ''' la macro Access à éxécuter

Dim ValeurAEnvoyer as string '''la valeur que l'on envoie (j'ai pris une string)

On Error GoTo ErrorInSub

'***********************

'Définition des variables
StrBaseAcc = Range("MaBase_Access").Value '''la base Access
StrMacro = Range("MaMacro_Access").Value '''le nom de la macro

ValeurAEnvoyer=range("B2").value '''je considère que tu envoies la valeur de la cellule B2

'============
' EXECUTION
'============

' Message barre des tâches Excel
Application.StatusBar = "Execution de la macro Access - Patientez !"
Application.ScreenUpdating = False

' On gère une instance d'Access
Set AppAccess = CreateObject("Access.Application.9")

' On ouvre la base de données
AppAccess.OpenCurrentDatabase StrBaseAcc, False

' Et on éxécute la macro
AppAccess.Run(StrMacro,ValeurAEnvoyer)

'on quitte l'objet Access
AppAccess.Application.Quit
Set AppAccess = Nothing

'mise à zéro barre des tâches
Application.statusbar=false

Exit Sub

'''En cas d'erreur

ErrorInSub:
msgbox "Une erreur a été rencontrée lors du lancement de la macro Access.",vbCritical,"Erreur d'éxécution"
set AppAccess= Nothing
Application.statusbar=false

Exit Sub


Sous ACCESS :

On doit avoir à l'autre bout un macro du style

Function/Sub MaMacroAccess(LaValeurExcel as string) ' string dans mon exemple

CODE
CODE
[...]

End Function / Sub

Note --> si c'est une function qui retourne un résultat, on peut le récupérer sous Excel


Je suis à ta disposition pour toute informations supplémentaire...
Bon courage ! :0)

Clément
 
A

Adrien

Guest
Merci, mais j'ai un petit problème :
J'ai créé les macros access à partir de l'éditeur, donc je ne sais pas du tout ce qu'elles comtiennent au niveau du code, et par conséquent ce que je dois choisir dans les choix que tu m'as proposé pour le type ("attention à utiliser la bonne déclaration, string, integer... en fonction de son type").
J'ai aussi un problème, car quand je copie ce que tu m'as envoyé, il me renvoie "Erreur de syntaxe" au niveau de "AppAccess.Run(StrMacro,ValeurAEnvoyer)"
Merci d'avance
 
K

K@d

Guest
Salut,

toutes mes excuses, une petite erreur de synthaxe :0(

Commence par essayer: AppAccess.Run StrMacro,ValeurAEnvoyer
(sans les parenthèses)

Quelle est la valeur que tu cherches à passer d'Excel vers Access ? Est-ce du texte, une valeur numérique, un boolean (true / false) ?

Peux-tu à la limite me faire un copier/coller de la macro Access dans un fichier texte que tu mettrais en pièce jointe afin que je définisse exactement le type de la variable ? On doit pouvoir à la limite la définir comme Variant (Dim ValeurAEnvoyer) mais Access en veut parfois plus !

Toujours à ta disposition...

Clément

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." (devise Shadock)
 
A

Adrien

Guest
OK, ca fonctionne maintenant, jusqu'au message d'erreur, où il me signale une "erreur de syntaxe".

Voilà la macro access :

Private Sub Commande17_Click()
On Error GoTo Err_Commande17_Click

Dim stDocName As String

stDocName = "ARTICLE"
DoCmd.OpenReport stDocName, acPreview

Exit_Commande17_Click:
Exit Sub

Err_Commande17_Click:
MsgBox Err.Description
Resume Exit_Commande17_Click

End Sub
 
K

K@d

Guest
Hum....

Il y a quelque chose qui m'échappe maintenant ! Je ne vois pas quel est le lien entre Excel et Access. Que cherches-tu exactement à faire, peux-tu me donner un exemple plus précis (du genre j'envoie un produit dans Access et j'ouvre le rapport correspondant) ? J'ai relu le premier post mais d'après la macro ci-dessus, je ne vois pas le truc...

Pour voir d'où provient ton erreur de synthaxe, au choix :
- places une apostrophe devant la ligne On Error GoTo Err_Commande17_Click
(ou toute ligne On error..... de ton code lu) ceci afin que VBA "plante" sur la ligne gênante
- cliques sur Déboguer / Debug à l'affichage du message pour aller à la ligne.

Quelle est la ligne qui bloque ? on va y arriver ! ;0)

@ +

Clément

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." (devise Shadock)
 
A

Adrien

Guest
Le but de la manip :
Je fais des chiffrages de chantier avec un tableur excel.
Tous les devis que j ai recu auparavant sont répertoriés dans ma base de données.
J'ai une macro qui lance un état ou s'affichent tous les prix pour un article donné.
Je voudrai pouvoir, depuis excel, visionner ces prix, via la macro.
Si tu vois comment opérer ....
Merci
 
K

K@d

Guest
Ah !

Pour résumer, tu cherches à ouvrir un rapport dans ta base Access (depuis Excel) affichant uniquement un certain type d'article(s) ?

Si c'est cela, on peut compléter le premier code si dessus afin de gérer l'ouverture du rapport directement depuis Excel et non depuis Access dans un premier temps.

De plus, je ne sais pas non plus comment ton rapport Access marche à la base c'est-à-dire s'il lit seulement une table ou s'il lit les résultats d'une requête...
Dans le premier cas (table), il montre toujours la même chose ;
Dans le second, on peut filtrer les "produits" qui t'intéressent depuis le code sur une valeur particulière plus facilement...

Clément
 
A

Adrien

Guest
Bon, je crois qu'on s'approche de la solution...
Je voudrais ouvrir un état qui repose sur une requête d'excel, requête qui elle, doit tenir compte d'une valeur contenue dans la colonne B le la nième ligne du tableau excel. En attendant, la requete repose sur une valeur que je dois taper, et c'est tres fastidieu de copier dans excel, ouvrir access, aller ur le bon formulaire, coller dans le champ, puis cliker sur un bouton pour lancer la requete.
si je pouvais la lancer direct depuis excel, ce serai tplus simple ...
Merci encore pour ton aide !
 
K

K@d

Guest
Re-re-re, :0)

Effectivement, plus je cerne le problème, plus on approche de la solution !
On va finir en travaillant en deux temps : 1, compléter la macro Excel, 2, créer une nouvelle macro Access ;
Bon, j'ai triché, je t'ai mis le code juste ci-dessous...

1 - EXCEL :

'au préalable, tu dois récupérer la valeur de ton critère avec les paramètres ci-dessous
Dim ValeurAEnvoyer as string

ValeurAEnvoyer= 'à toi de le récupérer dans Excel !
Exemple : ValeurAEnvoyer=range("B4").value

'on ajoute deux lignes dans le code après la première ci-dessous
AppAccess.Run "Appel_Excel", ValeurAEnvoyer
AppAccess.Application.Visible = True
AppAccess.DoCmd.OpenReport "NomDeTonRapport", acViewPreview

'et on supprime celles-ci qui ferment Access ci-dessous ! (surtout pas set appacess=nothing)
'on quitte l'objet Access
AppAccess.Application.Quit


2 - ACCESS :

Dans l'onglet 'Modules', faire 'New' / 'Nouveau' puis insérer le code ci-dessous :

Sub Appel_Excel(StrProduit as string)

Dim Db As DAO.Database ''' base de données Access
Dim StrSQL As String ''' le code SQL de la requête (filtré)
Dim qdfAction As QueryDef ''' la requête

DoCmd.SetWarnings False ''' on désactive le mode alerte

Set Db = CurrentDb()
Set qdfAction = Db.QueryDefs("NomDeTaRequete")

'on modifie la requête avec la valeur envoyée depuis Excel
StrSQL = "SELECT [NomdetaTable].* FROM [NomdetaTable] WHERE [NomdetaTable].NomDuChampFiltré=" & StrProduit

********* EXEMPLE ********

StrSQL = "SELECT [tbl_Produits].* FROM [tbl_Produits] WHERE [tbl_Produits].Materiaux=" & StrProduit

(sachant que l'on envoie StrProduit="béton" depuis Excel par exemple)

********************* FIN EXEMPLE

'on affecte la condition SQL construite
qdfAction.SQL = StrSQL

DoCmd.SetWarnings True ''' on réactive le mode alerte
Db.Close ''' on ferme

End Sub

--> !!! bien enregistrer le tout


On devrait pouvoir obtenir un résultat pas trop mal, c'est-à-dire qu'à l'éxécution dans Excel, tu n'as rien à faire et il t'ouvre le rapport Access souhaité. Si ce n'est pas le cas, j'ai encore un petit complément de code.

Bonne continuation !

Clément

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." (devise Shadock)
 
K

K@d

Guest
Oups, correction :

il est possible qu'il faille ajouter (mais j'en suis moins sûr) dans le code de la macro Access :

StrSQL = "SELECT [NomdetaTable].* FROM [NomdetaTable] WHERE [NomdetaTable].NomDuChampFiltré=" & chr(34) & StrProduit & chr(34)

chr(34) --> pour les guillemets
On peut également rajouter des étoiles pour élargir les résultats

Attention ! Il faut noter que cela oblige dans Excel à employer exactement le même critère (à l'accent près) que dans Access.

Clément

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." (devise Shadock)
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…