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 :

Code dynamique workbook_windowactivate [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Code dynamique workbook_windowactivate
    Bonjour,

    J'ai créé des macros qui ouvrent 2 types de documents Excel, traitent leur contenu et crée un formulaire/type pour permettre à l'utilisateur de générer des graphiques en choisissant leurs paramètres.

    Le problème est que si le user ouvre le premier document et roule la macro, le formulaire correspondant s'ouvre, ce qui est OK, mais si le user ouvre l'autre document, qui lui utilise une autre macro et un autre formulaire, le formulaire du premier demeure ouvert dans l'autre document. J'ai cherché à utiliser le worksheet.activate pour cacher le formulaire non correspondant, mais il ne se déclenche que lorsque je change de sheet, non pas de workbook. Si je mets le code dans workbook_windowactivate, je peux voir l'évènement, mais je dois l'y entrer manuellement.

    Ma question est; est-il possible de mettre du code dynamiquement dans l'évènement d'un workbook, comme on le fait avec les worksheet?

    Merci!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Je crois avoir compris que ton code se trouve dans un autre classeur que ceux que tu ouvres. Tu n'as pas besoin d'injecter du code dynamiquement dans ces classeurs.

    Le principe est de capturer les évènement d'application, en instanciant un objet de type application, public ou privé, dans le module ThisWorkbook du classeur pilote. Tu déclareras l'objet avec WithEvents pour pouvoir gérer ses procédures évènementielles. Dans celles-ci, tu trouveras les évènements propres à un workbook.open, workbook.activate, etc, qui sont déclenchés à l'ouverture, l'activation, ..., d'un classeur.

    Au sein du code évènementielle, tu testes quel classeur est activé (via son nom ou son codename (par défaut ThisWorkbook, mais que tu peux modifier) pour déterminer ce qui doit se passer à l'activation/désactivation d'un classeur.

    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    Bonjour et merci de m'aider.
    Je crois que vous avez bien saisi mon problème, mais j'ai essayé votre truc, que je trouve très sensé, mais ça ne fonctionne pas.

    Voici ce que je fais exactement. L'utilisateur ouvre un fichier txt dans Excel, et part la macro TraitePremier(qui se trouve dans le classeur Perso.xls), qui enregistre le document courant sous le format xls(premier.xls) et traite ses données pour afficher un formulaire adapté aux données contenues.

    Le but est d'ensuite ouvrir un autre document(deuxieme.xls), et de faire la même chose avec une autre macro(TraiteDeuxieme) située elle aussi dans Perso.xls, mais lorsque je bascule d'un classeur à l'autre, je voudrais cacher le formulaire du premier si c'est le deuxième classeur qui est actif.

    Votre logique est bonne, j'ai mis l'instanciation de l'objet Excel.Application avec évènements dans mon classeur Perso.xls, avec un msgbox sur le WindowActivate, mais ça ne fonctionne pas. J'ai dû mal comprendre quelque chose...
    Merci de votre aide!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Erreur d'exécution '75': Erreur d'accès Chemin/Fichier
    Il me semble que ça fait 2 jours que je cherche des choses sans résultat...
    Un autre problème s'est ajouté.

    J'ai un bouton "Reset" sur chacune des worksheet, dont le code est généré dynamiquement, qui appelle une fonction dans la macro "TraitePremiere" qui se trouve dans le classeur "Perso.xls" et qui supprime le userform(nommé "NomFormulaire1") qui se trouve dans le premier classeur(le même que le bouton).

    Voici le code;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ActiveWorkbook.VBProject.VBComponents.Item("NomFormulaire1").Hide
    ActiveWorkbook.VBProject.VBComponents.Remove ActiveWorkbook.VBProject.VBComponents.Item("NomFormulaire1") 
    ActiveWorkbook.VBProject.VBComponents.Unload ActiveWorkbook.VBProject.VBComponents.Item("NomFormulaire1")
    J'ai bien lu qu'il ne fallait pas que le userform soit en cours d'affichage pour qu'il puisse être supprimé, et mon code fonctionne bien, mais si je le recrée et donne à ce nouveau userform le même nom, soit "NomFormulaire1", il me fait l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur d'exécution '75': Erreur d'accès Chemin/Fichier
    comme s'il existait encore(c'est pourquoi j'ai essayé le unload). On dirait qu,il le garde en mémoire... pourtant, dans l'éditeur VB, il n'y est plus! Et si je parcours les vbcomponents de type 3 par code, il n'y est plus! J'ai même essayé en supprimant so code avant, rien n'y fait! Avez-vous une idée
    à ce sujet?

    Merci!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Finalement...
    J'ai réussi à écrire du code dynamiquement dans "ThisWorkbook", et ça fonctionne. Pour ceux que ça pourrait intéresser;

    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim lsCode As String
    Dim I, J As Integer
    If Workbooks.Count > 1 Then
        For I = 1 To Workbooks.Count
                For J = 1 To Workbooks(I).VBProject.vbcomponents.Count
                    If LCase(Workbooks(I).VBProject.vbcomponents(J).Name) = "thisworkbook" Then
                        lsCode = "Private Sub Workbook_Activate()" & vbCrLf
                        lsCode = lsCode & "msgbox activeworkbook.name" & vbCrLf
                        lsCode = lsCode & "End sub" & vbCrLf
                        Workbooks(I).VBProject.vbcomponents(J).CodeModule.DeleteLines 1, Workbooks(I).VBProject.vbcomponents(J).CodeModule.CountOfLines
                        Workbooks(I).VBProject.vbcomponents(J).CodeModule.InsertLines 1, lsCode
                    End If
     
                Next
        Next
    End If
    End Sub
    Merci de votre aide!

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Ton code se résume à ceci, j'ai quand même des réticences à l'évènement choisi pour lancer le code (à chaque sélection d'une cellule)
    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 lsCode As String
    Dim i As Integer
     
    If Workbooks.Count > 1 Then
        lsCode = "Option Explicit" & vbCrLf & vbCrLf
        lsCode = lsCode & "Private Sub Workbook_Activate()" & vbCrLf
        lsCode = lsCode & vbTab & "msgbox activeworkbook.name" & vbCrLf
        lsCode = lsCode & "End sub" & vbCrLf
     
        For i = 1 To Workbooks.Count
            With Workbooks(i).VBProject.vbcomponents("ThisWorkbook").CodeModule
                .DeleteLines 1, .CountOfLines
                .InsertLines 1, lsCode
            End With
        Next i
    End If

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    Oui, désolée, je ne l'avais pas simplifier, j'ai laissé mes traces! J'y suis arrivée par essai/erreur, et j'avais autres choses à vérifier, alors c'est pourquoi il y avait d'autres vérifs.

    Au moins, j'arrvie à quelque chose en mettant mon code pour cacher le formulaire dans l'évènement window_deactivate...

    Bonne journée!

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

Discussions similaires

  1. Morceaux de code dynamique
    Par Celeborn dans le forum C++
    Réponses: 3
    Dernier message: 11/06/2009, 20h50
  2. Générer du code dynamiquement
    Par seb-oulba dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 23h26
  3. [VB6] générer du code dynamiquement
    Par nils.angot dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 08h40
  4. Introspection et création de code dynamiquement ?
    Par elitost dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 17/10/2005, 22h43
  5. Interprétation de code dynamiquement
    Par Smeuuh dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 29/09/2005, 09h32

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