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

Macros et VBA Excel Discussion :

Insérer du code dans un classeur et l'exécuter


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Points : 74
    Points
    74
    Par défaut Insérer du code dans un classeur et l'exécuter
    Bonsoir,
    Voilà mon problème.
    J'utilise un programme A (écrit depuis MS Visual Studio) qui traite un fichier Excel pour le mettre en page. A un moment donné, l'utilisateur doit modifier le fichier Excel manuellement. Quand ça se produit le programme A écrit du code VBA dans le fichier Excel et s'arrête: c'est le programme B. Je voudrais qu'en plus le programme A lance l'exécution du programme B qui doit piéger l'évènement "Enregistrement du classeur" et relancer le programme A.
    J'ai compris comment on écrivait du code dans un classeur (merci à ceux qui ont écrit la FAQ et aux gens du forum aussi) en revanche comment dois-je m'y prendre pour l'exécuter? Dois-je écrire le code de telle manière qu'il s'exécute à l'ouverture du fichier Excel et fermer le fichier Excel pour le réouvrir et donc déclencher l'exécution du code? Merci et à+.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 147
    Points
    20 147
    Par défaut
    bonjour

    est ce que tu dois obligatoirement créer une procedure evenementielle?


    l'exemple joint concerne Word, mais ça doit fonctionner sur le meme principe dans Excel:

    http://www.developpez.net/forums/sho...5&postcount=12


    un autre exemple pour declencher une procedure evenementielle ThisWorkbook

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Run "ClasseurTest.xls!ThisWorkbook.Workbook_Open"

    bonne journée
    michel

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Points : 74
    Points
    74
    Par défaut
    Bonjour.
    Bon alors j'arrive à écrire la macro (faut dire qu'avec le source c'était pas trop dur, merci SilkyRoad), par contre je n'arrive pas à la lancer, mais c'est peut être car c'est un procédure évènementielle non? Je continue de chercher. Ca c'est le code écrit par mon programme dans le module créé dans le classeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
      SaveAsUi = False
      Cancel = False
    End Sub
    Ca c'est le code de mon programme principal:
    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
     
    Dim VBComp As Object
    Dim xl As Integer
    Set VBComp = wbExcel.VBProject.VBComponents.Add(1)
    With wbExcel.VBProject.VBComponents(VBComp.Name).CodeModule
        xl = .CountOfLines
        .InsertLines xl + 1, "Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)"
        .InsertLines xl + 2, "  SaveAsUi = False"
        .InsertLines xl + 3, "  Cancel = False"
        .InsertLines xl + 4, "End Sub"
        DoEvents
        appExcel.Run "Workbook_BeforeSave()"
        .DeleteLines 1, .CountOfLines
    End With
    wbExcel.VBProject.VBComponents.Remove VBComp
    A+

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Points : 74
    Points
    74
    Par défaut
    Bon ben c'est bon en fait y'a pas besoin de l'exécuter la macro, faut enlever la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    appExcel.Run "Workbook_BeforeSave()"
    Là ça fonctionne, quand on clique sur enregistrer, il se passe bien quelque chose, j'ai essayé avec une msgbox et elle apparaît.
    Merci encore et A+.

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    essai d'enlever le Private... .?

    sinon est tu sur de vouloir garder la derniére ligne de ton code principal qui est la pour effacer la macro..

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Points : 74
    Points
    74
    Par défaut
    je me suis emballé un peu vite tout à l'heure quand je disais que ça marchait. Ca marche à condition d'écrire dans ThisWorkbook:
    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
     
    Dim VBComp As Object
    Dim xl As Integer
    'Set VBComp = wbExcel.VBProject.VBComponents.Add(1)
    With wbExcel.VBProject.VBComponents("ThisWorkbook").CodeModule
         xl = .CountOfLines
         .InsertLines xl + 1, "Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)"
         .InsertLines xl + 2, "  SaveAsUi = False"
         .InsertLines xl + 3, "  Cancel = False"
         .InsertLines xl + 4, "   msgbox" & Chr(34) & "hello" & Chr(34)
         .InsertLines xl + 5, "End Sub"
         DoEvents
         'appExcel.Run "Workbook_BeforeSave()"
         '.DeleteLines 1, .CountOfLines
    End With
    'wbExcel.VBProject.VBComponents.Remove VBComp
    Pour la dernière ligne qui efface la macro je pense que je ne vais pas la garder car comme le précise ce document, comme mon programme et Excel ne sont pas des applications synchrones, en laissant cette ligne je risque de détruire la macro que je viens d'écrire dans le classeur avant même qu'elle n'est servi.
    Merci pour cette remarque bbil.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 147
    Points
    20 147
    Par défaut
    bonjour

    tu n'as pas répondu à ma premiere question

    est ce que tu dois obligatoirement créer une procedure evenementielle
    il y a peut etre une autre façon de faire mais il faudrait que tu réexpliques en détail le traitement appliqué dans ton classeur


    michel

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Points : 74
    Points
    74
    Par défaut
    En fait je ne sais pas si je dois obligatoirement écrire une procédure évènementielle.
    Le programme A fait de la mise en page pour le classeur Excel. Il mesure entre autres l'encombrement des cellules et calcule les marges à appliquer aux feuilles. Seulement ce traitement peut échouer par exemple lorsque qu'il y a trop de colonnes dans la page: le calcul donne une valeur de marge négative. Si cela se produit, le programme A incite l'utilisateur à éditer le classeur Excel à la main afin qu'il y supprime des colonnes. Si l'utilisateur fait ce choix, alors le programme VBA écrit la procédure (programme B) dont on a parlé plus haut dans "ThisWorkBook" et se termine. Dès que l'utilisateur enregistre son travail, cela doit déclencher l'exécution du programme A afin qu'il poursuive le traitement.
    Je me suis dit qu'il y avait dans cette solution une manière assez simple de faire interagir les deux programmes car le programme A ne doit pas continuer tant qu'il ne peut pas calculer une valeur de marge correcte. Et détecter l'évènement enregistrement permet de s'éviter l'ajout d'un bouton sur une feuille.
    A+.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 147
    Points
    20 147
    Par défaut
    effectivement c'est une solution

    par contre tu devras gérer l'eventualité que l'utilisateur :

    1. ne modifie par les marges manuellement avant l'enregistrement
    2. décide de ne pas cliquer sur le bouton d'enregistrement: dans ce cas utilise plutot l'evenement BeforeClose


    michel

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Points : 74
    Points
    74
    Par défaut
    Bonsoir SilkyRoad.
    En fait l'utilisateur peut bien modifier les marges de toute façon elles seront recalculées...
    En revanche le before close c'est un autre problème.
    En tout cas merci pour ces précisions. A+

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

Discussions similaires

  1. [PHP 5.3] Insérer du code dans une balise SPAN via un include
    Par beegees dans le forum Langage
    Réponses: 0
    Dernier message: 05/10/2010, 10h25
  2. [XL-2007] Créer du code dans le classeur A à partir d'un autre classeur B
    Par geo909 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/05/2009, 17h36
  3. [XL-2007] Insérer des lignes dans un classeur
    Par toinou62 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/05/2009, 19h22
  4. [VBA-E] Insérer du code dans un module
    Par cafeine dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/05/2007, 10h34
  5. [phpBB] Insérer un code dans phpBB
    Par gobs dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 09/11/2006, 20h12

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