Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Gestionnaire de tâches en VBA Excel
Une fois n'est pas coutume, nous avançons une solution pas totalement aboutie dans ce nouveau chapitre. Mais comme il s'agit d'une
astuce , elle ouvre la voie à des développements plus émérites. A l'occasion du volet précédent, nous avons découvert le
gestionnaire OnTime de l'
objet VBA Application . Il permet d'exécuter des actions bien définies à une heure précise, à la seconde près.
Sur l'exemple illustré par la capture, alors que l'utilisateur travaille sur l'une des feuilles du classeur, une
alerte apparaît en bas à droite de la fenêtre, comme si elle surgissait telles des sentinelles de Windows. Elle indique que l'échéance d'une tâche programmée est atteinte. C'est un petit
formulaire VBA Excel qui se charge de livrer la
notification .
Classeur Excel à télécharger
Pour démontrer cette nouvelle astuce, nous suggérons d'appuyer l'étude sur un
classeur hébergeant notamment une feuille dans laquelle sont archivés des
tâches et des
rendez-vous . Mais ce n'est pas tout, il offre aussi quelques parcelles de
code VBA .
Nous débouchons sur la première feuille du classeur. Elle est quasiment vierge. Elle ne propose aucun tableau.
En bas de la fenêtre Excel, cliquer sur l'onglet Taches pour activer sa feuille,
Elle présente un tableau dans lequel sont archivées des
tâches à accomplir et des
rendez-vous à honorer. Les dates des actions à accomplir sont inscrites en
colonne D . Les
heures sont archivées en
colonne E tandis que la
colonne F accueille les délais pour que les rappels se déclenchent en amont. Et dans ces deux dernières colonnes, toutes les données sont naturellement présentées au
format Heure .
L'utilisateur peut ajouter autant d'actions qu'il le souhaite à la suite du tableau. Le
code VBA que nous devons construire doit être en mesure de les scruter toutes, quel que soit leur nombre.
Le formulaire de notification
Nous proposons maintenant de découvrir tous les travaux qui sont avancés. Par exemple, le
formulaire existe déjà .
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel ,
Dans l'explorateur de projet sur la gauche, déployer le dossier Feuilles ,
Dès lors, double cliquer sur l'élément notif ,
De cette manière, nous affichons le
UserForm en mode conception. Il se nomme donc
notif . Il est notamment doté de deux étiquettes (contrôles Label). Elles sont respectivement nommées
titre et
descript . Elles sont destinées à afficher le détail des informations de la tâche ou du rendez-vous dont l'échéance est atteinte.
Double cliquer sur un emplacement vide du formulaire,
De cette manière, nous basculons dans la
feuille de code VBA qui lui est associée. Et nous découvrons deux procédures de code :
Private Sub ok_Click()
notif.Hide
End Sub
Private Sub UserForm_Activate()
Me.Top = Application.Height - Me.Height
Me.Left = Application.Width - Me.Width
End Sub
La première est attachée à l'unique bouton. Grâce à la
méthode Hide , elle se contente de
fermer le formulaire sur ordre de l'utilisateur. La seconde se déclenche au
chargement du formulaire . Elle exploite les
propriétés Top et Left du formulaire pour le positionner discrètement en bas à droite de la fenêtre.
Le code à l'ouverture du classeur
Pour que ces
alertes puissent se lancer quotidiennement en respectant les
dates et les
heures qui sont inscrites dans la seconde feuille, un
code VBA doit automatiquement se déclencher à l'
ouverture du classeur . Et c'est déjà le cas.
Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément ThisWorkbook ,
Nous découvrons la présence d'une procédure événementielle attachée à l'
ouverture du classeur :
Private Sub Workbook_Open()
Call recolter
End Sub
Elle se contente d'appeler la
procédure recolter . Elle existe déjà mais elle est vierge de code. Nous la découvrirons en consultant le
module associé à ce classeur.
Analyser les tâches au changement
Ce n'est pas tout. Après l'ouverture du classeur, rien n'empêche l'utilisateur de modifier des
rendez-vous ou d'en créer de nouveaux. En conséquence, les
gestionnaires d'événements doivent être reconstruits pour s'actualiser. C'est la raison pour laquelle, un
code VBA se déclenche déjà dès lors que la moindre
modification est observée dans la seconde feuille de ce classeur.
Dans l'explorateur de projet, double cliquer sur l'élément Feuil2 (Taches) ,
Nous découvrons ainsi la procédure événementielle qui lance à son tour l'appel de la fameuse
procédure recolter à implémenter :
Private Sub Worksheet_Change(ByVal Target As Range)
recolter
End Sub
Son rôle va consister à parcourir tous les éléments de la seconde feuille et à analyser chaque date. Dès lors qu'une date coïncide avec la date du jour, elle devra programmer les
gestionnaires d'événements capables de
déclencher les alertes contextuelles aux échéances attendues.
Le module VBA
Il est donc maintenant temps de découvrir ce que renferme le
module de ce projet .
Dans l'explorateur de projet, déployer l'affichage du dossier Modules ,
Puis, double cliquer sur l'élément Module1 ,
Nous affichons ainsi la feuille de code qui lui est associée, au centre de l'écran. Elle est composée de deux procédures.
Sub recolter()
On Error Resume Next
End Sub
Sub alerter(titre As String, msg As String, lheure As Date)
On Error Resume Next
notif.titre = titre
notif.descript = "A " & lheure & " : " & msg
notif.Show
End Sub
La première nous le savons, nous devons la construire complètement. C'est elle qui doit analyser toutes les
tâches et construire les
gestionnaires d'événements . La seconde (alerter) doit être appelée par la première. Elle se contente d'
afficher le formulaire en l'enrichissant des informations des
rendez-vous à afficher à échéances précises.
La déclaration des variables
Pour débuter le code, des
variables sont premièrement nécessaires. Elles doivent notamment servir à parcourir les cellules du
tableau des tâches et à prélever les informations des
événements à programmer .
Dans les bornes de la procédure recolter , ajouter les déclarations de variables suivantes :
Sub recolter()
On Error Resume Next
Dim feuille As Worksheet
Dim ligne As Byte: Dim laDate As Date
Dim lheure As Date
End Sub
Nous déclarons un
objet de type feuille (Worksheet) pour pouvoir pointer sur la seconde feuille à analyser. Nous typons la
variable ligne comme un
entier court . Sa vocation est de passer en revue toutes les lignes remplies, grâce à une boucle que nous construirons. Enfin, nous typons les
variables laDate et
lheure comme des variables de
type Date . Nous pourrons ainsi récolter et travailler les informations sur les
échéances à observer.
L'affectation des variables
Dans l'enchaînement, certaines de ces variables doivent être initialisées avant de débuter l'analyse.
Après la déclaration des variables, ajouter les trois affectations suivantes :
...
laDate = Date
Set feuille = Worksheets("Taches")
ligne = 4
...
Nous prélevons la
date du jour grâce à la
fonction VBA Date . Nous la stockons dans la
variable laDate . Nous initialisons (Set) l'
objet de feuille que nous faisons pointer sur la deuxième feuille de ce classeur grâce à l'
objet Worksheets auquel nous passons en argument le
nom de l'onglet à atteindre. Enfin, nous initialisons la
variable ligne sur la valeur 4. Il s'agit de la première ligne des rendez-vous dans le tableau.
Parcourir les lignes du tableau
Il est maintenant question de scruter chacun des rendez-vous. Pour cela, en partant de la ligne 4, nous devons engager une
boucle de lecture , capable de poursuivre son analyse tant qu'aucune ligne vide n'est détectée.
A la suite du code VBA , créer la boucle suivante :
...
While feuille.Cells(ligne, 2).Value <> ""
ligne = ligne + 1
Wend
...
Une
boucle While permet en effet d'engager une condition à vérifier pour évaluer si elle doit poursuivre son traitement. Avec ce critère (feuille.Cells(ligne, 2).Value <> ""), nous poursuivons l'étude tant que la cellule en cours d'analyse dans la deuxième colonne (B) n'est pas vide. Bien sûr, à chaque passage, nous n'oublions pas d'
incrémenter la variable ligne (ligne = ligne + 1), pour déplacer l'étude sur la ligne suivante au prochain passage dans la boucle.
Comparer les dates
Désormais, à chaque passage dans la boucle, il est question de comparer la
date de la tâche en cours d'analyse avec la
date du jour (laDate). Si elles coïncident, nous saurons qu'un événement dédié doit être créé pour déclencher une
alerte à échéance .
Dans la boucle, avant l'incrémentation, créer l'instruction conditionnelle suivante :
...
While feuille.Cells(ligne, 2).Value <> ""
If (feuille.Cells(ligne, 4).Value = laDate) Then
End If
ligne = ligne + 1
Wend
...
Le critère est trivial. Si les dates correspondent, il considère qu'un traitement doit être entrepris. Tous les autres rendez-vous, non-correspondants, sont ainsi ignorés.
Programmer les alertes
C'est ici que l'étape cruciale du développement intervient en faisant appel au
gestionnaire OnTime de l'
objet VBA Application . Il doit programmer le
déclenchement des alertes aux
échéances précises . Et pour cela, il est question tout d'abord de
calculer l'heure en tenant compte du rappel fourni en dernière colonne du tableau des tâches.
Dans l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :
...
lheure = feuille.Cells(ligne, 5).Value - feuille.Cells(ligne, 6).Value
Application.OnTime lheure, "'alerter """ & feuille.Cells(ligne, 2).Value & """, """ & feuille.Cells(ligne, 3).Value & """,""" & feuille.Cells(ligne, 5).Value & "'"
...
Tout d'abord nous calculons la différence entre l'heure du rendez-vous et le délai fourni sur le rappel. Cette échéance, pour le jour en cours, est désormais stockée dans la
variable lheure . Ensuite, nous créons l'événement, comme nous le disions, grâce au
gestionnaire OnTime de l'
objet Application . L'
heure lui est passée en premier paramètre. L'
appel de la fonction alerter pour déclencher le formulaire, est réalisé en deuxième paramètre. Attention, la syntaxe est très particulière. Tout d'abord cet appel doit être effectué entre doubles côtes. La fonction elle-même doit être encadrée de simples côtes. Mais comme cette fonction requiert des paramètres à concaténer et que les simples et doubles côtes sont déjà de sortie, nous inscrivons en double côtes entre doubles côtes pour pouvoir encadrer les informations textuelles.
Enregistrer les modifications (CTRL + S) et basculer sur la deuxième feuille du classeur,
Ajuster l'heure et la date d'un événement à programmer dans les minutes qui suivent,
Grâce à l'
événement OnChange de cette feuille, la
procédure recolter a de nouveau été appelée automatiquement. De fait, les gestionnaires ont été recréés.
Et après un peu de patience, vous voyez effectivement apparaître l'alerte désirée.