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 :

ne pas exécuter tout Private Sub Workbook_Open() à l'open [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut ne pas exécuter tout Private Sub Workbook_Open() à l'open
    Bonjour,

    à l'open d'un classeur "C" je fais un certain traitement "T" qui prends du temps, ce classeur peut être ouvert par d'autres classeurs mais sans besoin du traitement "T".

    Pour optimiser je me demande si je peux ouvrir ce classeur "C" en passant un paramètre et tester ce paramètre dans Private Sub Workbook_Open() pour sauter le traitement "T"

    Suis-je assez clair dans ma demande ?

    merci pour toutes bonnes idées ou pratiques

  2. #2
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Salut Retraite,

    A mon sens, lors de l'appel du classeur ayant la procédure Open, l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False
    suffirait dans la procédure d'appel.

    Si une partie de l'évènement Open seule est à exécuter, alors la procédure Open de ce classeur pourrait contenir une suite d'appels de procédure.
    Celle(s) choisie(s) serai(en)t exécutée(s) à partir de l'instruction
    dans le classeur appelant.

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut
    Merci

    qu'entend-on par
    la procédure Open
    je ne comprends pas si c'est dans le classeur appelant ou le classeur ayant "private sub woorkbook_open"

    de toutes façons je vais tester

  4. #4
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    J'entendais par là la procédure évènementielle
    Workbook_Open
    .

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut
    je ne comprends pas bien comment ça s'articule avec "Workbook_Open" , je n'ai jamais fait cela mais je vais chercher…

    merci

  6. #6
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    A toute fin utile,
    Sur Application.Run à partir d'un classeur autre, voir cette passionnante discussion à laquelle ont participé le regretté Ouskelnor (ma jeunesse sur le Forum), Silkyraod et Jean Philippe André

  7. #7
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut
    Merci

    Ca à l'air passionnant mais largement au dessus de mes compétences actuelles...

  8. #8
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    mais largement au dessus de mes compétences actuelles
    Pourquoi?
    Les 2 premiers post d'Ouskelnor indiquent la syntaxe à appliquer. (Attention aux quottes!)
    Ensuite, tu peux tester à partir de cas simples et revenir en cas de problème en précisant bien le(s) point(s) d'achoppement.

    A plus donc.

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    si le classeur contenant le code dans le open est ouvert dans l'intance du classeur qui ouvre celuici

    une chose a faire est simple tu englobe le code du open dans une

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if workbooks.count=1 then
     
     
    end if
    le code ne sera pas effectué si d'autre classeurs dans l'instance

    on pourrait meme aller plus loin encore; tout simplement en testant les noms des classeurs ouverts dans l'instance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for each wb in workbooks
    if wb.name="toto.xlsm" then exit sub
    next
    ca ne changerait rien pour le classeur si il est ouvert tout seul le open serait effectué

  10. #10
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut
    post #8

    je vais regarder et essayer mais cela va me prendre un peu de temps pour comprendre

    post #9
    Re Patrick,

    c'est pas très clair pour moi (comme d'habitude tu vas me dire) mais je vais regarder et essayer

    une chose a faire est simple tu englobe le code du open
    tu veux dire le code de "Private Sub Workbook_Open()" du classeur ouvert dont je ne veux pas exécuter le code ?

    Il peut y avoir plusieurs classeurs ouverts mais tous dans la même instance Excel, je me demandais même s'il n'y avait pas un moyen de ne pas déclencher du tout le "Private Sub Workbook_Open()" à l'open du classeur ?

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    oui dans ton classeur avec l'open tu a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_Open()
    'blabla
    'blabla
    'blablabla
    End Sub
    et bien tu fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'si plusieur classeur sont ouverts dans la même instance  le code ne s'exécutera pas 
    Private Sub Workbook_Open()
    if workbooks.count=1 then 
    'blabla
    'blabla
    'blablabla
    end if
    End Sub
    ou

    'si le lanceur s'appelle "toto.xlsm"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Workbook_Open()
    for each wb in workbooks
    if wb.name="toto.xlsm" then exit sub 
    next
    'blabla
    'blabla
    'blablabla
    End Sub

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    et si tu décidais dans ton code qui ouvre le classeur de l'ouvrir dans une autre instance de l'application excel
    la encore il y a un truc simple a faire !!

    dans le lanceur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
    Set app = CreateObject("excel.application")
    app.Caption = "non_non"
    app.Visible = True
    app.Workbooks.Open "C:\Users\polux\DeskTop\lelancé.xlsm"
    End Sub

    et dans le classeur qui est ouvert

    donc dans le open
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_Open()
    If Application.Caption Like "*non_non*" Then Exit Sub
    MsgBox "coucou"
    End Sub
    voila si tu l'ouvre même dans une autre instance a partir du lanceur me msgbox "coucou" ne viendra pas
    mais si tu ouvre le classeur tout seul le msgbox apparaitra donc le code s'exécute

    voili voilou

    c'est simple comme chez renault

  13. #13
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut
    Merci Patrick,
    j'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
     
    Private Sub Workbook_Open()
    Dim wb As Workbook
    For Each wb In Workbooks
        If wb.Name = "C1.xlsm" Then
            MsgBox "on n'exécute pas ThisWB open de C2"
            Exit Sub
        Else
        End If
    Next
    MsgBox "on a exécuté ThisWB open de C2"
     
    End Sub
    cela marche très bien. C1 appelant, C2 appelé

    Mon problème est que j'ai pas mal de classeurs pouvant appelé C2, je peux toujours faire qq chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     If wb.Name = "C1.xlsm" or _
    wb.Name = "Cx.xlsm" Then
    j'aurai préféré ne pas avoir à ajouter le nom de tous les classeurs en dur mais plutôt au moment de l'open dans l'appelant C1 avoir un paramètre qui dise de ne pas exécuter Thisworkbook open de C2 … Cx

  14. #14
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 356
    Points
    34 356
    Par défaut
    Salut,

    te baser sur le nom d'un classeur c'est minable à gérer dans le temps (nouveau nom = nouveau code de partout).

    Essaie plutôt de travailler sur une valeur dans une cellule de classeur ou un libelle à quelque part dans le classeur qui serait suffisamment discriminant pour pas te louper

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re

    je recommence

    le classeur qui ouvre dans la même instance ou pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test() 'ouvre dans une autre instance
    Set app = CreateObject("excel.application")
    app.Caption = "||||"
    app.Visible = True
    app.Workbooks.Open "C:\Users\polux\DeskTop\lelancé.xlsm"
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test2() 'ouvre dans la même instance
    Application.Caption = "||||"
    Workbooks.Open "C:\Users\polux\DeskTop\lelancé.xlsm"
    End Sub
    dans le classeur qui est ouvert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_Open()
    'Debug.Print "|" & Application.Caption & "|"
    If Application.Caption Like "*||||*" Then Exit Sub
    MsgBox "coucou"
    End Sub
    on peut même se permettre de remettre la caption a l'initial dans le open histoire de faire propre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_Open()
    Debug.Print "|" & Application.Caption & "|"
    If Not Application.Caption Like "*Microsoft Excel - *" Then Application.Caption = "Microsoft Excel - ": Exit Sub
    MsgBox "coucou"
    'blabla
    'blabla
    End Sub

    sinon il te faudra séquencer par macro intermédiaire le code du open
    je vais tenter quelque chose et reviendrait si ca marche

  16. #16
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut
    N'est-il pas possible de faire plus simple :

    Par exemple au moment de l'open dans les classeur appelants, faire "Workbook_Open" en passant un paramètre 0 ou 1 suivant si on veut ou pas exécuter le code à l'ouverture de l'appelé

    ensuite dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Workbook_Open()
    du classeur appelé, il suffirait de tester:

    si = 0 --> exit sub
    si = 1 --> on exécute le code

    Pas possible ça ?

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    non car les arguments qui suive le chemin son readonly etc..... si je me souviens bien

    donc non !!

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    j'ai tenter de transférer le code dans l'évènement sheet_change mais j'ai l'aller mais pas le retour
    tu pourrais aussi passer par un fichier ini dynamique mais la encore se serait certainement plus lourd encore
    conclusion:
    si personne n'a d'idée sur ce point tu va devoir faire avec

  19. #19
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 255
    Points : 475
    Points
    475
    Par défaut
    Et si je créé une feuille "param" dans chaque classeur (appelé et appelant) et que je renseigne mon top 0 ou 1 dans une cellule (A1) de param de l'appelant juste avant l'open

    en faisant une équivalence dans la cellule A1 "param" de l'appelé (='Param appelant'!A1) je devrai pouvoir ensuite récupérer le contenu de la cellule dans "Private Sub Workbook_Open()" et le tester pour exécuter ou non le code ? puis remettre le top = 0 à la fin de l'open ?

    je vais tester


    post#8
    j'ai du mal à appréhender...

  20. #20
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 356
    Points
    34 356
    Par défaut
    Salut,

    si tu es prêt à t'accrocher, si je prends ta demande initiale, tu peux utiliser les passages de parametres avec Excel :

    https://jpcheck.developpez.com/tutor...ge-parametres/

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. replace() sur toutes les variables d'une Private Sub
    Par wulfram dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/08/2016, 15h48
  2. [XL-2007] Listview et auto exécution private sub lorsque changement de ligne
    Par chrisaccess dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/01/2016, 20h23
  3. VBS ne pas exécuter le Workbook_Open()
    Par GuiJenn34 dans le forum VBScript
    Réponses: 1
    Dernier message: 25/09/2015, 09h01
  4. Réponses: 3
    Dernier message: 30/03/2015, 11h48
  5. [XL-2010] Supprimer une ligne précise dans Thisworkbook Private Sub Workbook_Open
    Par modus57 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 24/04/2012, 19h31

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