Cours Evenements Excel

Embed Size (px)

Citation preview

  • Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    PROGRAMMATION EVENEMENTIELLE

    sur EXCEL

    MASTERs SMaRT & GSI

    Pierre BONNET

  • 46Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle

    Retour l'exploitation classique d'Excel

    La programmation vnementielle permet un appel de procdure depuis l'interface HMI d'Excel (ou d'un User Form)

    Attention: le nom de la procdure vnementielle est impos par l'objet source en MsOffice

  • 47Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle:

    Evnement [front montant]

    Retour de tche vnementielle

  • 48Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle sur front:

    t

    t

    Tchevnementielle

    Evnement

    t

    Tcheprincipale

    activeactive suspendue suspendue ...

    masquageappel

    active activeactive

    Attente TraitEvent

    Conditionsvnementielles

    Fin Traitvnement

    Diagramme de commande

  • 49Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle: blocage temporaire par la tche vnementielle

    Le retour la fentre de prsentation Excel se faite la fin de la boucle. Aucune activit apparente sur la fentre: le compteur reste la valeur 0; le bouton "Start" reste enfonc; le bouton "Stop" reste enfonc

    un clic sur "Stop" est pris en compte par le gestionnaire d'vnements de l'interface graphique (Windows).et transmis au gestionnaire d'vnements de l'application (Excel). Cet vnement est mis en pile dans le gestionnaire de l'appli et n'est trait qu'aprs la fin de traitement de l'vnement prcdent.

  • 50Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle:

    Les performances de l'application seront donc lies la qualit de la programmation des tches

    Blocage temporaire de l'application dans la tche vnementielle

    Blocage dfinitifdans la tache

    sans fin

  • 51Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle:

    Appel forc au gestionnaire d'vnements: l'vnement suivant dans la pile est trait

    Retour feuille Excel

    Gestionnaire d'vnements

  • 53Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle: principeExcel,VBC++...

    Explorer

    Bureau

    Systme d'exploitation

    HorlogeHMIInterruptions

    Timers

    Evnements Messages

    Gestionnaire de fentres graphiques

    E/S

    Interruptionsmatrielles(cartes...)ordonnanceur

    Chaque application possde son propre

    gestionnaire d'vnement

  • 54Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle: principe

    Pile d'vnements

    Fifo

    vnementsvenants d'applications

    externes (sources)

    Gestionnaire d'vnements

    Fonctions vnementielles

    App

    el

    Fonc

    tion

    Retour fonction

    Structure d'une application

    les vnements sont traits dans l'ordre d'apparition

    accs la gestion de pile [crasement volontaire]? Modification de l'ordre des vnements dans la pile ? Appels multiples d'un mme vnement?

  • 55Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Programmation vnementielle: exercice 4

    Boutons de commande industriels

    On dsire prsenter un composant Excel de supervision reprsentant une commande Arrt/Marche deux boutons commandant une variable boolenne :

    - lors de l'appui sur "Marche", le bouton devient inactif,enfonc, texte en vert fonc normal, le bouton "Arrt" devient actif, relch texte rouge clair gras

    - lors de l'appui sur "Arrt", le bouton devient inactif,enfonc, texte en rouge fonc normal, le bouton "Marche" devient actif, relch texte vert clair gras

    - la variable boolenne est visualise par une cellule dont le texte et la couleur sont en concordance avec l'tat des boutons.

    Veiller dfinir l'tat initial des composants l'ouverture d'Excel (bouton d'initialisation ou mieux vnement ouverture classeur)

  • 56Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    vnements Classeur

    Ouverture classeur Private Sub Workbook_Open() Call MaProdedure End Sub Fermeture classeur Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Redimensionnement fentre classeur Private Sub Workbook_WindowResize(ByVal Wn As Window)

  • 57Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    vnements Feuille

    Activation/dsactivation Feuille

    Sub WorkSheet_Activate() Sub WorkSheet_Deactivate() Changement de valeur sur feuille

    Sub WorkSheet_Change(ByVal Target As Range)[Target reprsente la plage modifie, elle peut contenir plusieurs cellules. ]

    Attention : si la procdure vnementielle modifie elle-mme des contenus de cellule, il y aura rcursivit de l'vnement. Dans une telle application, il est ncessaire de bloquer [masquer] les vnements par Application.EnableEvents = False avant de modifier les contenus, puis de dbloquer les vnements par Application.EnableEvents = True

    voir http://www.cpearson.com/excel/Events.aspx

    Changement de slection sur la feuille

    Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) [Target reprsente la nouvelle plage slectionne]

  • 58Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Evnements

    Cration d'une nouvelle procdure vnementielle

    Se placer dans le module "Classeur" ( ThisWorkbook ), insrer le code suivant :

    Public WithEvents Mon_Appli As Application

    Private Sub Workbook_Open() Set Mon_Appli = ApplicationEnd Sub

    L'application "Mon_Appli" dispose maintenant de proprits vnementielles associes certains lments du projet (classeur, feuilles...), tout comme une feuille, un classeur ou un module.

    La liste des vnements disponibles (onglet en haut de droite) est consultable aprs avoir slectionn l'application (onglet en haut gauche)

  • 59Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Insertion d'autres contrles ActiveX

    Les contrles activeX sont des composants externes crits conformment aux rgles COM (Component Objet Model); ces composants possdent des proprits, exposent des mthodes et gnrent des vnements.Pour tre utilisable dans une application, ces composants doivent tre enregistrs dans la base de registre (regserv32.exe).

    Un composant ActiveX s'excute dans l'espace mmoire de l'application principale appele conteneur.

    Un composant ActiveX comprend des proprits, des mthodes et des vnements.

    Exemple : calendrier Calendar Microsoft

  • 60Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Contrle du temps d'excution d'une application

    Lecture de l'heure et valuation d'une dureL'heure courante est directement accessible sous Excel/VBA par la fonction Now Le format est celui d'un flottant double prcision avec :

    - partie entire = nombre de jours depuis 1900

    - partie fractionnaire = fraction de jour (1h = 1/24 de jour, 1mn = 1/(24x60) de jour , 1s =1/(24x60x60) de jour )

    Les calculs peuvent se faire directement avec les dates/heures par simple addition ou soustraction:

    Heure_Depart = Now Calculs....

    Heure_Fin = NowDuree = Heure_Fin - Heure_Depart

    Il existe de nombreuses fonctions de manipulation des date/ heure qui facilitent l'expression des calculs ou des rsultats

  • 61Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Contrle du temps d'excution d'une application

    Gestion du temps par mthode d'attente

    Sub Attente() Dim Fin_Tempo [as Variant] Fin_Tempo = Now + TimeSerial(0, 0, Duree_attente_s ) Application.Wait Fin_Tempo MsgBox "Attente termine"End Sub

    La mthode Wait permet de faire intervenir la notion de temps dans l'excution d'une fonction

    L'attente est blocante pour la TOTALITE de l'application Excel

  • 62Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Mthode fondamentale pour une gestion multitche non-blocante

    Heure_Execution = Now + TimeSerial(0, 0, Duree_attente ) Application.OnTime Heure_Execution , "Procdure_a_executer"

    [ la procdure doit tre crite dans un "module" pour tre accessible au systme d'exploitation]

    La mthode vnementielle OnTime permet de disposer d'une gestion multitche par appel de fonctions depuis le systme d'exploitation.

    La gestion de l'vnement est externe l'application Excel

    La tche s'excute mme en cas de fermeture du classeur (rouverture du classeur sous rserve qu'une instance d'Excel soit ouverte)

    Contrle du temps d'excution d'une application

  • 63Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Principe de fonctionnement de la mthode OnTime

    Enregistrement de la demande d'vnement auprs du systme d'exploitation [NT/XP]

    La mthode OnTime n'est pas bloquante car elle est gre par le systme d'exploitation

    Appel de la tche temporise par le systme d'exploitation

    Attention: La tche appele doit tre dsigne par son nom complet pour tre visible depuis Windows

    Poursuite de l'excution de la tche appelante

    Contrle du temps d'excution d'une application

  • 64Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Tche cyclique

    La temporisation est relance sur elle-mme et cre une tche cyclique . L'arrt de la tche cyclique ne peut se faire que par son enregistrement avec le paramtre de "Schedule" False, ce qui la supprime de la liste des vnements.

    Enregistrement de la demande d'vnement au systme d' exploitation [NT/XP]

    Rappel de la tchecyclique par le systme d'exploitation

    Poursuite de l'excution de la tche appelante

    Contrle du temps d'excution d'une application

  • 65Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Tche cyclique

    Des erreurs sont souvent constates dans le fonctionnement de l'exemple de la page prcdente :

    - l'activit s'excute deux fois (voire plus) pour une priodicit donne

    - la priodicit de la Tche cyclique apparat comme fausse (priode diminue)

    Explications :

    aprs le lancement initial de la tche cyclique, son fonctionnement n'est plus

    contrl par Excel mais par le systme d'exploitation.

    tout lancement supplmentaire de la tche cyclique (par le menu "macro"

    ou par programmation) gnre une nouvelle instanciation .

    Les instanciations multiples fonctionnent en boucles imbriques: les instants de dclenchements peuvent tre identiques (activit vnementielle rpte plusieurs fois au mme instant) ou dcals (activit relance au cours d'une priode de base)

    Contrle du temps d'excution d'une application

  • 66Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Exercice 5: clignoteur

    Contrle du temps d'excution d'une application

    On dsire raliser un clignoteur bas sur une temporisation cyclique de 1s.La temporisation sera lance par un poussoir "marche" et arrte par un poussoir "arrt"Lorsque l'arrt est effectif, le clignoteur sera teint.Faire ensuite un clignoteur dont la dure l'tat allum est 2s et la dure l'tat teint 1s (utiliser deux tches s'appelant mutuellement)

    Propositions pour fiabiliser l'application :

    a) utiliser une variable boolenne tempo_en_marche qui sera teste pour viter le relancement de la tempo

    b) utiliser la proprit schedule = false de la mthode Application.OnTime pour l'arrt du clignoteur.

  • 67Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Timer VB

    Sous VB6, l'utilisateur dispose de Timer ajustable de 1 ms 65s . Sa programmation est trs simple (non disponible sous VBA)

    Timer Windows

    Le systme d'exploitation Windows propose une fonction de type timer dans la

    librairie user32.dll . Elle permet de fixer une dure la dure (ou priode ) 1 ms prs.Les lments de programmation sont :

    dfinition de la fonction vnementielle

    lancement du timer avec passage du pointeur de la fonction vnementielle arrt du timer par la fonction killtimer

    Contrle du temps d'excution d'une application

  • 68Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Timer systme de la librairie user32Contrle du temps d'excution d'une application

    Option ExplicitDim Compteur As Integer

    Declare Function SetTimer Lib "user32" _ (ByVal hwnd As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimerFunc As Long) As Long

    Declare Function KillTimer Lib "user32" _ (ByVal hwnd As Long, _ ByVal nIDEvent As Long) As Long

    Sub TimerProcess(ByVal hwnd As Long, _ ByVal uMsg As Long, _ ByVal idEvent As Long, _ ByVal dwTime As Long)

    Compteur = Compteur + 1 Feuil1.Cells(1, 1) = CStr(Compteur)End Sub

  • 69Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

    Programmation VBA/Excel

    Timer systme de la librairie user32Contrle du temps d'excution d'une application

    Option ExplicitDim IDTimer As LongDim EtatTimer As Boolean

    Private Sub Commandbutton1_Click()'Starts and stops the timer. If EtatTimer = False Then IDTimer = SetTimer(0, 0, 10, AddressOf TimerProcess) If IDTimer = 0 Then MsgBox "Timer non cr" Exit Sub End If EtatTimer = True CommandButton1.Caption = "Stop Timer" Else IDTimer = KillTimer(0, IDTimer) If IDTimer = 0 Then MsgBox "impossible d'arrter le timer" End If EtatTimer = False CommandButton1.Caption = "Start Timer" End IfEnd Sub

    'A mettre dans le module "This WorkBook"Private Sub WorkBook_Open() EtatTimer = False CommandButton1.Caption = "Start Timer"End Sub

    Diapo 45Diapo 46Diapo 47Diapo 48Diapo 49Diapo 50Diapo 51Diapo 53Diapo 54Diapo 55Diapo 56Diapo 57Diapo 58Diapo 59Diapo 60Diapo 61Diapo 62Diapo 63Diapo 64Diapo 65Diapo 66Diapo 67Diapo 68Diapo 69