Tutoriel réalisé avec Excel 2013
Lorsque vous gérez des dates ou des quantités (pour la gestion des stocks), il peut être intéressant de créer des alertes à l’ouverture du fichier Excel afin d’être averti qu’une date approche ou qu’un stock est insuffisant. Vous pouvez créer une alerte grâce à la mise en forme conditionnelle, mais elle sera seulement visuelle. Ce qui nous intéresse ici est d’avoir un message d’alerte à l’ouverture du fichier qui ne passe pas inaperçu.
Pour cela, nous allons faire appel au langage VBA. Veillez donc à afficher le menu Développeur comme nous l’avions vu au début du tutoriel sur le formulaire Excel.
Vous retrouverez le fichier utilisé dans ce tutoriel ainsi que le code VBA au format .txt au bas de l’article.
SOMMAIRE
Nommer les cellules du fichier Excel
Avant de saisir le code, il faut préparer notre fichier.
J’ai créé une formule SI (si la quantité est plus grande que le stock = 2 ; s’il est égal = 1, sinon = 0) et appliqué une mise en forme conditionnelle :
- Si le stock est plus grand que le stock d’alerte, afficher l’icône verte ;
- Si le stock est égal au stock d’alerte, afficher l’icône orange ;
- Si le stock est plus petit que le stock d’alerte, afficher l’icône rouge.
J’ai ensuite demandé à Excel de n’afficher que l’icône.
Maintenant, je vais nommer mes colonnes afin qu’il n’y ait pas de problème de nom dans le VBA par la suite. Je sélectionne la colonne Alerte sans son titre que je nomme Alerte_stock et je fais de même avec la colonne Date de réception de la commande que je nomme Alerte_commande. Les noms n’ont pas d’importance, vous pouvez les nommer comme vous le souhaitez du moment que vous savez à quoi ils correspondent. Par contre, il est primordial de ne pas sélectionner les titres des colonnes quand vous nommez vos plages, car la Valeur, que nous allons voir par la suite, indiquerait le titre de la colonne A.
Nous pouvons passer à la programmation.
Créer une alerte en VBA sur Excel
Cliquez sur Visual Basic dans le menu Développeur. Notre fichier ne comportant qu’un seul onglet et souhaitant que l’alerte se fasse à l’ouverture du fichier, nous allons placer le code dans ThisWorkbook en débutant par :
Private Sub Workbook_Open()
End Sub
On indique à quoi correspond le code en saisissant un commentaire commençant par une apostrophe ce qui le fera passer en vert (à placer entre Private Sub… et End Sub) :
‘Pour les stocks
On déclare ensuite notre variable, à savoir les cellules de la colonne Alerte, comme une plage de cellules. Vous pouvez mettre n’importe quel nom du moment qu’il ne contient pas d’espace :
Dim alertestock As Range
On crée une boucle avec For Each afin que l’action que nous programmons se répète autant de fois qu’il y a de ligne à la colonne Alerte de notre fichier actif :
For Each alertestock In ActiveSheet.Range("Alerte_stock")
Next
Je souhaite avoir un message d’alerte du type La référence Pain, céréales… doit être commandée. Il faut donc indiquer à Excel la valeur que je souhaite afficher dans mon message entre les lignes For Each… et Next :
Valeur = Cells(alertestock.Row, 1)
Ce code indique que le nom Valeur est égal à la cellule correspond à la ligne concernée de la colonne 1. C’est-à-dire que si Excel traite la cellule D2, il devra me renvoyer Riz. Le nom Valeur peut être remplacé par n’importe quel nom sans espace.
Nous indiquons ensuite une condition, car nous ne souhaitons avoir une alerte qu’à certaines conditions, à savoir quand l’alerte indique 0 (icône rouge).
Souhaitant que le message soit simplement un message d’alerte, on ne créera pas d’action si la réponse est Oui ou Non, on fermera juste la boîte de dialogue après le clic sur le bouton Ok.
Le code doit indiquer Si la colonne Alerte = 0 Alors afficher le message Sinon ne rien faire. Le message étant composé de texte et de références aux cellules, n’oubliez pas les guillemets et les esperluettes (&) et surtout de terminer la condition par End If.
vbCritical affichera une croix rouge dans le message avec le son correspondant et Quantité en stock insuffisante correspond au titre de la boîte de dialogue (à placer à la suite de Valeur) :
If alertestock = "0" Then
MsgBox "La référence " & Valeur & " doit être commandée.", vbCritical, "Quantité en stock insuffisante"
Else
End If
Pour le moment, j’aurais donc, à l’ouverture du fichier, un message pour chaque ligne contenant l’icône rouge. On fait la même chose pour un stock avec l’icône orange, c’est-à-dire dont le résultat est 1 en plaçant le code juste après le code précédent où le 0 a été remplacé par 1 et où le message est légèrement différent :
If alertestock = "1" Then
MsgBox "La référence " & Valeur & " devra bientôt être commandée.", vbExclamation, "Stock presque insuffisant"
Else
End If
Ici, j’ai utilisé vbExclamation pour l’apparition d’un triangle jaune. Les autres possibilités sont vbInformation (lettre i dans rond bleu) que nous allons utiliser juste après et vbQuestion (point d’interrogation dans rond bleu). Les sons sont différents selon l’icône choisie.
On peut déjà tester ce code en fermant notre fichier (sans oublier de l’enregistrer) puis en le rouvrant. Tous les messages s’affichent dans l’ordre du tableau.
Pour terminer, je souhaite être avertie lorsqu’une commande arrive le jour même. Pour cela, placez-vous entre le dernier Next et End Sub pour retranscrire le même type de condition que pour le stock, mais en l’adaptant. Cette fois la plage de cellule dans le VBA sera alertecommande et celle du fichier Alerte_commande. La condition devra être Si la date alertecommande est égale à aujourd’hui Alors afficher le message. Pour cela, la formule à utiliser est Date :
‘Pour les commandes
Dim alertecommande As Range
For Each alertecommande In ActiveSheet.Range("Alerte_commande")
Valeur = Cells(alertecommande.Row, 1)
If alertecommande = Date Then
MsgBox "La référence " & Valeur & " sera livrée aujourd’hui.", vbCritical, "Réception d’une commande"
Else
End If
Next
Pour être avertie de la livraison la veille (date du jour + 1), je place avant le dernier Next :
If alertecommande = Date + 1 Then
MsgBox "La référence " & Valeur & " sera livrée demain.", vbInformation, "Prochaine commande"
Else
End If
Si vous souhaitez d’abord être averti de la date de livraison, il suffit d’intervertir les 2 codes et, pour que ces alertes ne s’affichent que sur clic de bouton, créez un module (Insertion > Module) qui reprend tout ce code en remplaçant Private Sub Workbook_Open() par Sub Macro1() pour ensuite l’affecter à votre bouton.
Je peux maintenant refermer le fichier en l’enregistrant, je serais donc avertie à chaque fois que le stock d’alerte est atteint, ou presque atteint, mais aussi lorsqu’une livraison a lieu le jour même ou le suivant.
Article très intéressant… Justement, j’ai le projet de suivre une formation pour apprendre le VBA dans Word, Excel.
Merci et à bientôt.
Nadège
En effet Nadège, le VBA offre de grandes perspectives.
Merci beaucoup Lydia.
Bonjour Lydia,
Excellent petit programme, je pense qu’il va être utilisé avec des modifications selon les besoins.
Merci.
Bonjour,
J’ai appris quelque chose de très intéressant. Serait-il possible de modifier la forme ? C’est-à-dire que je gère bien plus de références que ça et j’ai transposé la solution à mon cas, mais du coup, je reçois plusieurs dizaines d’alertes à l’ouverture du fichier. Ne pourrait-on pas toutes les centraliser dans le même msgbox ? Ou en partie ?
Merci pour le travail et merci pour votre aide sur cette problématique.
Bonjour Romain,
Désolée, je suis encore débutante en VBA et je ne vois pas trop comment faudrait-il, avec mes connaissances actuelles, procéder pour faire cela.
Bonjour Lydia
J’ai fait comme sur la vidéo, mais il me dit :
« Erreur de compilation
Variable non définie »
Ceci pour
Valeur = Cells(alertestock.Row, 1)
Donc j’ai copié le code VBA texte et cela est toujours pareil ????
Je ne comprends plus rien.
Merci.
Bonjour Yves,
Avez-vous bien déclaré alertestock au préalable ?
Bonjour Lydia,
Voilà ce qu’il y a avant mon défaut :
Private Sub Workbook_Open()
'Pour les stocks
Dim alertestock As Range
For Each alertestock In ActiveSheet.Range("Alerte_stock")
Valeur = Cells(alertestock.Row, 1)
Merci.
Bonjour Yves,
La plage Alerte_stock est-elle bien nommée dans votre classeur ?
Bonjour Lydia,
Je souhaiterais utiliser ce code pour un tableau de suivi de réservations.
Lorsqu’une réservation a un statut « confirmé, attente de documents », 30 jours avant la date d’arrivée, je souhaiterais que cela crée une alerte en ouvrant le fichier Excel.
Cela fait donc appel à des statuts que j’ai renseignés via l’onglet Validation des données (donc les cellules faisant l’objet de l’alerte font l’objet d’un menu déroulant).
Pensez-vous que votre formule peut être adaptée ?
Merci beaucoup pour votre réponse.
Bonne journée !
Bonjour Matthieu,
Je n’ai pas testé, mais je pense que oui.
Merci pour votre réponse, je vais essayer.
Je ne sais pas si vous pouvez m’aider, je cherche à ajouter une variable au code. En plus de :
If alertestock = "0" Then
MsgBox "la réservation " & Valeur & " doit être vérifiée", vbCritical, "Alerte statut date"
Je voudrais rajouter un « And » pour indiquer une autre variable d’une autre colonne, je voudrais faire en sorte que l’alerte s’affiche si la valeur est « 0 » et que l’autre variable est en statut « en attente ».
Avez-vous une idée ? Si c’est trop long ou compliqué, je comprendrai, je vous remercie déjà pour votre réponse et pour ce super tuto.
Bonne journée.
Il vous suffit simplement de mettre :
If alertestock = "0" and Nomautrevariable = "en attente"
Merci pour votre réponse.
Il faut définir l’autre variable en amont comme pour alertestock :
For Each alertestock In ActiveSheet.Range("statut_dossier")
?Car le code n’est pas en rouge, mais il ne se passe plus rien.
Il y a sûrement quelque chose qui m’échappe dans tout ce charabia ^^
Pour le moment, j’ai ça :
Private Sub Workbook_Open()
'Alerte statut réservation
Dim AlerteDépart As Range
For Each alertestock In ActiveSheet.Range("statut_dossier")
Valeur = Cells(alertestock.Row, 1)
If alertestock = "Validé Confirmé Docs à Envoyer" And alerte_dossier = "0" Then
MsgBox "la réservation " & Valeur & " doit être vérifiée", vbCritical, "Alerte statut date"
Else
End If
Next
End Sub
Je pense qu’il faut que j’indique en amont à quoi correspond alerte_dossier, comme pour statut-dossier :
For Each alertestock In ActiveSheet.Range("statut_dossier")
?Le code n’est pas en rouge, mais il ne se passe rien.
Merci pour votre aide.
Alors déclarez-le comme pour alertestock.
Le mieux, quand on débute, est de faire étape par étape, c’est-à-dire, ici, en voyant si ce code fonctionne seul :
If alertestock = "Validé Confirmé Docs à Envoyer" And alerte_dossier = "0" Then
MsgBox "la réservation " & Valeur & " doit être vérifiée", vbCritical, "Alerte statut date"
Else
End If
Merci beaucoup pour votre aide, je suis parvenu au résultat souhaité.
Bonne journée à vous !
Merci pour votre retour et bonne journée.
Bonjour Lydia, je vous remercie pour ce tuto offert gracieusement.
Dans ce tuto, dans le VBA, vous nous donnez une formule au niveau de la date (message d’alerte par rapport à la date du jour) :
If alertedate = Date - 1 Then
MsgBox "Le locataire " & valeur & " change le montant de son loyer", vbCritical, "ATTENTION"
Else
End If
Mon programme n’est pas ouvert quotidiennement, donc si je rate la veille, mon message d’alerte ne s’affichera pas.
J’ai copié-collé la formule en changeant (-1) et mit (-2 -3 -4 etc.), mais cela fait buguer l’ouverture de mon fichier Excel.
Y a-t-il une formule plus simple pour y remédier du genre (< date) ?
Merci d’avance pour votre réponse qui pourrait me sauver la mise.
À bientôt pour vous lire.
Bonjour,
Si vous mettez,
If alertedate < Date Then
, cela fonctionne.Bonjour, merci de votre réponse.
J’ai malheureusement essayé cette formule. Le problème que j’ai rencontré c’est que, même où il n’y a pas de date, il m’avertit de quelque chose qui n’existe pas.
Du coup, je n’ai pas réussi à fermer mon message d’alerte, car il fait toutes les lignes du classeur. J’ai été obligé de fermer mon programme en le forçant.
Bonjour,
Alors dans ce cas, essayez :
If alertedate <> "" and alertedate < Date Then
ou
If Not IsNull(alertedate) And alertedate < Date Then
Mais si vous avez créé un tableau comme le mien, la plage nommée aurait dû s'arrêter à la fin du tableau et non de la feuille.
Bonjour bonjour,
Je viens d’essayer votre nouvelle formule et ça marche !!!
Je vous remercie encore une fois pour votre aide et votre patience envers moi.
Le seul bémol que j’ai rencontré, c’est que j’ai une attente de 30 secondes environ à chaque alerte !!! Quoi qu’il en soit, grâce à vous, j’ai réussi à faire ce que je souhaitais.
Merci encore et bonne continuation.
Permettez-moi de revenir vers un jour pour une nouvelle question ! (-_^)
Bonjour,
Essayez de mettre en début de procédure :
Application.ScreenUpdating = False
Et en fin de procédure :
Application.ScreenUpdating = True
Cela peut peut-être accélérer les choses.
Bonjour,
Ce n’est pas bon. Le programme bloque, mon sablier tourne en permanence et ne s’arrête plus.
Bonjour,
Ce n’est pas normal. Avez-vous bien mis le premier code juste après le Private sub et le second juste avant le End sub ?
Bonjour,
C’est génial. Mon tableau est parfait à présent.
Effectivement, je n’ai pas respecté la bonne ligne d’insertion du code.
Merci Lydia.
Bonjour et merci pour votre tuto, instructif et bien fait.
Je me permets de vous contacter pour un souci que je ne comprends pas. À l’ouverture du fichier, j’active les macros, les MsgBox s’affichent avec le texte choisi, mais & Valeur & ne se rempli pas.
J’ai donc un message qui ressemble à :
Les chèques pour doivent être envoyés.
Je n’ai pas de message d’erreur.
Je n’ai rien dit, tout fonctionne parfaitement. En regardant de nouveau le code et la position de mon tableau, j’ai vu que j’avais commencé en colonne C et non A comme vous, du coup, le Row 1 n’est pas la colonne du tableau, mais celle de la feuille. En remplaçant Row 1 par Row 3 la magie a opéré.
Bonjour,
Il y a quelque chose que je ne comprends pas.
J’ai mis la formule suivante :
=SI(AUJOURDHUI()>[@[date de paiement]];2;SI(AUJOURDHUI()=[@[date de paiement]];1;0))
La formule fonctionne puisque dans mes cellules j’ai bien 0, 1 ou 2, pourtant, j’ai le message suivant sur mes cellules :
« Formule de colonne calculée incohérente » et je ne vois pas où est le problème.
De plus, pour améliorer un peu le code, j’ai ajouté la ligne :
If alertesenvoi = "1" Then Beep
au-dessus de :
If alertesenvoi = "1" Then
MsgBox""
Afin d’avoir un bip à l’ouverture des messages d’alerte, cependant, je n’arrive pas à trouver et comprendre comment faire pour remplacer le bip par un fichier .wav personnel. Auriez-vous des pistes à me donner afin d’y parvenir ?
Bonjour Thierry,
Peut-être que, dans votre colonne, vous n’avez pas cette formule identique à chaque ligne, d’où ce message, mais si ça fonctionne comme vous le souhaitez, laissez-la ainsi.
Pour le son, voici un lien avec plusieurs méthodes.
Je n’avais pas eu le temps de venir plus tôt, merci pour votre réponse et pour le lien que vous m’avez fourni, je vais jeter un œil à tout ça.
J’aimerais bien appliquer cette méthode sur les dates d’échéance, mais je me suis perdue :/
Bonjour,
Merci beaucoup pour cette vidéo et ce tuto. Cependant, j’ai des questions.
J’aimerais faire un message d’alerte sur, par exemple, une fin de période pour me signaler que je dois rédiger le contrat.
Comment dois-je procéder, s’il te plaît, dans le message, au lieu de « alertestock », dois-je mettre « alerte fin de période » ? Je te remercie d’avance.
J’en ai vraiment besoin pour un projet, s’il te plaît, si tu pouvais m’aider.
Merci d’avance.
Bonjour,
Les noms de variables n’ont aucune importance, elles pourraient s’appeler A, B, C ou Toto, cela ne changerait rien. Il faut simplement éviter les accents, espaces et caractères spéciaux.
Merci, donc si j’ai bien compris, si je veux un message concernant ma fin de période d’essai, je refais comme toi, mais au lieu de « alerte fin de stock », je marque ce que je veux ?
Pourriez-vous m’indiquer un type de message à marquer pour bien avoir une alerte quand la période est presque voire déjà expirée ? Je vous remercie.
Je conseille toujours de d’abord refaire l’exercice comme moi, puis de vérifier si tout fonctionne et ensuite de le personnaliser pour son propre usage. Ça permet de voir à quelle étape on s’est trompé s’il y a une erreur.
Ok, merci beaucoup en tout cas pour tout.
Bonjour, merci pour ce tuto, très pratique et clair.
J’aimerais utiliser le code dans un fichier qui comporte plusieurs feuilles, malheureusement, le code ne fonctionne que si, à l’ouverture, je suis sur la bonne feuille.
Auriez-vous une petite solution ?
Par avance merci.
Bonjour,
Dans ce cas, il suffit de mettre en début de procédure :
Worksheets("Nom de l'onglet").Select
Bonjour,
Merci, ça fonctionne parfaitement.
Bonjour,
Je suis novice sur Excel.
Comment fait-on dans la formule SI pour avoir un texte à la place de la cellule ?
Je n’arrive pas à faire la première formule.
(Exemple : quantité stockée à la place de B2)
Merci.
Bonjour Anissa,
Je ne comprends pas votre question.
Bonjour,
Je n’arrive pas à faire ma 1ère formule « si ».
Je suis bloquée, car lorsque je sélectionne ma cellule, il est écrit « D3 » par exemple et non le nom de la cellule comme « Quantité stockée ».
Je ne sais pas comment renommer la cellule.
Deuxième question :
Comment puis-je faire ma macro pour 4 catégories différentes ?
Est-il possible que je vous envoie mon Excel pour mieux comprendre ?
Je souhaite créer une alerte, lorsque la date de mes différents contrôles techniques approche 30 jours avant la date limite et un autre message lorsque la date est dépassée.
Merci beaucoup.
Bonjour,
C’est de la formule pour la mise en forme conditionnelle dont vous parlez ? Car je ne vois pas le rapport avec le nom des cellules.
Pour les différentes catégories, il faut créer une plage pour chacune et une macro pour chacune.
Bonsoir Lydia,
J’ai un problème, je n’arrive pas à rentrer la formule :
=SI([@[Quantité stockée]]>[@[Stock d'alerte]];2;SI[@[Quantité stockée]]=[@[Stock d'alerte]];&;0])
dans la case alerte.Le message suivant apparaît :
La syntaxe de ce nom n’est pas correcte.
Vérifiez que le nom :
– commence par une lettre ou un trait de soulignement (_) ;
– ne contient pas d’espace ou de caractère non autorisé ;
– n’entre pas en conflit avec un nom existant dans le classeur.
Pour les noms, j’ai juste rentré les noms de colonnes Date de réception et Quantité stockée, pour le reste, je ne vois pas trop.
Merci d’avance pour votre réponse.
Bonjour Bernard,
Si vous avez bien transformé votre tableau en plage et que les colonnes ont été nommées automatiquement comme moi, Stock d’alerte est écrit
Stock d''alerte
et il manque une parenthèse :=SI([@[Quantité stockée]]>[@[Stock d''alerte]];2;SI([@[Quantité stockée]]=[@[Stock d''alerte]];1;0))
Bonjour Lydia,
J’ai transformé mon tableau en plage, mais cela n’a rien changé. J’ai toujours le même message qui s’affiche.
Les premiers termes dans les crochets [@[Quantité…] sont surlignés en gris quand je valide OK dans la message box qui s’affiche.
Merci d’avance pour votre aide.
Bonjour Bernard,
C’est forcément un problème de nom de colonne.
Bonsoir Lydia,
Désolé de vous répondre si tard, mais je modifiais une autre appli.
Je n’ai pas trouvé la solution, mais en utilisant la mise en forme conditionnelle sur la colonne quantité stockée, cela fonctionne et me convient.
Encore merci pour votre aide.
Amicalement.
Bernard
Bonjour Lydia,
Merci beaucoup pour cet exemple. J’ai réussi à faire ce que je voulais. Maintenant, je voudrais pousser un peu plus loin. Lors de l’exécution du fichier, Excel me trouve, par exemple, 10 éléments qui, à chaque fois, fait apparaître la boîte de dialogue. J’aimerais qu’au lieu que la boîte apparaisse à chaque événement et que je sois obligé de faire « ok » à chaque fois, que la liste de mes 10 éléments trouvés apparaisse dans la boîte de dialogue que j’aurais à fermer qu’une seule fois. Est-ce possible ? Merci encore 🙂
Bonjour Jérôme,
J’ai déjà essayé de chercher une solution à ce problème à l’époque du tutoriel, mais sans succès.
Bonjour Lydia.
Tout d’abord, je vous remercie pour ce site qui est vraiment une vraie mine d’information et qui est très bien illustré. Et surtout merci pour le temps que vous « nous » consacrez.
Je souhaiterais savoir si vous savez comment faire pour que cette alerte, plutôt que de s’afficher sur la page Excel à son ouverture, soit envoyée par e-mail à une liste de destinataires.
Je vous remercie par avance.
Bonjour Sébastien,
Il faudrait programmer l’envoi de l’e-mail à la place de la msgbox en indiquant chaque adresse e-mail. Toutefois, il faudrait peut-être mettre une colonne supplémentaire dans le fichier pour indiquer que l’e-mail a été envoyé pour ne pas l’envoyer plusieurs fois si cela a déjà été fait et donc mettre en critère la date ET l’info concernant l’envoi effectué ou non.
Bonjour,
Comment peut-on faire, dans un classeur avec plusieurs feuillets dans lequel il y a plusieurs tableaux, pour avoir dans le message d’alerte le nom de chaque nom de feuillet et aussi le titre de chaque tableau ou une erreur est détectée ?
Bonjour,
Il faut créer une alerte pour chaque tableau avec, en début de procédure,
Worksheets("Nomdelonglet").Activate
et indiquer dans le message qu’il s’agit du tableau X ou Y puisque la plage nommée ne concernerait qu’un seul tableau.Merci de votre réponse.
Je me suis lancée dans Excel pour une future embauche. J’ai découvert hier la procédure à suivre pour créer une alerte.
On me demande donc de créer une alerte comme expliquée dans mon message précédent.
Il va me falloir des explications les plus détaillées possible.
Donc j’ai créé le classeur avec 24 onglets qui contiennent chacun de 3 à 5 tableaux.
Les tableaux commencent tous à partir de la même cellule (D10), ils ont les mêmes caractéristiques 9 colonnes et 40 lignes, par contre, ils n’ont pas tous le même titre.
Puisqu’il est question d’heure, je les ai converties en décimale pour faire une alerte visuelle et me servir des données pour créer l’alerte.
Voilà ce que j’ai réussi à faire :
Private Sub Workbook_Open()
Dim ALERTEHEURE As Range
For Each ALERTEHEURE In ActiveSheet.Range("ALERTE")
Next
If ALERTE <= "0" Then
MsgBox "LA TOTALITES DES HEURES EPUISEES", vbCritical
Else
End If
If ALERTE <= "7" Then
MsgBox "HEURES BIENTOT EPUISEES", vbExclamation
Else
End If
End Sub
Si vous pouviez me mettre sur la voie pour que je puisse rendre ce travail pour dimanche.
For each
n’est jamais suivi immédiatement parNext
, carFor each
signifie pour chaque X…, ensuite il y a ce qui doit être fait et enfinNext
pour passer au X suivant.De plus, vous n’indiquez pas ce qu’est ALERTE donc Excel ne peut le savoir.
Vous pouviez partir de mon exemple en changeant juste la plage nommée et, une fois que vous êtes sûre que ça fonctionne, changer les noms.
Bonjour Lydia,
Tout d’abord, je vous remercie grandement pour cet excellent site internet très bien expliqué.
J’ai essayé de m’inspirer fortement de votre code, mais je n’obtiens pas le résultat escompté.
Pourriez-vous m’aider s’il vous plaît ?
Je cherche à afficher les anniversaires de personne ayant leur anniversaire dans la semaine.
Voici mon code, le message s’affiche correctement, mais il ne récupère pas le nom et le prénom de la personne situés en colonne B et C.
Private Sub Workbook_Open()
'Activation de la feuille "Contacts"
Sheets("Contacts").Activate
'Sélection de la plage de cellule jusque K1005 (!!!!!!CHANGER SI TABLEAU AUGMENTE!!!!!!!!!)
Range("K5:K1005").Select
Dim alerteanniversaire As Range
For Each alerteanniversaire In ActiveSheet.Range("K5:K1005")
nompersonne = Cells(alerteanniversaire.Row, 2)
prenompersonne = Cells(alerteanniversaire.Row, 3)
If alerteanniversaire = Date Then
MsgBox "C'est l'anniversaire de " & nompersonne & " aujourd'hui", vbCritical, "Anniversaire du Jour"
Else
End If
'If alerteanniversaire = Date - 1 Then
'MsgBox "Dans 1 Jour c'est l'anniversaire de " & nompersonne & " " & prenompersonne & "", vbInformation, "Anniversaire de la Semaine"
'Else
'End If
'Activation de la feuille "Home"
Sheets("Home").Activate
Next
End Sub
Peut-être serait-il plus clair avec un print screen, mais je ne vois nulle part où je peux laisser un attaché.
Si vous le souhaitez, envoyez-moi un e-mail et je ferai quelques print screen.
Bien à vous.
Anthony
Bonjour Anthony,
Chez moi, votre code fonctionne. Toutefois, vous avez oublié le prénom :
MsgBox "C'est l'anniversaire de " & nompersonne & " " & prenompersonne & " aujourd'hui", vbCritical, "Anniversaire du Jour"
Il vaudrait mieux nommer votre plage, ce qui éviterait à la macro d’aller vérifier toutes les lignes jusqu’à la 1005e en la rendant plus lente.
Bonjour Lydia,
J’ai essayé d’appliquer ce code sur 2 feuilles et 2 tableaux ayant pour objectif d’avoir les alertes à l’ouverture du fichier.
Cependant, avec ce code, une erreur de compilation apparaît à chaque fois.
Private Sub Workbook_open()
Sheets("Feuil5").Activate
'Pour les alertes à l'ouverture d'Excel
Dim alerteicone As Range
For Each alerteicone In ActiveSheet.Range("Alerte_icone")
Valeur = Cells(alerteicone.Row, 2)
If alerteicone = "2" Then
MsgBox " L'analyse de l'accident de " & Valeur & " doit être présenté aujourd'hui en téléconférence.", vbExclamation, "Présentation téléconférence"
Else
End If
If alerteicone = "1" Then
MsgBox "L'analyse de l'accident de " & Valeur & " devra être présentée bientôt en téléconférence.", vbInformation, "Présentation téléconférence"
Else
End If
Next
End Sub
Private Sub Workbook_open()
Sheets("ES ESR").Activate
'Pour les alertes à l'ouverture d'Excel
Dim rappeles As Range
For Each rappeles In ActiveSheet.Range("Rappel_ES")
Valeur = Cells(rappeles.Row, 1)
If rappeles = "1" Then
MsgBox "L'analyse de l’Évènement sécurité du " & Valeur & " à eu lieu il y a environ 15 jours.", vbExclamation, "Alerte"
Else
End If
Next
End Sub
Merci beaucoup !
Bonjour Laurent,
Sur quelle ligne s’arrête le code (ligne jaune) ?
Bonjour,
J’ai aimé votre vidéo et une idée m’est venue d’appliquer ces connaissances sur ma macro. Mais le problème est, qu’avant, j’avais déjà une liste dans gestion de noms et un formulaire de saisie. C’est-à-dire que si j’essaye d’appliquer un autre nom dans le formulaire pour, à la fin, afficher le message, ça bogue. Si vous avez un autre moyen, vous pouvez m’aider. Cette liste, je l’avais mise dans Rowsource.
Bonjour,
Je ne suis pas sûre de comprendre, mais si vous voulez faire référence à une liste de nom, c’est
Nomdelalistedéroulante.List = Range("Nomdéfini").Value
.Bonjour,
J’essaie de faire la formule sur un fichier, mais ça ne fonctionne pas chez moi :
Private Sub Workbook_Open()
Dim Aletrestock As Range
For Each Alertestock In ActiveSheet.Range("usure")
valeur = Cells(Alertestock.Row, 5)
If Alertestock = "X" Then
MsgBox "dégré d'usure" & valeur & "on doit agir ", vbCritical, "usure elevée"
Else
End If
Next
End Sub
Bonjour,
Quel est le message d’erreur et sur quoi s’arrête le code ? S’il ne s’arrête pas, c’est un problème de nom de plage ou de numéro de colonne.
Salut Lydia,
Je veux que mon code VBA affiche les alertes dans une liste à l’ouverture de fichier.xslt.
Bonjour Hakim,
Si vous voulez dire mettre toutes les alertes dans une seule boîte de dialogue, c’est l’objet d’une future formation.
Bonjour,
Je voudrais mettre deux conditions à ma msgbox.
Mes conditions ne viennent pas de la même colonne, j’ai beau redéclarer ma deuxième colonne comme la première, ça ne marche pas.
Comment dois-je faire ?
Merci d’avance.
Bonjour,
Pouvez-vous poster votre code complet ?
Ma deuxième colonne est envoi_verif.
Je veux que si la cellule de cette colonne est vide, alors le message s’affiche, sinon non.
J’ai tenté de déclarer ma colonne comme Alerte_verif, mais ça ne marche pas.
Voilà ce que j’ai écrit :
Dim alerteverif As Range
ActiveSheet.Name = "Suivi_des_moyens"
For Each alerteverif In ActiveSheet.Range("Alerte_verif")
valeur = Cells(alerteverif.Row, 1)
If alerteverif = "0" And envoi_verif = " " Then
MSG = MSG & "Le moyen " & valeur & " doit être vérifié " & vbLf
Else
End If
If alerteverif = "1" Then
MSG1 = MSG1 & "Le moyen" & valeur & "devra bientôt être vérifié" & vbLf
Else
End If
Next
MsgBox MSG, vbCritical, "Date de vérification dépassée"
MsgBox MSG1, vbExclamation, "Date de vérification du mois en cours"
Ne serait-ce pas à cause de l’espace entre les guillemets ? Votre condition est si alerteverif contient 0 et que envoi_verif contient une espace.
Bonsoir,
J’ai suivi assidument votre vidéo et j’ai commencé dans mon tableau.
Première information, je suis sur Mac et en Excel 365.
Voici mon code :
Private Sub Worbook_Open()
'Pour les relances investigations
Dim AlerteInvestigation As Range
For Each AlerteInvestigation In ActiveSheet.Range("Alerte_Investigation")
Valeur = Cells(AlerteInvestigation.Row, 9)
If AlerteInvestigation = Date - 20 Then
MsgBox "La référence " & Valeur & " doit être relancé ce jour.", vbCritical, "Relance date d'investigation"
Else
End If
Next
End Sub
Mon fichier contient plusieurs feuilles.
Quand je lance le fichier, j’ai la boîte de dialogue « Activer les macros » qui s’ouvre, je valide.
Le fichier se lance et pas la macro.
J’ai testé la macro dans Visual Basic et il fonctionne, je ne comprends pas, surement mis au mauvais endroit.
Je me suis abonné à votre newsletter, car très intéressé par Excel.
J’aurai une autre question après votre retour.
En vous remerciant par avance pour votre réponse.
Bonjour,
Aujourd’hui, est-ce qu’une valeur devrait être retournée ? Car si aucune date ne correspond à la date d’il y a 20 jours, rien ne sera retourné.
Je viens de tester la macro de mon tuto sur Mac et ça fonctionne donc ce n’est pas une histoire de syntaxe mal interprétée par Mac.
Ensuite, avez-vous bien défini le nom Alerte_Investigation ?
Bonjour Lydia,
Oui, j’ai mis plusieurs lignes pour voir tous les jours si cela fonctionne et rien.
Je viens de vérifier la formule dans VBA et il me sort bien la bonne ligne à rappeler.
Le nom Alerte_Investigation : aucune erreur de syntaxe et c’est la bonne colonne assignée.
Comment puis-je vous envoyer une photo de la page VBA ?
Aujourd’hui, le code se trouve dans la feuille ThisWorkbook.
Bonjour Christophe,
Le plus simple serait d’héberger votre fichier et de publier le lien ici.
Bonsoir Lydia,
Mon fichier étant sensible, je vois ce que je peux extraire et vous le partage demain.
Bonne soirée.
Bonjour Lydia,
Veuillez trouver le lien du fichier sur lequel j’ai le souci : https://drive.google.com/open?id=1bi1H7Y7zfRvdWqWa-tp9_cLcn4f6IGAG
Je viens de le rouvrir et la colonne AK référencée en Alerte_Investigation ne ressort pas en alerte.
J’ai déjà une alerte visuelle des dates à relancer dans les colonnes J, K, L, M, N, O, P et Q avec des dates différentes.
Au vu du grand nombre de lignes, cela ne fonctionne pas bien d’où l’alerte à l’ouverture du fichier.
En vous en remerciant énormément par avance.
Bonjour Christophe,
C’est
Workbook_Open
et nonWorbook_Open
.Mieux vaut également écrire
Next AlerteInvestigation
et pas justeNext
et déclarer les variables (Valeur).Bonjour Lydia,
Merci pour ce tutoriel !
J’ai un problème avec les vbCritical et vbInformation.
Ces 2 ne fonctionnent pas. Ou plutôt :
– Lorsque je mets vbCritical : c’est un triangle jaune avec point d’exclamation qui apparaît.
– Lorsque je mets vbInformation ou vbExclamation : c’est l’icône d’Excel qui apparaît, je n’ai pas la petite croix rouge ou le picto Information…
Savez-vous d’où cela vient s’il vous plaît ?
Merci pour votre retour,
Bonne journée.
Bonjour Gwendolyne,
Êtes-vous sur Mac ?