IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Exécuter une macro Excel depuis du code VBA [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut Exécuter une macro Excel depuis du code VBA
    Bonjour,

    Dans une procédure VBA, je voudrais déclencher l'exécution d'une macro Excel.

    Le début de ma macro Excel est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Masquer_Ligne_nulle()
    ' Sur la feuille "Projet" sélectionnée,
    ' on doit masquer les lignes dont les totaux sont à 0
     
    ' permet de ne pas mettre à jour l'écran au fur et à mesure ce qui gagne du temps
     
      Application.ScreenUpdating = False
     
      Sheets("Projet").Select
     
     ' affichage de toutes les lignes au départ de la feuille "Export devis"
     '----------------------------------------------------------------------
      Rows("11:106").Select
      Selection.EntireRow.Hidden = False
    Je lance cette macro depuis ma procédure VBA comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        objsheet.Run "Masquer_Ligne_nulle"
    Mais au résultat, cela ne fonctionne pas. J'ai une page Excel "noire" et impossible d'activer les boutons Excel.

    Avez vous une idée d'où est mon erreur ?

  2. #2
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Plus que ton code Excel, c'est savoir où se trouve ta macro dans Excel et le code Access que tu utilises pour récupérer l' "objsheet".
    Dans Excel si ta macro dans un worksheet module ou un workbook module, il n'est pas accessible par Access car ces modules ont un accès privé.
    Si c'est le cas déplace ta macro dans un module normal non marqué avec "Option private module" et marque ta fonction en "Public".

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut
    J'ai suivi tes conseils et l'ai déclaré Public dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function Masquer_Ligne_nulle()
    ' Sur la feuille "Projet" sélectionnée,
    ' on doit masquer les lignes dont les totaux sont à 0
     
    ' permet de ne pas mettre à jour l'écran au fur et à mesure ce qui gagne du temps
     
      Application.ScreenUpdating = False
     
      Sheets("Projet").Select
     
     ' affichage de toutes les lignes au départ de la feuille "Export devis"
     '----------------------------------------------------------------------
      Rows("11:106").Select
      Selection.EntireRow.Hidden = False
    puis modifié mon code VB comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objApp.Run "Masquer_Ligne_nulle"
    Mais le résultat est le même

  4. #4
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Si tu commençais par une macro toute simple sans screeupdating=false, genre MsgBox "Test" ?
    Et puis ce qui est important c'est aussi de nous montrer ton code Access (plus que juste le run)

  5. #5
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut
    Faire plus simple, je veux bien mais
    1. j'ai un code Access qui fonctionne bien et qui génére une feuille Excel conforme aux attentes
    2. j'ai une macro dans ma feuille Excel, activée par un bouton et qui fournit le résultat attendu

    Je cherche donc à simplifier le rôle de l'utilisation en lui évitant la 1ère activation d'un bouton.

    Mon code VB continue a bien fonctionner après appel de la macro Excel, mais c'est le résultat Excel qui n'est plus bon.

    Que veux tu voir dans le code VB, pas que je ne veux pas le montrer mais il fait quelques dizaines de lignes ?

  6. #6
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Quand je dis faire plus simple, c'est uniquement dans un 1er temps pour ne pas multiplier les raisons d'erreurs. Si tu écris une autre macro VB qui fait juste un MsgBox, tu peux débogger la connexion Access-Excel. Quand ça fonctionne tu te reconnectes sur la bonne macro.
    Ce qui serait intéressant dans ton code Access c'est de voir comment tu construis ton objet objsheet, par exemple et tout ce que tu fais avec et qui sera susceptible d'impacter le Run(), qui en soit fonctionne nickel.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut
    J'ai refait des tests et en voilà le résultat

    Test 1

    Macro Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function Test()
    '
    MsgBox "Test lien Access - Excel"
    '
    End Function
    Code VB Access
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Test_Click()
    Set dbBdeD = CurrentDb
     
      Set objApp = CreateObject("excel.application")
      FichierExcel = "F:\xxxxxxxx\Outil Devis\Test.xls"
     
      Set objbook = objApp.Workbooks.Open(FichierExcel, ReadOnly:=True)
     
      Set objsheet = objbook.Worksheets("Exploitation")
      objApp.Visible = True   'si on veut visualiser
     
      objApp.Run "Test"
     
     
    End Sub
    ça marche

    Test 2
    Macro Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Public Function Masquer_Ligne_nulle_Exploit()
    ' Sur la feuille "Exploitation" sélectionnée,
    ' on doit masquer les lignes dont les totaux sont à 0
     
      Application.ScreenUpdating = False
     
      Sheets("Exploitation").Select
     
     ' affichage de toutes les lignes au départ de la feuille 
     '----------------------------------------------------------------------
      Rows("11:90").Select
      Selection.EntireRow.Hidden = False
     
      For lig = 11 To 90
          cel1 = Range("T" & lig).Value
          If cel1 = 0 Then
             Range("T" & lig).Select
             Selection.EntireRow.Hidden = True
          End If
      Next lig
     
    End Function
    Code VB Access
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Test_Click()
    Set dbBdeD = CurrentDb
     
      Set objApp = CreateObject("excel.application")
      FichierExcel = "F:\xxxxxxxx\Outil Devis\Test.xls"
     
      Set objbook = objApp.Workbooks.Open(FichierExcel, ReadOnly:=True)
     
      Set objsheet = objbook.Worksheets("Exploitation")
      objApp.Visible = True   'si on veut visualiser
     
      objApp.Run "Masquer_Ligne_nulle_Exploit"
     
     
    End Sub
    Ca marche pas. Pourtant, quand j'active la macro Excel directement dans Excel, ça marche.

  8. #8
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut
    Complément au Test 2

    J'ai supprimé dans la macro Excel la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    et, du coup, ça marche mais ce n'est pas joli du tout car on voit tout les mises à jour faites sur la feuille Excel ...

  9. #9
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Je ne vois pas de Application.ScreenUpating=true à la fin de macro ?
    C'est normal ?

    Autre possibilité, en Acces, ne fait pas le objApp.visible=true avant le Run mais après, comme ça tu ne verras pas toout le boulot d'Excel.

  10. #10
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut
    ça fonctionne bien maintenant dans le sens Access vers Excel, ma macro Excel est activée par Access et résultat attendu est là.

    Par contre, lorsque j'active ma macro Excel dans Excel, le fait d'avoir supprimé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    rend visible le traitement réalisé par la macro.
    Existe t-il une commande de substitution ?

  11. #11
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Pas que je sache.
    T'as essayé de le faire depuis Access:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    objapp.screenupdating=false
    objapp.run ....
    objapp.screenupdating=true

  12. #12
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut
    Depuis Access, ça marche, plus aucun problème.

    Le problème est maintenant dans Excel depuis que j'ai supprimé la fonction ScreenUpdating = False

    Il faudrait peut-être que je coupe ma macro en 2 dans Excel
    une avec ScreenUpdating = False qui lance la deuxième réalisant les actions.

  13. #13
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 55
    Points
    55
    Par défaut
    Voilà, ça marche partout

    Solution pour Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub XLS_Masquer_Ligne_nulle()
    '
    ' Macro enregistrée le 03/12/2009 par Denis Wolff (X076938)
    '
        Application.ScreenUpdating = False
    '
        Call Masquer_Ligne_nulle
    '
        Application.ScreenUpdating = True
     
    End Sub
    Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 24/09/2019, 10h50
  2. [Automation] Exécution d'une macro Excel depuis MATLAB
    Par snake-dam dans le forum MATLAB
    Réponses: 1
    Dernier message: 24/12/2014, 09h33
  3. [AC-2003] Exécuter une macro Excel depuis Access
    Par tarnx dans le forum VBA Access
    Réponses: 2
    Dernier message: 17/12/2009, 13h16
  4. Lancer une macro Excel depuis Access
    Par pascal913 dans le forum Access
    Réponses: 12
    Dernier message: 31/07/2006, 15h31
  5. Lancer une macro Excel depuis Access
    Par marcobosio dans le forum Access
    Réponses: 6
    Dernier message: 05/06/2006, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo