XL 2013 Msgbox en cascade...

Choco2x

XLDnaute Occasionnel
Bonjour !

Ci-joint un fichier avec un semblant de VBA, mais je suis une quiche...

Ce que je cherche à faire :
Avoir des "message boxes" à l'ouverture qui m'alertent coup sur coup sur mes échéances à 30 jours, sur les colonnes D, puis F, puis I, puis J, et pour finir sur la colonne E de ma feuille "Véhicules".

Pour le moment je n'arrive qu'à avoir une alerte sur le total de ces échéances, sans distinction...

Merci d'avance de toute aide proposée...
 

Pièces jointes

  • Fichier pour EXLDL.xlsm
    41.8 KB · Affichages: 13

job75

XLDnaute Barbatruc
Bonsoir Choco2x,

Voyez le fichier joint et ce code dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
Dim c As Range, a() As Date, n&, mes$
With Sheets("Personnel").[A2].CurrentRegion
     With Union(.Columns("D"), .Columns("F"), .Columns("I:J"))
        For Each c In .Cells
            If IsDate(c) Then If c >= Date And c <= Date + 30 Then ReDim Preserve a(n): a(n) = c: n = n + 1
        Next c
    End With
End With
With Sheets("Véhicules").[A2].CurrentRegion.Columns("E")
    For Each c In .Cells
        If IsDate(c) Then If c >= Date And c <= Date + 30 Then ReDim Preserve a(n): a(n) = c: n = n + 1
    Next c
End With
If n Then
    tri a, 0, n - 1 'classement des dates
    mes = "RV le : " & vbLf
    For n = 0 To UBound(a)
        mes = mes & vbLf & a(n)
    Next n
    MsgBox mes, , "Rendez-vous"
Else
    MsgBox "Aucun RV dans les 30 jours qui viennent", , "Rendez-vous"
End If
End Sub

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
A+
 

Pièces jointes

  • Fichier pour EXLDL(1).xlsm
    47.3 KB · Affichages: 9

Choco2x

XLDnaute Occasionnel
Bonsoir !
Et merci pour ce travail, je suis impressionné, moi qui n'arrive à rien !

Ce que je voulais obtenir, c'est une msgbox pour chacune des colonnes citées, pour savoir exactement combien de rdv en retard j'ai pour chaque catégorie (visite médicale, permis, etc.)...
Est-ce possible ?

Merci encore pour le temps passé !!!
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir Choco2x,

Pas de problème, voyez ce fichier (2), le code est juste un peu plus étoffé :
VB:
Private Sub Workbook_Open()
With Sheets("Personnel").[A2].CurrentRegion
    Message .Columns("D").Cells, "Visite médicale"
    Message .Columns("F").Cells, "Permis"
    Message .Columns("I").Cells, "Souscrit"
    Message .Columns("J").Cells, "AFGSU 2"
End With
With Sheets("Véhicules").[A2].CurrentRegion
    Message .Columns("E").Cells, "C.T. valide"
End With
End Sub

Sub Message(r As Range, titre$)
Dim a() As Date, n&, mes$
For Each r In r
    If IsDate(r) Then If r >= Date And r <= Date + 30 Then ReDim Preserve a(n): a(n) = r: n = n + 1
Next r
If n Then
    tri a, 0, n - 1 'classement des dates
    mes = "Date" & IIf(n > 1, "s", "") & " : " & vbLf
    For n = 0 To UBound(a)
        mes = mes & vbLf & a(n)
    Next n
    MsgBox mes, , titre
Else
    MsgBox "Aucun RV dans les 30 jours qui viennent", , titre
End If
End Sub

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
La macro Message est paramétrée ce qui évite d'avoir à répéter le code.

A+
 

Pièces jointes

  • Fichier pour EXLDL(2).xlsm
    48.1 KB · Affichages: 10

Choco2x

XLDnaute Occasionnel
Formidable !
C'est exactement ce qu'il me fallait !
Merci beaucoup !!!


Euh... Puis-je abuser, sur la lancée ? :)
Je vois qu'on peut faire beaucoup de choses, donc serait-il possible d'inclure devant chaque date le nom de famille (colonne C) du personnel correspondant, dans les msg box ?
Et qu'en plus (avec l'ancienne version il me semble que j'avais réussi à obtenir çà) les rdv qui ont une date de rdv déjà fixée (colonne à droite de la date d'échéance) ne soient pas pris en compte ?
Parce que du coup je ne sais pas de qui il s'agit, ni s'il s'agit de rdv déjà planifiés...

J'en demande beaucoup, j'en suis conscient, et je compte sur le plaisir de relever le défi !! :D;)
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Choco2x,

Aucun problème, le code dans ce fichier (3) fait ce que vous souhaitez.

Simplement comme la longueur des textes en colonne C est variable il vaut mieux les placer à droite des dates dans la MsgBox.

A+
 

Pièces jointes

  • Fichier pour EXLDL(3).xlsm
    48.8 KB · Affichages: 4

Choco2x

XLDnaute Occasionnel
Quelle réactivité !!
Mille mercis !

Ca fonctionne nickel pour ce que j'ai pu le tester !
Ca va beaucoup m'aider, merci encore !!

Je me mets au VBA, mais je commence à peine, ça m'encourage à poursuivre !

Pour pinailler, comment faire apparaître, juste pour la dernière msbox (véhicules) la colonne A au lieu de la C ?
Je crois qu'après çà il sera le fichier parfait pour moi !
Sinon j'inverse mes colonnes, mais bon... :rolleyes::)

Choco
 
Dernière édition:

xUpsilon

XLDnaute Accro
Bonjour,

Tout semble nickel, j'ai rien à redire, si ce n'est ajouter que pour la gestion de tes véhicules tu passes par un TCD alors que tu pourrais faire plus ciblés en passant par des listes déroulantes (Données -> Validation de Données).
Tu pourrais ainsi avoir par ex uniquement les véhicules de la marque Renault dans la cellule du modèle du véhicule lorsque tu as choisi Renault dans la cellule de la marque du véhicule.

Bref simple remarque sur ce que tu pourrais faire pour encore améliorer ton document ;)

Bonne continuation
 

Discussions similaires