Aide sur la récupération d’événement de souris API ou autre - VBA Excel

julienB68 Messages postés 5 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 11 juillet 2012 - 4 juil. 2012 à 17:15
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 - 6 juil. 2012 à 14:57
Bonjour à tous

J'ai une application Excel qui communique avec un serveur OPC (Tout fonction bien, stable)

J'ai une procédure qui ai appelée par événement à chaque fois (qu'une variable abonné) a changée de valeur.


Le problème ai que si la fonction n'ai pas terminé ET qu'un événement souris se produit par exemple : clique gauche sur la feuille et bien un message d'erreur se produit ?????

(Un clique droit ne crée pas d'erreur)

--------------------------------------------------------------------------------------------------------------

Voici l'erreur :


Erreur d'exécution'50290'

Erreur définie par l'application ou par l'objet


Comment avoir l’évènement de souris clique gauche en VBA sous excel ?

Y'a t-il un moyen de inhiber le clic gauche de la souris pendant l’exécution de ma procédure ?

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 juil. 2012 à 19:11
Salut

Tu fais du VBA, pas du VB.Net (catégorie)

Ton client OPC utilise t-il un composant additionnel ou bien le code est-il complètement du VBA ?
- Si tu utilises un objet (OCX par exemple), l'erreur pourrait venir de lui. Auquel cas, demande au créateur de l'OCX.
- Si tout est fait par le code, il faudrait savoir sur quelle ligne apparait l'erreur.
Vérifier que la gestion d'erreur est correctement faite.

Ce genre de comportement, lorsque l'utilisateur utilise le classeur pendant qu'un programme tourne, me fait penser à l'utilisation de "Selection" dans le code.
Si tel est le cas, dès que tu cliques sur une cellule, la sélection devient cette cellule, donc perturbe le programme.
Les "Select" ou l'objet "Selection" sont à bannir des codes VBA.

PS : Tu me copieras 100 fois les conjugaisons des verbes être et avoir.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
julienB68 Messages postés 5 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 11 juillet 2012
5 juil. 2012 à 15:21
Bonjour ,

Merci pour la réponse.

Pour info:
-Tout est fait par le code.
-Ma procédure qui est appelé a chaque fois que j'ai un évènement est la suivante :

Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, _
ByVal NumItems As Long, _
ClientHandles() As Long, _
ItemValues() As Variant, _
Qualities() As Long, _
TimeStamps() As Date)

Dim i As Integer

For i = 1 To NumItems
Cells(ClientHandles(i), 4) = ItemValues(i)
Next i

End Sub


Il me plante sur le Cells(ClientHandles(i), 4) = ItemValues(i).

Je crois qu il est perdu lorsque je lui demande de sélectionner une cellule avec le clic gauche et en même temps d'écrire sur une autre.

C'est pour ça que je cherchais un moyen pour que l'utilisateur ne puisse pas cliquer au moment ou il y a un évènement.. une réponse ?
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
6 juil. 2012 à 10:02
Salut,

essai de d'ajouter ce qui suit :

Ajoute la declaration de cette variable en haut d'un module

Public ComOPC As Boolean, MaCellule As Range


Modifi ton code :

Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, _
ByVal NumItems As Long, _
ClientHandles() As Long, _
ItemValues() As Variant, _
Qualities() As Long, _
TimeStamps() As Date)

Dim i As Integer
ComOPC = True
For i = 1 To NumItems
   Set MaCellule = Cells(ClientHandles(i), 4)
   MaCellule.Value = ItemValues(i)
Next i
ComOPC = False
End Sub 


Dans la code de ThisWorkbook :

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If ComOPC = True Then
        If Not Target Is Macellule Then Macellule.Select
    End If
End Sub


Je n'ai rien testé à toi de le faire

A+
0
julienB68 Messages postés 5 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 11 juillet 2012
6 juil. 2012 à 14:07
Merci pour la réponse mais cela ne marche pas:

1. Ce code permet de ne pas sélectionner une cellule pendant l’exécution de mon évènement.
Alors que mon problème est que lorsque j'ai le clic gauche maintenue avant l’évènement ( ça peut être 10sec...) et que l’évènement survient, ça me plante (l’exécution de la procédure sur l’évènement est très rapide <20ms).

Il faudrait pouvoir donner l'ordre de relâcher le clic gauche au début de mon évènement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
6 juil. 2012 à 14:57
Ok,

ce n'est pas si simple même via les API. car dans ton cas même l'API GetKeystat arrive trop tard.

Ce n'est que mon avis n’étant pas un spécialiste. A priori il faut passer par subclassing pour intercepter le message, enfin quelque chose comme cela.

Bref une autre solution plus simple à mettre en place serait d'avoir une form modal que tu ouvres pendant la com OPC. la form aura alors le focus et recevra seule les événements click.

De plus cette form sera utile pour prévenir l'utilisateur du traitement en cour.

A+
0
Rejoignez-nous