1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| Sub Maintenance() 'chaque clique ou chaque changement de cellule
nom_feuille = ActiveWorkbook.ActiveSheet.Name 'recuperation du nom de la feuille
If ActiveCell.Column = 8 Or ActiveCell.Column = 7 Or ActiveCell.Column = 16 Or ActiveCell.Column = 9 Or ActiveCell.Column = 19 Then Exit Sub 'la macro n'est pas réalisée lorsque l'on clique dans les colonne G et H
If sortie_macro = 1 Then Exit Sub
'initialisation des variables
t = 0
aujourdhui = Date
lignetitre = 8
lastmaint = "P"
nextmaint = "Q"
typefreq = "O"
freq = "N"
i = lignetitre
freq1 = "jour"
freq2 = "mois"
freq3 = "an"
freq4 = "cycle"
message_alerte = 0
pre_alerte = -7 'message alerte s'affiche tant de jour(s) avant la date de la prochaine maintenance
'Do
' i = i + 1
'Loop Until Cells(i, 2) = ""
'ReDim tabrep(i)
'nbreligne = i - lignetitre - 1 'nombre de ligne d'opération de maintenance
'premiereligne = lignetitre + 1
Application.ScreenUpdating = False
Range(Range("A" & Rows.Count).End(xlUp), Cells(9, 1)).Select
'on place dans un tableau les N° de lignes visibles
Dim Tablo As New Collection, cellule As Range
For Each cellule In Selection.SpecialCells(xlCellTypeVisible)
On Error Resume Next
Tablo.Add cellule.Row, CStr(cellule.Row)
Next
'initialisation du message d'erreur
Msg = "Au moins une des opérations doit être envisagée dans les " & Abs(pre_alerte) & " prochains jours. Voulez-vous accedez à la premiere intervention ?" ' Définit le message.
Style = vbYesNo + vbCritical + vbDefaultButton2 'Définit les boutons.
Title = "Message d'ALERTE " 'Définit le titre.
ReDim tabrep(Tablo.Count)
'on reprend les N° de lignes depuis la fin du tableau
For N = Tablo.Count To 0 Step -1
'For N = premiereligne To i - 1
celltypefreq = typefreq & N 'cellule à lire
If Range(celltypefreq) = freq1 Then decalage = "d" 'determination du type de décalage determiné par le type de fréquence
If Range(celltypefreq) = freq2 Then decalage = "m" 'determination du type de décalage determiné par le type de fréquence
If Range(celltypefreq) = freq3 Then decalage = "yyyy" 'determination du type de décalage determiné par le type de fréquence
If Range(celltypefreq) = freq4 Then 'écrit "suivant fréquence" dans cellule "date prochaine maintenance"
celldatnextmaint = nextmaint & N: Range(celldatnextmaint).Value = "suivant frequence": GoTo ligne1
End If 'à modifier suivant le type de fréquence
'calcul de la prochaine date de maintenance
cellfreq = freq & N 'cellule à lire
datelastmaint = DateValue(Cells(N, lastmaint).Value) 'mise en forme de la date de la derniere maintenance
nbrefreq = Range(cellfreq).Value 'récuperation de la fréquence
journextmaint = DateAdd(decalage, nbrefreq, datelastmaint) 'calcul du jour de la prochaine maintenance
celldatnextmaint = nextmaint & N 'cellule de destination
Range(celldatnextmaint).Value = journextmaint 'écriture dans la cellule de destination
date_alerte = DateAdd("d", pre_alerte, journextmaint)
If aujourdhui >= date_alerte Then message_alerte = 1: tabrep(t) = N: t = t + 1 'test pour message d'alerte, on met message_alerte à 1 si au
'moins une date dépassée, on met le numéro de ligne dans le tableau
'tabrep à la position t
ligne1:
Next
Application.ScreenUpdating = True
If message_alerte = 1 Then Reponse = MsgBox(Msg, Style, Title) 'affichage du message
postabrep = 0 'initilaisation de la position dans le tableau tabrep()
premierelignemauvaise = lastmaint & tabrep(postabrep) 'position de la premiere cellule rouge
If Reponse = vbYes Then sortie_macro = 1: affichage_messages
sortie_macro = 0
End Sub |
Partager