Microsoft 365 Modifier formule pour simplifier un calcule de date et comptage categories

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

teckmicro03

XLDnaute Nouveau
Bonjour, je voudrais automatiser le calcul de date de mes forfaits.
FORFAIT possible = 7 jours - 14 jours - 21 jours - 1 mois - 2 mois - 3 mois

Je ne voudrais plus taper les dates des forfaits, je voudrais sélectionner dans une liste déroulante ou autre manière les forfaits correspondants et que les dates s'affichent automatiquement
Si forfait 7 jours : 20/02/25 au 26/02/25 …

Et je voudrais calculer le comptage des catégories vendues. Voir Tableau dans le fichier.

Merci de prendre du temps pour moi.
Bonne journée
Cordialement

Christophe
 

Pièces jointes

Solution
Bonjour Teckmicro03, Nathe,
Comme j'avais un peu de temps, je me permets de vous proposer le fichier ci-joint.
Nathe a raison : il faut tout reprendre !
Mais, si je peux me permettre, il faudrait que vous posiez bien vos besoins, ce qui évitera d'avoir à recommencer à chaque fois.
Le fichier que je vous propose est une base sur laquelle vous pourriez partir.
Dans le tableau, il y a certaines colonnes qui ne me paraissent pas nécessaires.
Le nombre de Forfaits "Valide" est une donnée qui pourrait apparaître sur une feuille "Tableau de Bord" qui serait gérée par TCD (Voir Feuille "Accueil). Bien d'autres infos pourrait s'afficher (le nombre fois que sort chaque véhicule...)
Bonjour , je comprend j'aurais du l'explique avant pour...
Bonjour,
A essayer
Nathe
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim jours As Integer
    Dim i As Integer
    
    Set rng = Me.Range("I9:I100") ' Modifiez la plage si nécessaire

    If Not Intersect(Target, rng) Is Nothing Then
        For i = 1 To rng.Cells.Count
            If Target.Cells(i).Value <> "" Then
                Select Case Target.Cells(i).Value
                    Case "7 jours": jours = 7
                    Case "14 jours": jours = 14
                    Case "21 jours": jours = 21
                    Case "1 mois": jours = 30
                    Case "2 mois": jours = 60
                    Case "3 mois": jours = 90
                    Case Else: jours = 0 ' Pour gérer les valeurs non reconnues
                End Select
                
                ' Remplir J et K si elles sont vides
                If jours > 0 Then
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "J").Value) Then
                        Me.Cells(Target.Cells(i).Row, "J").Value = Date
                    End If
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "K").Value) Then
                        Me.Cells(Target.Cells(i).Row, "K").Value = Date + jours
                    End If
                End If
            End If
        Next i
    End If
End Sub
test1.gif
 

Pièces jointes

Bonjour,
A essayer
Nathe
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim jours As Integer
    Dim i As Integer
   
    Set rng = Me.Range("I9:I100") ' Modifiez la plage si nécessaire

    If Not Intersect(Target, rng) Is Nothing Then
        For i = 1 To rng.Cells.Count
            If Target.Cells(i).Value <> "" Then
                Select Case Target.Cells(i).Value
                    Case "7 jours": jours = 7
                    Case "14 jours": jours = 14
                    Case "21 jours": jours = 21
                    Case "1 mois": jours = 30
                    Case "2 mois": jours = 60
                    Case "3 mois": jours = 90
                    Case Else: jours = 0 ' Pour gérer les valeurs non reconnues
                End Select
               
                ' Remplir J et K si elles sont vides
                If jours > 0 Then
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "J").Value) Then
                        Me.Cells(Target.Cells(i).Row, "J").Value = Date
                    End If
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "K").Value) Then
                        Me.Cells(Target.Cells(i).Row, "K").Value = Date + jours
                    End If
                End If
            End If
        Next i
    End If
End Sub
Regarde la pièce jointe 1213360
 
Bonjour,
A essayer
Nathe
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim jours As Integer
    Dim i As Integer
   
    Set rng = Me.Range("I9:I100") ' Modifiez la plage si nécessaire

    If Not Intersect(Target, rng) Is Nothing Then
        For i = 1 To rng.Cells.Count
            If Target.Cells(i).Value <> "" Then
                Select Case Target.Cells(i).Value
                    Case "7 jours": jours = 7
                    Case "14 jours": jours = 14
                    Case "21 jours": jours = 21
                    Case "1 mois": jours = 30
                    Case "2 mois": jours = 60
                    Case "3 mois": jours = 90
                    Case Else: jours = 0 ' Pour gérer les valeurs non reconnues
                End Select
               
                ' Remplir J et K si elles sont vides
                If jours > 0 Then
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "J").Value) Then
                        Me.Cells(Target.Cells(i).Row, "J").Value = Date
                    End If
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "K").Value) Then
                        Me.Cells(Target.Cells(i).Row, "K").Value = Date + jours
                    End If
                End If
            End If
        Next i
    End If
End Sub
Regarde la pièce jointe 1213360
 
Je pense avoir compris:
A tester

test1.gif


Rajout de :

Code:
Sub CompterOccurrences()
    Dim ws As Worksheet
    Dim countHebdo As Long
    Dim countMensuel As Long
    Dim countTroisSemaines As Long
    Dim countDeuxSemaines As Long
    Dim cell As Range
    Dim dateLimite As Date

    Set ws = ThisWorkbook.Sheets("FORFAITS PONCTUELS 2025 - formu")

    ' Initialiser les compteurs
    countHebdo = 0
    countMensuel = 0
    countTroisSemaines = 0
    countDeuxSemaines = 0

    ' Définir la date limite au 1er janvier de l'année en cours
    dateLimite = DateSerial(Year(Date), 1, 1)

    ' Parcourir chaque cellule de la colonne L jusqu'à la dernière cellule non vide
    For Each cell In ws.Range("L1:L" & ws.Cells(ws.Rows.Count, "L").End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then ' Vérifier si la cellule n'est pas vide
            ' Vérifier si la date correspondante en colonne J est une date valide
            If IsDate(ws.Cells(cell.Row, "J").Value) Then
                ' Vérifier si la date en colonne J est supérieure au 1er janvier
                If ws.Cells(cell.Row, "J").Value > dateLimite Then
                    Select Case cell.Value
                        Case "Hebdomadaire"
                            countHebdo = countHebdo + 1
                        Case "Mensuel"
                            countMensuel = countMensuel + 1
                        Case "Trois_semaines"
                            countTroisSemaines = countTroisSemaines + 1
                        Case "Deux_semaines"
                            countDeuxSemaines = countDeuxSemaines + 1
                    End Select
                End If
            End If
        End If
    Next cell

    ' Afficher les résultats dans les cellules correspondantes
    ws.Range("O5").Value = countHebdo
    ws.Range("P5").Value = countMensuel
    ws.Range("Q5").Value = countTroisSemaines
    ws.Range("R5").Value = countDeuxSemaines
End Sub

et modification :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim jours As Integer
    Dim i As Integer
 
    Set rng = Me.Range("I9:I100") ' Modifiez la plage si nécessaire

    If Not Intersect(Target, rng) Is Nothing Then
        Application.EnableEvents = False ' Désactiver les événements pour éviter les boucles

        For i = 1 To rng.Cells.Count
            If Target.Cells(i).Value <> "" Then
                Select Case Target.Cells(i).Value
                    Case "7 jours": jours = 7
                    Case "14 jours": jours = 14
                    Case "21 jours": jours = 21
                    Case "1 mois": jours = 30
                    Case "2 mois": jours = 60
                    Case "3 mois": jours = 90
                    Case Else: jours = 0 ' Pour gérer les valeurs non reconnues
                End Select
             
                ' Remplir J et K si elles sont vides
                If jours > 0 Then
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "J").Value) Then
                        Me.Cells(Target.Cells(i).Row, "J").Value = Date
                    End If
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "K").Value) Then
                        Me.Cells(Target.Cells(i).Row, "K").Value = Date + jours
                    End If
                End If
            End If
        Next i

        Application.EnableEvents = True ' Réactiver les événements après les modifications
     
        ' Appel à la fonction de comptage
        CompterOccurrences
    End If
End Sub


Nathe
 

Pièces jointes

Dernière édition:
Je pense avoir compris:
A tester

Regarde la pièce jointe 1213369

Rajout de :

Code:
Sub CompterOccurrences()
    Dim ws As Worksheet
    Dim countHebdo As Long
    Dim countMensuel As Long
    Dim countTroisSemaines As Long
    Dim countDeuxSemaines As Long
    Dim cell As Range
    Dim dateLimite As Date

    Set ws = ThisWorkbook.Sheets("FORFAITS PONCTUELS 2025 - formu")

    ' Initialiser les compteurs
    countHebdo = 0
    countMensuel = 0
    countTroisSemaines = 0
    countDeuxSemaines = 0

    ' Définir la date limite au 1er janvier de l'année en cours
    dateLimite = DateSerial(Year(Date), 1, 1)

    ' Parcourir chaque cellule de la colonne L jusqu'à la dernière cellule non vide
    For Each cell In ws.Range("L1:L" & ws.Cells(ws.Rows.Count, "L").End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then ' Vérifier si la cellule n'est pas vide
            ' Vérifier si la date correspondante en colonne J est une date valide
            If IsDate(ws.Cells(cell.Row, "J").Value) Then
                ' Vérifier si la date en colonne J est supérieure au 1er janvier
                If ws.Cells(cell.Row, "J").Value > dateLimite Then
                    Select Case cell.Value
                        Case "Hebdomadaire"
                            countHebdo = countHebdo + 1
                        Case "Mensuel"
                            countMensuel = countMensuel + 1
                        Case "Trois_semaines"
                            countTroisSemaines = countTroisSemaines + 1
                        Case "Deux_semaines"
                            countDeuxSemaines = countDeuxSemaines + 1
                    End Select
                End If
            End If
        End If
    Next cell

    ' Afficher les résultats dans les cellules correspondantes
    ws.Range("O5").Value = countHebdo
    ws.Range("P5").Value = countMensuel
    ws.Range("Q5").Value = countTroisSemaines
    ws.Range("R5").Value = countDeuxSemaines
End Sub

et modification :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim jours As Integer
    Dim i As Integer
 
    Set rng = Me.Range("I9:I100") ' Modifiez la plage si nécessaire

    If Not Intersect(Target, rng) Is Nothing Then
        Application.EnableEvents = False ' Désactiver les événements pour éviter les boucles

        For i = 1 To rng.Cells.Count
            If Target.Cells(i).Value <> "" Then
                Select Case Target.Cells(i).Value
                    Case "7 jours": jours = 7
                    Case "14 jours": jours = 14
                    Case "21 jours": jours = 21
                    Case "1 mois": jours = 30
                    Case "2 mois": jours = 60
                    Case "3 mois": jours = 90
                    Case Else: jours = 0 ' Pour gérer les valeurs non reconnues
                End Select
             
                ' Remplir J et K si elles sont vides
                If jours > 0 Then
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "J").Value) Then
                        Me.Cells(Target.Cells(i).Row, "J").Value = Date
                    End If
                    If IsEmpty(Me.Cells(Target.Cells(i).Row, "K").Value) Then
                        Me.Cells(Target.Cells(i).Row, "K").Value = Date + jours
                    End If
                End If
            End If
        Next i

        Application.EnableEvents = True ' Réactiver les événements après les modifications
     
        ' Appel à la fonction de comptage
        CompterOccurrences
    End If
End Sub


Nathe
 
Bonjour , résolu super ca fonctionne tres bien , j'ai trouvé pour debloquer la macro !
peut on ajouter si possible , car si mon client veux reserve ca place en avance .
exemple il viens a ce jour : forfait 7 jours pour le 24/02/25 au 02/03/25
Je sais je vous en demande ! si vous pouvez et si vous m avez compris .
Merci a vous
Bonne journée
Cordialement
 
Dernière édition:
A tester,
mais modifier la date manuellement en colonne "J"
Nathe
Bonjour, si résolu marqué comme résolu
Nathe
Bonjour, déjà super boulot de votre part ! Cela va nous changer la vie.
comme vous êtes super efficace sur Excel :
à temps perdu :
Auriez vous une solution ? , pour rendre notre fichier au Top Du Top
Pour la partie, Nom, prénom, téléphone, immatriculation, marque, type. c'est des clients qui viennent 3 à 4 fois ou plus dans l'année.
Lorsque nous retrouvons les mêmes clients : aurez-vous une solution pour éviter de retaper les mêmes infos du client ?
mais faut que l'on ait la possibilité d'ajouter de nouveaux clients ?

Quand vous pouvez . Je vous souhaite une excelente Journée .
Et Merci Beaucoup
Cordialement
 
Bonjour, déjà super boulot de votre part ! Cela va nous changer la vie.
comme vous êtes super efficace sur Excel :
à temps perdu :
Auriez vous une solution ? , pour rendre notre fichier au Top Du Top
Pour la partie, Nom, prénom, téléphone, immatriculation, marque, type. c'est des clients qui viennent 3 à 4 fois ou plus dans l'année.
Lorsque nous retrouvons les mêmes clients : aurez-vous une solution pour éviter de retaper les mêmes infos du client ?
mais faut que l'on ait la possibilité d'ajouter de nouveaux clients ?

Quand vous pouvez . Je vous souhaite une excelente Journée .
Et Merci Beaucoup
Cordialement

Il y a tout à reprendre, j'essaie de voir dans la journée.
Nathe
 
Bonjour Teckmicro03, Nathe,
Comme j'avais un peu de temps, je me permets de vous proposer le fichier ci-joint.
Nathe a raison : il faut tout reprendre !
Mais, si je peux me permettre, il faudrait que vous posiez bien vos besoins, ce qui évitera d'avoir à recommencer à chaque fois.
Le fichier que je vous propose est une base sur laquelle vous pourriez partir.
Dans le tableau, il y a certaines colonnes qui ne me paraissent pas nécessaires.
Le nombre de Forfaits "Valide" est une donnée qui pourrait apparaître sur une feuille "Tableau de Bord" qui serait gérée par TCD (Voir Feuille "Accueil). Bien d'autres infos pourrait s'afficher (le nombre fois que sort chaque véhicule...)
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour