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 :

Machin.enableevents = True/False


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut Machin.enableevents = True/False
    Bonjour à tous,

    Voilà le problème : si on écrit application.enableevents = False/True ça a l'air de s'appliquer à "tout le monde" (i.e. si je suis sur la feuille 1 d'un classeur multi-feuille ça s'applique aux autres feuilles) est-ce qu'il y a moyen de créer par exemple un worksheet.enableevents ? Ou de mettre en place son propre gestionnaire d'évènement (mais ça doit dépasser mon niveau).

    Merci de vos réponses.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Difficile de définir la stratégie ad hoc dans l'ignorance du contexte (que tu es seul à connaître).

    Sans connaître le contexte, voilà un exemple de ce que l'on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
      if sh.name = "toto" then application.enableevents = false else application.enableevents = true
    End Sub
    Qui inhibe les évènement de la seule feuille "toto".

    Reste à savoir si utile dans ton contexte ! (tu es bien le seul à le savoir)
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    Difficile de définir la stratégie ad hoc dans l'ignorance du contexte (que tu es seul à connaître).

    Sans connaître le contexte, voilà un exemple de ce que l'on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
      if sh.name = "toto" then application.enableevents = false else application.enableevents = true
    End Sub
    Qui inhibe les évènement de la seule feuille "toto".

    Reste à savoir si utile dans ton contexte ! (tu es bien le seul à le savoir)
    Bonsoir,

    Merci de me répondre ça me permet de voir qu'il faut que je précise ma question :

    supposons que je sois sur feuille1 dans une sub :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Range)  ' Worksheet_Change de feuille1
    
       Application.EnableEvents = False
       ...
       Application.EnableEvents = True
    
    End Sub
    et que je veuille faire exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Range)  ' Worksheet_Change de feuille2
    
       Application.EnableEvents = False
       ...
       Application.EnableEvents = True
    
    End Sub
    Ça ne marche pas (pas d'événement dans feuille2...), ça serait très pratique de pouvoir avoir :

    Feuille1.Enableevents = False

    Mais c'est peut-être très compliqué voire impossible ?

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Ce que tu demandes est impossible puisque cette propriété est une propriété de l'objet Application et non une propriété d'un objet Worksheet.
    Des parades existent bien évidemment pour faire face à d'éventuelles nécessités. Leur choix dépend TOUJOURS du contexte et peut être très différent entre deux cas de figure.

    Tu peux par exemple faire en sorte que l'évènement change d'une feuille ne fasse rien dans certaines circonstances, en jouant par exemple et entre autres avec une variable booléenne générale et en quittant la procédure évènementielle si cette variable = True ou en en exécutant les instructions si = False.
    Mais ce sera là la construction d'une stratégie qui ne peut bien évidemment être mise en oeuvre qu'en parfaite connaissance des mécanismes de ta propre application.
    Je t'ai donné à cette fin le mécanisme (expression conditionnelle) à appliquer dans l'évènement Change de ta feuille. Tu es par contre bien évidemment seul à décider quand et où mettre à True ou à false la booléenne utilisée.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je m'explique décidément mal : si j'ai deux feuilles T1 et T2, je peux avoir

    T1 True ET T2 True ou T1 False ET T2 False mais pas :
    T1 True ET T2 False ou T1 False ET T2 True ...

    J'ai dans mes feuilles, pour T1 :

    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
    Option Explicit
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Sec1 As Single
    Dim Sec2 As Single
     
    Sec1 = Timer()
    Application.EnableEvents = False
    Worksheets("T2").Activate
    Sec2 = Timer()
     
    While Sec2 < Sec1 + 10
        Sec2 = Timer()
    Wend
     
    MsgBox " T1 "
    Application.EnableEvents = True
     
    End Sub
    et pour T2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
     
    Sub Worksheet_Activate()
    MsgBox " T2 "
    End Sub
    Si je sélectionne une cellule dans T1, je ne peux plus RIEN faire avant la fin du "timer"...
    Qui plus est à la fin de du Worksheet_SelectionChange :

    - la msgbox de T1 est affichée (Normal),
    - la feuille T2 est sélectionnée (??? ça voudrait dire que d'une certaine façon on peut l'atteindre...)
    - la msgbox de T2 ne s'affiche pas après click sur celle de T1 (Normal elle n'a pas eu d'événement... ).

    Et désolé mais je ne vois pas comment faire pour changer ça.

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Je ne sais pas ce que tu fabriques, mais réitère ce que je t'ai déjà dit :
    Il est toujours possible, en lieu et place d'inhiber un évènement, d'inclure dans sa procédure évènementielle une expression conditionnelle dont la vocation est d'exécuter ou non les instructions qu'elle contient.
    Cette expression conditionnelle peut utiliser la valeur True ou False d'une variable booléenne générale créée à cette fin.
    Ainsi (exemple valable quelle que soit la procédure) --->> shéma --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub proc1
      if toto = false then
         ' instructions
      end if
    end sub
    il est clair que toto doit avoir une portée la rendant accessible depuis le module de code de la procédure proc1. Si plusieurs modules impliqués --->> déclarer toto en Public dans un module standard, ainsi
    A partir de là :
    - même si est lancée la procédure proc1, ses instructions ne seront pas exécutées si toto = true
    Reste à donner (là où tu le veux dans ton code) à toto la valeur true ou false selon le résultat que tu veux.

    Le mécanisme est le même, qu'il s'agisse ou non d'une procédure évènementielle.
    Ce mécanisme est tel qu'il n'inhibe pas les évènements, mais que leurs instructions sont ou non exécutées. Ce n'est pas pareil, mais le résultat est bien évidemment le même.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par unparia Voir le message
    Je ne sais pas ce que tu fabriques, mais réitère ce que je t'ai déjà dit :
    Il est toujours possible, en lieu et place d'inhiber un évènement, d'inclure dans sa procédure évènementielle une expression conditionnelle dont la vocation est d'exécuter ou non les instructions qu'elle contient.
    Cette expression conditionnelle peut utiliser la valeur True ou False d'une variable booléenne générale créée à cette fin.
    Ainsi (exemple valable quelle que soit la procédure) --->> shéma --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub proc1
      if toto = false then
         ' instructions
      end if
    end sub
    il est clair que toto doit avoir une portée la rendant accessible depuis le module de code de la procédure proc1. Si plusieurs modules impliqués --->> déclarer toto en Public dans un module standard, ainsi
    A partir de là :
    - même si est lancée la procédure proc1, ses instructions ne seront pas exécutées si toto = true
    Reste à donner (là où tu le veux dans ton code) à toto la valeur true ou false selon le résultat que tu veux.

    Le mécanisme est le même, qu'il s'agisse ou non d'une procédure évènementielle.
    Ce mécanisme est tel qu'il n'inhibe pas les évènements, mais que leurs instructions sont ou non exécutées. Ce n'est pas pareil, mais le résultat est bien évidemment le même.
    Moi je veux bien... Mais montre moi un code qui fait ce que je voudrait dans l'exemple que je montrais :

    - bloquer les événements sur T1 sans les bloquer sur T2 (ça c'est facile avec 1 booléen je suis d'accord même si ça pose des problèmes de gestion dudit booléen), mais si j'ai non pas 2 mais 12 feuilles T1...T12et que je veux que seules T3, T5 et T7 puisse recevoir des événements à l'instant t1 puis T2, T6, T9 à l'instant t2 ça revient à écrire une sorte de gestionnaire d’interruption avec x booléens sans possibilité de masquage sélectif...

    Et là on a envisagé que de bloquer au niveau worksheet, pas par exemple en différenciant pour les divers événements du worksheet...

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Mais montre moi un code qui fait ce que je voudraits dans l'exemple que je montrais
    Non ! Pas question ! Je pense avoir été assez clair ...
    Tout au moins : pas tant que tu n'auras pas d'abord au moins tenté de mettre en oeuvre ce que j'ai exposé et montré le code tenté.
    (je n'aime pas que l'on se contente de se mettre à table. Un cuisinier se met d'abord en cuisine...)

    EDIT : une chose doit être parfaitement claire et indiscutable.
    Ce forum n'est pas le concepteur de l'application Excel et de son VBA. Il n'a par voie de conséquence pas à "répondre" de ce qui relève de la seule compétence de ceux qui ont "bâti" l'application Excel.
    Ce forum peut (comme c'est le cas ici) proposer des palliatifs possibles. C'est tout.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par unparia Voir le message
    Mais montre moi un code qui fait ce que je voudraits dans l'exemple que je montrais
    Que celui qui n'a jamais fait de faute d'orthographe me jette la première pierre... Mais qu'il se relise avant !

    Citation Envoyé par unparia Voir le message
    Non ! Pas question ! Je pense avoir été assez clair ...
    Tout à fait, mais j'ai fait des recherches avant de poser la question sur ce forum et comme je l'ai dit cette solution je la connaissais. Mais comme je l'ai également dit quand on a 12 feuilles et que l'on veut les gérer de façon fine c'est l'horreur :
    - il faut 12 booléens
    - comme apparemment on ne peut pas avoir de tableau public (corrige-moi si je me trompe...), il faut les gérer à la main

    C'est au minimum lourd au pire source d'erreurs difficiles à tracer...

    Citation Envoyé par unparia Voir le message
    Tout au moins : pas tant que tu n'auras pas d'abord au moins tenté de mettre en oeuvre ce que j'ai exposé et montré le code tenté.
    (je n'aime pas que l'on se contente de se mettre à table. Un cuisinier se met d'abord en cuisine...)
    Le problème c'est que je ne suis pas un cuisinier tout juste un sous-sous-apprenti marmiton... (et encore !)
    Ceci étant mon code actuel fonctionne même s'il est très lourd et je venais voir auprès d'éminents sachants s'il y avait une façon simple d'implémenter un Worksheet"feuillen".EnableEvents visiblement ce n'est pas le cas à moins de considérer que mettre dans toutes les sub répondant à des événements d'une feuille un test sur un booléen changeant suivant la feuille est simple...

    Citation Envoyé par unparia Voir le message
    EDIT : une chose doit être parfaitement claire et indiscutable.
    Ce forum n'est pas le concepteur de l'application Excel et de son VBA. Il n'a par voie de conséquence pas à "répondre" de ce qui relève de la seule compétence de ceux qui ont "bâti" l'application Excel.
    Ce forum peut (comme c'est le cas ici) proposer des palliatifs possibles. C'est tout.
    Je n'ai jamais pensé faire répondre à ce forum de quoi que ce soit au contraire j'y trouve, en général, des réponses qui me stupéfient de par leur savoir faire et connaissance intime d'Excel et VBA !

    Merci pour ton temps.

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bien.
    Resumons pour clore :
    1) L'équipe Microsoft de Office n'a pas bâti Excel et son VBA en distinguant une propriété Enableevents pour chaque feuille séparément.
    Il faut donc "faire" avec ce qui est mis à disposition (pas le choix). Ceci est clair.
    2) toutes les méthodes permettant de gérer l'exécution ou non d'instructions mises dans les procédures évènementielles t'ont été indiquées. Il n'en existe pas d'autres.
    Voilà qui résume tout.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bien.
    Resumons pour clore :
    1) L'équipe Microsoft de Office n'a pas bâti Excel et son VBA en distinguant une propriété Enableevents pour chaque feuille séparément.
    Il faut donc "faire" avec ce qui est mis à disposition (pas le choix). Ceci est clair.
    2) toutes les méthodes permettant de gérer l'exécution ou non d'instructions mises dans les procédures évènementielles t'ont été indiquées. Il n'en existe pas d'autres.
    Voilà qui résume tout.
    En fait j'utilise une méthode analogue mais qui me permet de gérer plusieurs feuilles à la fois : je traite les événements comme des IT que je masque ou pas à l'aide d'un "registre" appelé T : exemple sur 3 feuilles mais on peut aller à 31...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    
    Private Const F_Activate As Long = 2    ' 2 ^ 1
    
    Private Sub Worksheet_Activate()
    
        If T And F_Activate = F_Activate Then
            ' Mon code
        End If
        
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    
    Private Const F_Activate As Long = 4    ' 2 ^ 2
    
    Private Sub Worksheet_Activate()
    
        If T And F_Activate = F_Activate Then
            ' Mon code
        End If
        
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    
    Private Const F_Activate As Long = 8    ' 2 ^ 3
    
    Private Sub Worksheet_Activate()
    
        If T And F_Activate = F_Activate Then
            ' Mon code
        End If
        
    End Sub
    Et si je veux que les feuille 1 et 3 soient "activables" et pas la 2, je n'ai qu'à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T = 10 ' Traduction de 0x1010...
    Et si on a besoin que de 24 feuilles, on peut utiliser les 7 bits restants pour bloquer sélectivement certains événements (mais là dans toutes les feuilles...).

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je n'ai rien compris aux explications données dans cette discussion mais j'ai cru deviner que tu souhaitais intercepter un événement qui se déclenche sur certaines feuilles et pas d'autres ?

    Si c'est le cas, il existe des procédures événementielles du module objet ThisWorkbook Elle comme toutes suffixée Workbook_Sheet et ont un argument Sh représentant l'objet feuille où a eu lieu l'événement.
    Il suffit à l'aide d'un Select Case d'agir ou non sur l'événement suivant le nom de la feuille

    A lire Les évènements du module objet ThisWorkbook, dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  13. #13
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour Philippe

    Je pense que Stan_fr a simplement voulu nous dire qu'il voyait bien ce qu'était le mécanisme proposé et nous a montré un exemple de mécanisme analogue qu'il utilise actuellement.
    Un tel mécanisme lui permet simplement d'éviter de gérer d'utiliser plusieurs variables booléennes.
    Qu'il traite ainsi ou autrement la pseudo-inhibition d'évènements de telle(s) feuille(s) et pas de telle(s) autre(s) est son choix, mais n'est pas sa tasse de thé non plus, dans la mesure où il cherchait, ai-je compris, à éviter d'intervenir dans le module de code de chaque feuille; raison pour laquelle il se demandait si existait une propriété enableevents restreinte à une seule feuille spécifiée (et cette propriété n'existe pas).
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Je n'ai rien compris aux explications données dans cette discussion mais j'ai cru deviner que tu souhaitais intercepter un événement qui se déclenche sur certaines feuilles et pas d'autres ?

    Si c'est le cas, il existe des procédures événementielles du module objet ThisWorkbook Elle comme toutes suffixée Workbook_Sheet et ont un argument Sh représentant l'objet feuille où a eu lieu l'événement.
    Il suffit à l'aide d'un Select Case d'agir ou non sur l'événement suivant le nom de la feuille

    A lire Les évènements du module objet ThisWorkbook, dans Excel
    Bonjour,

    Ça ne m'étonne pas trop que tu n'ai pas compris sans le contexte : voilà je viens du monde de la programmation de microcontrôleurs et chips spéciaux (DSP) pour l'instrumentation et le traitement de signal rapide, on est (très) loin des langages objets... Par ailleurs un client important et avec lequel je suis en contact permanent (ma femme...) m'a demandé de faire un programme pour gérer nos 2 chambres d'hôtes et je me suis dit qu'avec Excel ça devait pouvoir se faire sans trop de problème.
    Erreur de jugement ! Mais j'assume après ça nous permettra de faire des tas d'analyses avec des jolis graphes coloriés...

    Pour en revenir à nos moutons j'ai bricolé en VBA (je suis sur que mon code ferait rigoler les connaisseurs) en postulant que les événements étaient des Interruptions et que ça je savais gérer...

    Ayant découvert qu'il y avait Application.EnableEvents (pour moi l'équivalent d'un Drapeau de masquage de toutes les IT), je me suis dit qu'il devait aussi y avoir Worksheet.EnableEvents (équivalent d'un Drapeau de masquage des IT d'un canal), eh bien non ça n'existe pas...

    Après avoir contourné cette absence en traitant au niveau de chaque feuille et de chaque sub événementielle à l'aide de masques logiciels, je me suis dit que c'était quand même lourd à gérer et que peut-être les gourous de ce forum avaient résolu le problème avec plus d'objets, méthodes ou propriétés (héritée ou dérivées) de façon plus simple et j'ai posé la question ici...

    En fait apparemment c'est impossible de façon simple, personnellement j'y suis arrivé :

    - en prenant une variable globale T (un long donc 32 bits)
    - en attribuant à chaque feuille un masque de la forme 2 ^ n (donc un seul bit à 1 sur les 32)
    - en testant dans chaque sub si l'IT est autorisée en faisant un ET bit à bit entre T et le masque

    Par exemple si j'ai 6 feuilles et que je veuille que seules les feuilles 2 et 4 puisse répondre à des événements je fais T = 2 ^ 2 + 2 ^ 4...

    Mais ça fait un gros morceau de code à écrire et gérer dans les feuilles, et ça limite à 32 feuilles mais ça me suffit et à la limite ça doit être possible d'aller plus loin avec des objets.

    Si je comprends bien ce que j'ai lu dans ton excellent lien je pourrais tout centraliser au niveau WorkBook, c'est un très gros progrès MERCI !

    Et maintenant la question qui te montre mon niveau crasse :

    Dans chaque module j'écris quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Activate()    'Sub vide
     
    End Sub
    Ou rien du tout ?

    Autre chose ?


    Merci de m'avoir lu jusqu'au bout !


    EDIT : @unparia, tu as très bien résumé le problème !

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour Stan_fr
    Je ne pense pas que ton mécanisme ait échappé à la compréhension de Philippe.
    Il est similaire à celui qu'utilise par exemple (et entre autres) la fonction Dir pour déterminer les attributs de l'objet traité.
    Il ne faisait tout simplement pas le lien avec la demande de départ.
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour Stan_fr
    Je ne pense pas que ton mécanisme ait échappé à la compréhension de Philippe.
    Il est similaire à celui qu'utilise par exemple (et entre autres) la fonction Dir pour déterminer les attributs de l'objet traité.
    Il ne faisait tout simplement pas le lien avec la demande de départ.
    Amitiés
    Bonjour unparia,

    Désolé si j'ai donné l'impression de douter des compétences de Philippe mais c'est en fait la clarté d'exposition de ma démarche que je remettais en cause !

    J'ai été très "bavard" et en fait tu as synthétisé les choses de façon magistrale, merci !

    Amitiés.

    PS : Merci aussi pour le temps que tu y as passé !

Discussions similaires

  1. [Hibernate] inverse true/false
    Par srvremi dans le forum Hibernate
    Réponses: 3
    Dernier message: 14/11/2009, 15h40
  2. Réponses: 1
    Dernier message: 07/10/2007, 19h38
  3. Saut de ligne - visible = true / false
    Par starkson dans le forum ASP.NET
    Réponses: 3
    Dernier message: 27/08/2007, 22h21
  4. True false mysql
    Par foxmaster2005 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 06/02/2007, 13h11
  5. DBGrid Enabled true/false > pb de rafraichissement
    Par Harry dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/10/2004, 16h50

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