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 Sub

Dans 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
Next

Bonjour 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
Next

Pour 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...

Rechercher des sujets similaires à "selectionner date proche superieur aujourd hui"