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 :

Démarrer une macro si ouvert via VBA mais pas manuellement.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 125
    Par défaut Démarrer une macro si ouvert via VBA mais pas manuellement.
    Difficile pour trouver un titre

    Je cherche une piste afin de démarrer un code VBA dans un fichier Excel lorsque je l'ouvre
    via une application tierce (Access, Word, autre Excel) mais pas lorsqu'il est ouvert manuellement.

    Une idée ?

    Philippe

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    Bonjour.

    J'ai fait cela en mettant en place une variable d'environnement.

    Dans mon cas ce sont des VBS qui se chargent de créer la variable mais on peut le faire en VBA.

    Ici le code que j'utilise :

    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
    Option Explicit
    Option Compare Text 'Rend VBA insensible aux majuscules/Minuscules
    Option Private Module 'Rend les routines de ce module invisibles à l'utilisateur
     
    'version 2019-07-11 12h50
     
    Private Sub Test_IsAutoExec()
        Debug.Print IsAutoExec
    End Sub
     
    Public Function IsAutoExec() As Boolean
        'Test si il existe une variable d'environnement portant le nom du fichier et qui vaut "Autoexec"
        ' Cette variable est normalement crée par le script qui appelle ce fichier
        Dim result As Boolean: result = False
        Dim wshshell As Object: Set wshshell = CreateObject("WScript.Shell")
        Dim wshSystemEnv As Object: Set wshSystemEnv = wshshell.Environment("USER")
        result = (wshSystemEnv("ParamExcel_" & ThisWorkbook.name) = "Autoexec")
        Set wshSystemEnv = Nothing
        Set wshshell = Nothing
        IsAutoExec = result
    End Function
    ici du VBA pour crée la variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub AddAutoExcec()
        'Crée la variable d'envirionnement
        ' Normalement c'est fait par le script qui appelle ce fichier
        Dim wshshell As Object: Set wshshell = CreateObject("WScript.Shell")
        Dim wshSystemEnv As Object: Set wshSystemEnv = wshshell.Environment("USER")
        wshSystemEnv("ParamExcel_" & ThisWorkbook.name) = "Autoexec"
        Set wshSystemEnv = Nothing
        Set wshshell = Nothing
    End Sub
    ici du VBA pour supprimer la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub RemoveAutoExcec()
        'supprime la variable d'envirionnement
        ' Normalement c'est fait par le script qui appelle ce fichier
        Dim wshshell As Object: Set wshshell = CreateObject("WScript.Shell")
        Dim wshSystemEnv As Object: Set wshSystemEnv = wshshell.Environment("USER")
        Call wshSystemEnv.Remove("ParamExcel_" & ThisWorkbook.name)
        Set wshSystemEnv = Nothing
        Set wshshell = Nothing
    End Sub
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonsoir

    Est-ce que tu as déjà regardé UserControl ? (https://docs.microsoft.com/en-us/off...on.usercontrol)

    Je pense que si tu ouvres un fichier depuis une application tierce; il y a une probabilité que UserControl soit sur False sinon si tu ouvres le fichier avec du code VBA alors c'est simple; tu mets Application.UserControl sur False.

    Du coup, lorsque tu ouvres ton fichier manuellement, Application.UserControl est initialisé à True.

    Cela me semble un bon interrupteur ;-)

    Bonne soirée.

  4. #4
    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 cavo789

    Citation Envoyé par cavo789 Voir le message
    [...]
    Il faut noter que UserControl sera à False si Excel est invisible. Dans Access, j'utilise les deux fonctions suivantes pour ouvrir un Excel. TestExcel ouvre le classeur sans préciser l'instance Excel, et UserControl est False car le classeur est invisible. Il faut noter en plus que, Excel étant invisible, il faudra que le code le ferme, car Excel ne sera pas fermé automatiquement à la fermeture VBA du fichier. TestExcel2 préciser qu'Excel doit être visible, et UserControl sera alors True à l'ouverture du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TestExcel()
      Dim wb As Excel.Workbook
     
      Set wb = Excel.Workbooks.Open("e:\temp\essaiapptierce.xlsm")
    End Sub
     
    Sub TestExcel2()
    Dim App As New Excel.Application
    Dim wb As Excel.Workbook
     
      App.Visible = True
      Set wb = App.Workbooks.Open("e:\temp\essaiapptierce.xlsm")
    End Sub
    "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...
    ---------------

  5. #5
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonsoir

    Merci pour avoir pris le temps de tester car je n'ai, de mon côté, que fait appel à ma mémoire mais visiblement, elle contient quelques trous.

    Dans ma petite case mémoire, j'avais conservé l'idée que UserControl était à True lorsque tu "ouvres" Excel de manière traditionnelle comme lorsqu'on double-clique sur un fichier Excel ou qu'on lance Excel nous-même.

    Dans cette même case mémoire, j'avais en tête que UserControl était sur False lorsqu'on programmait un Set App = New Excel.Application mais, je le suppose, si l'application est visible (et que l'utilisateur a donc l'opportunité de faire une action), UserControl est probablement sur False.

    Du coup, quand je lis ton explication ci-dessous, si on fait un Set App = New Excel.Application et qu'on garde l'application non visible, on peut donc détecter dans le code VBA d'un fichier Excel que l'application n'a pas été ouverte manuellement; ce qui répond au besoin évoqué par DphBxl. Non ?

    (merci pour avoir clarifié et testé UserControl)

    Bonne soirée.

  6. #6
    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.

    Peut-être une autre idée dans ce chapitre IX du tuto de Jean-Philippe André...
    "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...
    ---------------

  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
    En fait, le premier paragraphe du lien que tu as donné résume bien comment les choses se passent

    True if the application is visible or if it was created or started by the user. False if you created or started the application programmatically by using the CreateObject or GetObject functions, and the application is hidden. Read/write Boolean.
    UserControl est True si (Application visible OU ouverte par l'utilisateur) et UserControl est False si (Application Non visible ET Ouverte par CreateObject ou GetObject). Dans la mesure où je pense que l'utilisateur ne sait pas ouvrir Excel ou un fichier Excel en invisible manuellement (il n'y a pas, à la lecture de cette page, de commutateur permettant de le faire), on peut résumer ces propositions logiques en disant que UserControl est à True si l'application est visible.

    Ce que le lien de Microsoft ne fait pas, c'est définir cette propriété UserControl. Je pense pouvoir la définir comme étant la propriété qui renseigne sur la capacité de l'utilisateur Excel d'avoir le contrôle de l'application via Excel ( => UserControl) à l'ouverture du fichier (et uniquement à l'ouverture). Dès lors, l'application doit être visible. UserControl est bien géré à l'ouverture, de sorte que l'état de visibilité de l'application ou du fichier après ouverture n'influence pas cette propriété.

    Lorsqu'une application tierce, qui peut être Excel ^^, utilise un des deux codes suivants, l'instance Excel ouverte est invisible et UserControl sera donc False. Il sera possible de travailler dedans, mais on ne verra rien et il faudra que le code prévoit sa fermeture. Il y aura besoin d'une très solide gestion des erreurs, à mon avis ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
      Dim App As New Excel.Application ' Nouvelle instance invisible
     
      App.Workbooks.Open ("e:\temp\essaiapptierce.xlsm")
    End Sub
     
    Sub Test2()
      Dim wb As Excel.Workbook
     
      Set wb = Excel.Workbooks.Open("e:\temp\essaiapptierce.xlsm") ' Force l'ouverture d'une nouvelle instance invisible
    End Sub
    Si on veut rendre l'application visible, on doit passer par une variable pour la création de la nouvelle instance et rendre cette instance visible, mais UserControl sera True.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Test()
      Dim App As New Excel.Application
     
      App.Visible = True
      App.Workbooks.Open ("e:\temp\essaiapptierce.xlsm")
    End Sub
    J'ai essayé de passer cette propriété à False avant d'ouvrir le classeur car, bizarrement, elle est en lecture-écriture, mais Excel la repasse à True à l'ouverture du classeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test()
      Dim App As New Excel.Application
     
      App.Visible = True
      App.UserControl = False ' Essai de forcer la valeur de UserControl
      App.Workbooks.Open ("e:\temp\essaiapptierce.xlsm")
    End Sub


    Je pense donc pouvoir résumer en disant que UserControl peut donc être utilisé si le classeur ne doit pas être visible..., mais il ne permet pas, d'une manière générale, de déterminer comment le classeur a été ouvert.
    "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...
    ---------------

Discussions similaires

  1. [LibreOffice][Tableur] Une macro qui fonctionne sous Linux mais pas sous windows
    Par ludox62 dans le forum OpenOffice & LibreOffice
    Réponses: 3
    Dernier message: 07/01/2014, 21h26
  2. [XL-2000] Déactiver les macros d'un fichier ouvert via VBA
    Par zandru dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/09/2010, 16h14
  3. assigner macro à un bouton via VBA
    Par ouioui_cmoi dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/03/2008, 15h02
  4. Afficher une palette de couleur via VBA
    Par bernardmichel dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/08/2007, 14h21
  5. [VBA-E]Execution d'une macro access sous excel VBA
    Par virtualinsanity dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 21/04/2006, 17h27

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