Evènement "Excel à fini de travailler"

Bonjour,

J'ai lancé un formulaire "UserForm1" et Je cherche un event qui me dirait qu'Excel a fini de travailler, qu'il est en attente sur un Click ou une entrée de clavier, bref qu'il est en attente, qu'il a terminé tout ce qu'il avait à faire.

Est ce que cela existe ?

Merci pour le coup de main

Jean-Pierre

Bonsoir,

Pas d'évènement de l'espèce, mais tu peux contourner en terminant ton programme par une action qui déclenchera un évènement que tu peux utiliser : en évitant des évènements que tu utilises déjà, et sans doute en le contrôlant à l'aide d'une variable pour qu'il n'intervienne que dans le cas que tu vises.

Tu as le choix : activer une feuille, après enregistrement du classeur (AfterSave), ça peut être indiqué après une opération importante (tu ferais d'une pierre deux coups). Ou si tu ne veux pas enregistrer, BeforeSave, que tu peux annuler dans le même temps...

Ou directement lié au userfom, en le masquant, etc.

Bonjour,

Tu peux te créer ton propre évènement mais il te faut utiliser un module de classe !

Un exemple tout simple pour le test :

En tête de module de l'UserForm tu colles cette ligne :

Dim WithEvents Cls As Classe1

Sur l'UserForm, tu poses un bouton et son code est :

Private Sub CommandButton1_Click()

    Set Cls = New Classe1

    Cls.Test 1000

End Sub

Tu ajoutes un module de classe nommé Classe1 (nom par défaut) dans lequel tu colles ce code :

Public Event FinProc()

Public Sub Test(Valeur As Double)

    Dim I As Double

    For I = 0 To Valeur Step 0.05

        DoEvents

    Next I

    RaiseEvent FinProc

End Sub

Pour le test, la procédure Test() déclarée Public dans le module de classe est appelée et elle mouline pour simuler le déroulement d'un code long puis l'évènement est déclenché et celui-ci affiche un message.

Bonjour,

Merci à vous deux pour vos propositions mais elles ne m’inspirent pas vraiment ...

Je crois qu’il vaut mieux que je vous explique mon problème.

J’ai une listbox1 et j’aimerais empêcher que l’on puisse cliquer sur un ou plusieurs des éléments de cette ListBox (ces éléments sont des éléments décoratif).

Si je clique sur un de ces éléments il ne doit rien se passer.

Autrement dit :

  • Si je clique sur l’élément 15 cet élément est sélectionné et le système le passe en bleu car il est sélectionné
  • Puis si je clique sur un des éléments interdit j’aimerais que cet élément ne passe pas en bleu.et l’élément sélectionné reste l’élément 15 comme si l’on n’avait pas cliqué sur l’élément interdit

Avez-vous une idée ?

Merci à vous

Bonjour,

Propriété Locked à True !Pardon ! Enabled à False.

Non ! Décidément ! C'est bien Locked à True

Au temps pour moi, j'avais pas tout lu... Locked empêche toute sélection.

Ce que tu demandes, il faut traiter au niveau du Click.

Il faut savoir si tu es éventuellement en multi sélection.

Il faut mémoriser la sélection (pour pouvoir la rétablir), lister les items interdits, et tester au Click si la sélection est valide ou non.

Je ne suis pas en multi sélection.

J'avais effectivement tester au click ( dans la routine Private Sub ListBox1_Change() ou Click()

if Listbox1.list.index = interdit then listbox1.listindex = ancienne valeur

mais cela ne marche pas, la valeur en bleu reste sur l'élément interdit

Ou ai je mal compris ta proposition ?

List.Index et ListIndex c'est pas pareil.

interdit c'est quoi ?

ancienne valeur c'est quoi ?

Drôle de façon de faire une procédure !

effectivement c'est pas pareil, c'est 2x list.index

interdit c'est une valeur string x (qui dans mon cas est un string vide ="")

ancienne valeur c'est un autre string x (dans mon cas par exemple Rome)

Donne ta proc. complète alors !

Et mets-la sous balises Code !

voici la routine

Private Sub ListBox1_Change()

       If Me.ListBox1.ListIndex = 0 Or Me.ListBox1.ListIndex = 2 Then  ' les deux string interdits
           Me.ListBox1.ListIndex = 1    '  valeur autorisée
       End If

End Sub

L’élément sélectionne en bleu reste sur l'élément 0 ou 2 (là ou j'ai cliqué) mais la valeur de l'index vaut bien 1, ce qui est contradictoire ...

Autre "spécialité":

Si je clique sur un élément "autorisé" (index autre que 0 ou 2) je passe une seule fois dans cette routine alors que si clique sur 0 ou 2 je passe 4 fois dans cette routine ???

Merci pour ton aide

Bonjour,

Le code fait bien ce qu'on lui demande car si on contrôle la valeur de ListIndex, elle passe bien à -1 (valeur que j'ai demandé pour le test) mais graphiquement, la ligne reste surlignée !

Si le code de modif est externe, ça fonctionne (lié à un bouton par exemple) mais pas si c'est la ListBox qui fait sa propre modif !

J'ai fais le test avec un module de classe mais même résultat !

Bonjour, Bonjour Theze,

Ce que j'ai noté, c'est que dans un premier temps tu voulais rétablir la sélection antérieure lors d'un clic sur un élément non autorisé, mais dans la version finale tu as abandonné cela (qui nécessitait une variable pour mémoriser la sélection avant changement...

Ce qui me laisse penser qu'on devrait pouvoir contrôler la répétition en boucle (mais il y en aura toujours au moins deux si non autorisé...)

Cordialement.

Bonjour,

Theze tu as parfaitement compris et expérimenté le problème.

Si on change l'index en dehors du code de l'event "ListBoxChange()" cela fonctionne correctement.

C'est la raison de mon premier message concernant un hypothétique "event Excel a terminé son travail" ce qui m'aurait permis de donner une nouvelle valeur à "ListBox1.Listindex" depuis un code extérieur.

Finalement je vais opter pour une autre stratégie. Si l'on clique sur un élément interdit je vais afficher une information que cet élément n'est pas possible et obliger l'utilisateur à modifier son choix.

En tout cas un grand merci pour votre aide à tous les deux

Bonne journée

Jean-Pierre

Bonjour,

Hello MFerrand, effectivement, la répétition du code dans la procédure évènementielle est contrôlable avec une variable booléenne mais pas le rappel de la procédure elle-même, c'est le même principe qu'avec une procédure "Change()" dans une feuille, si on change la valeur dans le code, la procédure s'appelle à nouveau !

Salut Theze,

Oui j'arrive à limiter les itérations à 2 avec une booléenne... mais par contre j'ai un autre problème qui m'échappe, c'est que la valeur de la ListBox n'est jamais modifiée ! J'ai procédé d'au moins 20 à 25 façons différentes (y compris sans me préoccuper des itérations), rien à faire. Et même la modification de valeur par clic sur un bouton est sans effet sur la valeur interdite (fonctionne pour toute autre).

Je reprendrai l'étude de la chose quand j'aurai plus de temps, j'ai certainement loupé quelque chose et ça m'intrigue !

Cordialement.

Re,

À l'occasion, je ferai comme toi, je ferai d'autres tests car ça me contrarie de ne pas arriver à trouver une solution

Rechercher des sujets similaires à "evenement fini travailler"