Extraction en fonction d'une période de date
Bonjour le forum,
J'ai une macro (bouton "visualisation des bons de visite du jour" dans l'onglet "Récapitulatif) qui fonctionne très bien pour m'extraire les bons de visite du jour mais je ne sais pas comment la modifier pour qu'elle m'extrait également les bons de visite qui correspondent au jour présent lorsque que la date de début et de fin correspond à une période de plus d'un jour.
Je m'explique par exemple pour essayer d'être plus clair
Copie de la macro complète :
Sub bon_de_visite_du_jour()
Dim Inc As Integer, DLig As Long, Lig As Long, Wst As Worksheet
Dim LaDate As Date, Msg As String, sTmp(3) As String
Dim sForm As String
'Macro qui s'exécute automatiquement à l'ouverture du fichier pour agrandir la fen^tre et faire un message d'accueil
Application.ScreenUpdating = False
Application.WindowState = xlMaximized
' Définir la feuille à vérifier
Set Wst = ThisWorkbook.Worksheets("Récapitulatif")
' Début du message
sTmp(1) = "Attention #1 bon#2 de visite#2 concernant :" & vbCr
sTmp(2) = "#3 une date de visite qui commence ce jour le " & Date
' Incrément des formation
Inc = 0
' Dernière ligne de la feuille
DLig = Wst.Range("B" & Application.Rows.count).End(xlUp).Row
' Vérification des réservations
For Lig = 5 To DLig
' Récupérer la date si existe
If Wst.Range("C" & Lig).Value <> "" Then LaDate = Wst.Range("C" & Lig).Value
' Ecart avec la date actuelle < 30 jours
If DateDiff("d", Date, LaDate) = 0 Then 'And DateDiff("d", Date, LaDate) <= 1 Then
' Incrémenter le nombre de formations en alerte
Inc = Inc + 1
' Définir le message
'sForm = sForm & Wst.Range("B" & Lig).Value & " - n° réservation : " & Lig - 1 & Chr(10)
sForm = sForm & Wst.Range("D" & Lig).Value & " pour " & Wst.Range("H" & Lig).Value & " (n° " & Wst.Range("A" & Lig).Value & ")" & Chr(10)
End If
'End If
Next Lig
' Si aucune réservation ne correspond
If Inc = 0 Then
MsgBox ("Pas de bon de visite aujourd'hui")
End If
If Inc = 0 Then Exit Sub
' Créer le message
Msg = Replace(Replace(sTmp(1), "#1", IIf(Inc > 1, "les", "la")), "#2", IIf(Inc > 1, "s", ""))
Msg = Msg & vbCr & sForm
Msg = Msg & vbCr & vbCr & Replace(sTmp(2), "#3", IIf(Inc > 1, "ont", "a"))
' Afficher le message
MsgBox Msg, vbInformation, "ATTENTION...bon de visite du jour..."
' Effacer les varaibles objet
Set Wst = Nothing
Application.ScreenUpdating = True
End SubC'est normal que je n'ai que le bon n°1 qui est extrait car le test ce fait sur le jour présent :
' Vérification des réservations
For Lig = 5 To DLig
' Récupérer la date si existe
If Wst.Range("C" & Lig).Value <> "" Then LaDate = Wst.Range("C" & Lig).Value
' Ecart avec la date actuelle < 30 jours
If DateDiff("d", Date, LaDate) = 0 Then 'And DateDiff("d", Date, LaDate) <= 1 Then
' Incrémenter le nombre de formations en alerte
Inc = Inc + 1mais je ne sais pas l'adapter pour une période.
Est-ce qu'il y aurait une personne pour me dire ce que je dois faire ? Merci
Cordialement.
Bonjour,
Attention, cela ne marche pas si la date de fin est antérieure à la date de début comme dans votre exemple.
Option Explicit
Function AvecDateDuJour(ByVal DateDebut As Date, ByVal DateFin As Date) As Boolean
Dim DateEnCours As Date
AvecDateDuJour = False
For DateEnCours = DateDebut To DateFin
If DateEnCours = Date Then
AvecDateDuJour = True
Exit Function
End If
Next DateEnCours
End Function
Sub Bon_de_visite_du_jour2()
Dim Inc As Integer
Dim Msg As String, sTmp(3) As String, sForm As String
Dim I As Long
Dim AireDebut As Range, AireFin As Range, AireBon As Range, AireTel As Range
Set AireDebut = Range("T_recap[Date de la visite]")
Set AireFin = Range("T_recap[Date fin de visite]")
Set AireBon = Range("T_recap[N° bon de visite]")
Set AireTel = Range("T_recap[Tél.]")
Inc = 0
For I = 1 To AireDebut.Count
If AvecDateDuJour(CDate(AireDebut(I)), CDate(AireFin(I))) = True Then
sForm = sForm & AireFin(I) & " pour " & AireTel(I) & " (n° " & AireBon(I) & ")" & Chr(10)
Inc = Inc + 1
End If
Next I
' Si aucune réservation ne correspond
If Inc = 0 Then
MsgBox "Pas de bon de visite aujourd'hui !"
GoTo Fin
End If
' Début du message
sTmp(1) = "Attention #1 bon#2 de visite#2 concernant :" & vbCr
sTmp(2) = "#3 une date de visite aujourd'hui " & Date
' Créer le message
Msg = Replace(Replace(sTmp(1), "#1", IIf(Inc > 1, "les", "la")), "#2", IIf(Inc > 1, "s", ""))
Msg = Msg & vbCr & sForm
Msg = Msg & vbCr & vbCr & Replace(sTmp(2), "#3", IIf(Inc > 1, "ont", "a"))
' Afficher le message
MsgBox Msg, vbInformation, "ATTENTION...bon de visite du jour..."
GoTo Fin
Fin:
' Effacer les variables objet
Set AireDebut = Nothing: Set AireFin = Nothing: Set AireBon = Nothing: Set AireTel = Nothing
End SubOuah Eric Kergresse super ta macro
Function AvecDateDuJour(ByVal DateDebut As Date, ByVal DateFin As Date) As Boolean
Dim DateEnCours As Date
AvecDateDuJour = False
For DateEnCours = DateDebut To DateFin
If DateEnCours = Date Then
AvecDateDuJour = True
Exit Function
End If
Next DateEnCours
End FunctionSujet mis en résolu et merci encore pour ta macro qui me donne le résultat recherché.
Bonjour,
Cette fonction est utilisable comme n'importe quelle fonction Excel dans ton tableau.
Le principe est relativement simple, on lui donne les paramètres d'entrée entre parenthèses et on lui indique le type de sortie ici booléen. On boucle du début à la fin les dates en entrée dans une variable date et si celle-ci correspond à la date du jour (Date), on change la valeur de la fonction et on quitte la boucle.
Merci Éric pour cet éclaircissement 🙂