Selectionner date la plus proche au supérieur de la date d'aujourd'hui
Bonjour le forum !
Après moulte recherche et après avoir passé une bonne partie de ma matinée sur ce problème je m'en remets à vous.
J'ai consulté un forum il y a peu pour mettre au point un planning capable d'envoyer des mails contenant les maintenances à prévoir sur différentes échelles temporelles.
J'ai donc récupérer un code fournis par un membre du forum qui marche à la perfection. Etant débutant dans excel et en VBA, j'ai essayer de "recuisiner" à ma manière le code initial afin de l'adapter à plusieurs cas de figure.
Le code initial prévenait d'une maintenance à aujourd'hui + 14 jours (soit dans 2 semaines). J'ai réussi à le modifier pour faire en sorte qu'il me donne les maintenances du mois suivant entier, des deux prochaines semaines, et de la prochaine semaine.
J'aimerai maintenant ajouté une dernière fonctionnalité qui est de trouver directement quelle sera la prochaine machine en maintenance et uniquement la suivante.
Sub Envoyer_mail2()
Dim oOutlook As Object ' Objet application Outlook
Dim MaDate As Date
Dim c As Range, Plage As Range
Dim Machines As String
Set Plage = ThisWorkbook.Sheets("Planning maintenance préventive").Range("D5:D56")
MaDate = Date
On Error GoTo FIN
' Compter combien de date = limite dans la plage
' pour envoyer l'email ou alerter l'utilisateur
If Application.CountIf(Plage, MaDate) > 0 Then
'
' Parcourir les cellules de la plage
' à la recherche des machines qui corresponde à la date de maintenance prévue
' en construire une liste textuelle pour le corps du message
For Each c In Plage
' le nom de la machine se trouve à 2 colonnes à gauche de la colonne de date
' lf = saut de ligne
If c.Value2 >= MaDate Then Machines = Machines & vbLf & c.Offset(, -2)
Next
' Création de l'application Outlook
Set oOutlook = CreateObject("Outlook.Application") 'création d'un objet outlook
' Travailler sur un objet email créée
With oOutlook.CreateItem(olMailItem)
.Subject = "Alerte maintenance préventive"
.To = Range("E3") ' Destinataire
.Body = "Liste des machines dont la maintenance est prévue le " & _
" : " & vbLf & Machines
.Display 'afficher le mail avant de l'envoyer ou send pour envoyer
End With
Else
MsgBox "Opération annulée : Aucune tâche n'a été trouvée!", vbInformation, "Envoi mail de rappel"
End If
FIN:
'
' Si une erreur a été rencontrée, prévenir l'utilisateur
If Err.Number <> 0 Then
MsgBox "Opération échouée en raison de l'erreur suivante :" & vbCrLf & vbCrLf & _
"Numéro de l'erreur: " & Err.Number & vbCrLf & vbCrLf & "Description: " & Err.Description, _
vbExclamation, "Envoi mail de rappel de tache"
End If
'
On Error GoTo 0
'
' Toujours détruire correctement les variables objets pour éviter les fuites de mémoire
Set oOutlook = Nothing
End SubDans ce code-ci j'arrive à faire apparaître toutes les machines en maintenances en se fixant sur le critère >=MaDate (date du jour), sauf qu'avec le next il continue de me prendre des valeurs et ne s'arrête pas à une seule. De plus il parcourt ma plage de date de haut en bas et même si il s'était arrêter sur la première valeur >=MaDate il y a de forte chance pour que ce ne soit pas celle qui soit le plus proche de la date du jour.
Je ne sais pas si j'ai était clair, je reste à votre disposition pour toutes informations jugées nécessaires.
Ci-joint vous pouvez retrouver le excel en question.
Dans l'attente de vous lire,
Cordialement,
Babacool22
Bonjour,
A tester :
Dim MinDate As Long
For Each c In Plage
'le nom de la machine se trouve à 2 colonnes à gauche de la colonne de date
If c.Value2 >= MaDate Then
If MinDate = 0 Or c.Value2 < MinDate Then
MinDate = c.Value2
Machines = c.Offset(, -2)
End If
End If
NextBonjour Pedro22,
Tout marche comme sur des roulettes.
Je ne sais comment vous remerciez pour votre aide précieuse ainsi que votre rapidité.
Mille merci !!!
(Pourriez-vous briévement m'expliquer les quelques lignes de code, If MinDate = 0 Or c.Value2 < MinDate Then)
MinDate = c.Value2
Machines = c.Offset(, -2)
Ce que je comprend de ces lignes : Si MinDate est égale à c.value2 on récolte l'information pour savoir à quel machine MinDate correspond. En revanche j'ai du mal avec la variable MinDate, c'est la date qui correspond à la date la plus proche de aujourd'hui mais c'est le développement après que je ne comprend pas " If MinDate = 0 or c.value2 < MinDate Then "
Cordialement,
Babacool22
L'idée est d'utiliser une variable MinDate dans laquelle on stocke la date correspondant à la dernière machine renseignée. Lors du 1er enregistrement d'une machine, il n'y a pas encore de date renseignée, donc MinDate = 0. Ensuite, dès lors que l'on rencontre une date de maintenance inférieure à la dernière enregistrée (en clair que la maintenance de la machine arrive plus tôt), on écrase le précédent enregistrement (mise à jour de MinDate et de Machines).
Le code commenté :
Dim MinDate As Long 'Variable de type nombre entier
For Each c In Plage 'Boucle sur les cellules de la plage
'le nom de la machine se trouve à 2 colonnes à gauche de la colonne de date
If c.Value2 >= MaDate Then 'Condition de date mini de maintenance
If MinDate = 0 Or c.Value2 < MinDate Then 'Si MinDate est vide ou que la date de la cellule est antérieure à la dernière MinDate alors...
MinDate = c.Value2 'On actualise MinDate
Machines = c.Offset(, -2) 'On actualise la machine
End If
End If
NextPour mieux comprendre, je vous invite à exécuter le code en mode pas à pas (touche F8) pour visualiser le contenu des variables.
Re,
D'accord !!! Tout est plus clair maintenant !!
Et dire qu'il vous a fallût 5min pour faire ça.... Je me demande parfois où est-ce que vous stockez toutes ces informations....
Encore une fois mille merci pour cette aide si précieuse.
En plus de ne plus être bloqué vous m'avez appris des choses.
Cordialement,
Babacool22
Merci du retour !
C'est la force du forum, après avoir traité pas mal de sujets on acquière quelques automatismes sur la manière la plus rapide de traiter une problématique. Quoique ce n'est pas toujours aussi rapide...