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 :

Comment avoir une macro commune à mes classeurs?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut Comment avoir une macro commune à mes classeurs?
    Bonjour,

    Je suis débutant en VBA.
    J'ai un grand nombre de fichiers excel où j'ai une macro qui est dupliqué afin de pouvoir faire une certaine action lorsque le classeur est modifié (Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)...
    End Sub).
    Mon problème est que lorsque je veux rajouter une fonctionnalité, je dois modifier l'ensemble des classeur.
    Par conséquent, j'aimerais pouvoir faire une macro pour ces fichiers qui appellent l'ensemble des fonctions contenus dans un fichier (.bas?) afin de ne faire les modifications que sur ce fichier et qu'elles soient répercutées sur l'ensemble de mes classeurs.

    Comment puis automatiser la lecture de la macro à l'ouverture d'un de mes classeur?

    Merci par avance.

    PS: Pour l'instant je n'ai réussi qu'à lire la macro d'un autre fichier .xls mais ce dernier doit être ouvert pour que cela fonctionne.

  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

    Stocke ta macro dans le classeur perso.xls. Ce classeur se trouve dans le dossier XLSTART de l'utilisateur.

    AstucePour le créer simplement, crée une macro (n'importe laquelle) avec l'enregistreur de macros et spécifie dans Enregistrer la macro dans que tu veux utiliser le classeur de macros personnelles.

    Lorsque cela sera fait, ton classeur perso.xls sera disponible dans les projets VBA. Il sera automatiquement ouvert "invisible" à chaque session d'Excel.
    "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
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as une solution : Placer ta macro dans un fichier que tu places dans "C:\Program Files\Microsoft Office\Office\XLOuvrir\" ou "C:\Program Files\Microsoft Office\Office10\XLStart" selon la version d'office que tu utilises et tu en masques les feuilles.
    Par contre, la macro ne s'éxécutera pas à l'ouverture des "autres fichiers".Je te suggère donc de placer un bouton spécifique pour la lancer dans une barre d'outils existante ou à créer. Dès lors, ce bouton, et donc la macro sera accessible quelque soit le fichier ouvert.
    Si en outre tu nommes ce fichier "Perso.xls", tout le monde saura de quoi tu parles et on pourra t'aider

    Edit
    Grillé par Pierre

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    J'ai stocké mon fichier perso.xls dans "C:\Program Files\Microsoft Office\Office10\XLStart"
    J'ai enregistrer la macro dans classeur de macros personnelles.
    J'ai essayé avec une macro test et ça marche bien mais lorsque j'enregistre une macro avec à l'intérieur:
    Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) ... end sub

    et que je modifie mon document alors là il ne prend pas en compte le changement dans la feuille et n'exécute pas le code de la macro automatiquement.

    De plus le classeur n'est pas automatiquement ouvert "invisible" à chaque session d'Excel mais il est bien "visible".

    N'est-il pas possible de faire une macro chargeant directement un fichier contenant le code vba afin que je puisse utiliser la fonction détectant un changement sur la feuille à l'ouverture de mes classeurs?

  5. #5
    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
    En créant ton perso.xls comme je te l'ai renseigné, Excel ne le stocke pas dans program files... mais dans Documents and settings... et il est bien invisible à l'ouverture d'Excel.

    Maintenant, il faut peut-être (probablement) adapter ta macro pour qu'elle fasse référence au classeur actif, car si tu utilises, par exemple
    [code]Sub Macro1()
    Debug.Print Worksheets("Feuil1").Parent.Name
    End Sub
    dans perso.xls, il te renverra ...perso.xls, alors que si tu utilises, toujours dans perso.xls, ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Macro1()
    Debug.Print ActiveWorkbook.Worksheets("Feuil1").Parent.Name
    End Sub
    tu auras le nom du classeur actif.

    Ok?
    "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...
    ---------------

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour perso.xls, j'ai précisé
    et tu en masques les feuilles.
    Ainsi il sera transparent.
    Pour l'événement "Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)", tu n'avais pas précisé que tu voulais utiliser celui-ci dans les classeurs ouverts. Sinon nous t'aurions dit que tu devais utiliser une autre méthode. Cet événement concerne le classeur dans lequel se trouve la macro, pas dans un autre.
    A froid je ne vois qu'une manière de procéder mais peut-être y en a-t-il une autre
    Consisterait à placer le code de ta macro dans le classeur en question par macro dans l'objet Thisworkbook de chaque classeur ouvert. (Cette macro pouvant être supprimée après usage...)
    Tu dis mais à ta place j'attendrais de voir si quelqu'un n'aurait pas une autre proposition à te faire

  7. #7
    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
    Salut Ouskel'n'or...

    Il n'y a pas moyen de masquer TOUTES les feuilles d'un classeur. Il en faut toujours au mois une visible...

    En fait, lorsque ce classeur a été créé par Excel et qu'il est dans le bon dossier, il est ouvert en invisible par Excel.

    Jay-hut,
    Si j'étais toi, je créerais un classeur perso.xls comme je te l'ai proposé (outils/Macros/Nouvelle macro... et choisir classeur de macros personnelles et je copierais mon code dedans, pas un simple copier-coller en VBA.

    Puis je m'attelerais à adapter la macro pour que, alors qu'elle est présente dans perso.xls, elle puisse fonctionner sur le classeur actif.

    Il est bien plus simple, pour cela, de travailler avec des objets car tu pourras en manipuler les propriétés bien plus facilement...

    Essaie de faire cela, puis reviens avec ta macro et on t'aidera à l'adapter...

    Bon travail
    "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...
    ---------------

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    Tout d'abord merci pour la rapidité de vos réponses.

    J'ai crée un classeur et choisir classeur de macros personnelles, ça m'a bien crée les macro dans un classeur PERSO.XLS qui est ouvert dès que j'ouvre un document excel.
    Lorsque j'execute une macro test de PERSO.XLS dans mon document excel, ça marche bien... et le classeur perso.xls reste bien invisible .
    Par exemple pour tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Macro1()
        ActiveCell.FormulaR1C1 = "texte de perso.xls"
    End Sub
    Donc quand j'exécute la macro, ça m'écrit bien dans la case active de la macro.

    Maintenant j'aimerais pouvoir utiliser la macro prédéfinie lorsqu'un changement est détecté dans un classeur pour tous mes classeurs:
    (on passe les cellules de la ligne de colonnes 2 à 5 en gris si on écrit GREY sur une cellule de la 1ère colonne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)    
        If (Target.Columns.Count = 1 And Target.Rows.Count = 1) Then
            If (Target.Value = "GREY" And Target.Column = 1) Then
                ActiveSheet.Range(Cells(Target.Row, 2), Cells(Target.Row,5)).Select
                With Selection.Interior
                    .ColorIndex = 15
                    .Pattern = xlSolid
                    .PatternColorIndex = xlAutomatic
                End With
            End If
        End If
        End Sub
    J'ai essayé de mettre la macro dans une nouvelle du classeur PERSO.XLS mais ça ne fonctionne pas.

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut Ouskel'n'or...

    Il n'y a pas moyen de masquer TOUTES les feuilles d'un classeur. Il en faut toujours au mois une visible...
    A ton intention, Pierre, Pièce jointe 21702... Méfie-toi !

  10. #10
    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
    Salut Ouskel'n'or... ( Je ne sais plus très bien moi-même, je navigue à vue, ce matin...)

    Si il n'y a pas d'autre solution, alors, je pense que tant qu'à modifier le code de thisworkbook, autant le modifier pour qu'il ouvre un xla dans lequel on importe tout le code. Cela peut se faire par un classeur externe de mise à jour.

    Avec cela, on n'interviendra avec l'utilisation de vbcomponents qu'une seule fois.

    Après, si modification du code, il suffit de remplacer le viel XLA par le nouveau, et le tour est joué.

    J'ai une solution en VBA qui tourne chez des clients. Dans cette solution, le xls ouvre le xla puis est piloté par le xla.

    Si modifs, ajouts, ..., j'envoie un xla modifié, testé, vérifié, et le client remplace uniquement le xla.

    Quel confort pour moi depuis que j'utilise cette solution...
    "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...
    ---------------

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello Pierre,
    Je suis assez d'accord pour passer par un xla mais comment vois-tu ça ? Un Addlins dans Perso.xls ? Un bouton qui active le xla ?
    Je pense à jay-hut qui a débuté hier (!) mais je suis également intéressé.

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello jay-hut,
    Je reviens pour dire qu'il y a une erreur dans le code que tu nous as proposé. Tu as mis une parenthèse de trop sur cette ligne
    LeCode(3) = " If (Target.Value = ""GREY"") And Target.Column = 1) Then"
    Je corrige "mon" code mais fais-en autant

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Hello jay-hut,
    Je reviens pour dire qu'il y a une erreur dans le code que tu nous as proposé. Tu as mis une parenthèse de trop sur cette ligne
    Je corrige "mon" code mais fais-en autant
    Oui désolé j'ai voulu poster juste une partie de code allégé et je l'ai pas vérifié désolé, la parenthèse a été enlevée.

    J'ai une solution en VBA qui tourne chez des clients. Dans cette solution, le xls ouvre le xla puis est piloté par le xla.

    Si modifs, ajouts, ..., j'envoie un xla modifié, testé, vérifié, et le client remplace uniquement le xla.
    D'après ce que je comprend l'idéal serait que j'utilise le xla, je n'aurais qu'à travailler sur un nouveau xla et ensuite remplacer l'ancien une fois qu'il est au point.
    Je suis déjà noyé ... il y a un exemple quelque part d'un xls piloté uniquement par le xla?

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour ma part, je commencerais par tester le code que je t'ai passé. Je ne suis d'ailleurs pas certain qu'il fasse ce que tu veux, sauf si tu souhaites saisir GREY manuellement.
    Une fois que tu auras testé, avec un bouton pour lancer le code qui le placera dans Thisworkbook, il ne restera qu'à enregistrer dans un xla et à modifier une ou deux choses telle l'activation du xla à l'ouverture de Perso.xls, activation qui se fait par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddIns.Add("Fichier.xla").Installed = True
    et l'affectation du bouton à la bonne macro qui se fait par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Run "'Fichier.xla'!LaMacro", "LeParamètre"
    où LeParamètre sera le nom du fichier que tu as ouvert
    Et là, ça paraît tout simple mais laisse-moi quand même te souhaiter bon courage.
    A+

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/02/2015, 07h36
  2. [Toutes versions] Portée des fonctions : comment créer une fonction commune à tous les classeurs ?
    Par akr54 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/02/2010, 11h29
  3. [eclipse][plugin] Comment avoir une fenêtre avec focus
    Par relivio dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 07/04/2004, 15h54
  4. Comment créé une "interface" pour mes programmes??
    Par alcazar dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 09/02/2004, 13h02

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