Re : probleme filtres avec macro vba
J'ai trouvé une boucle qui reprend bien les cellules filtrées, mais j'ai du faire une erreur dans mon programme, car si je clique oui sur le message box, il devrait m'ouvrir mon useform description, or là ça boucle sur le premier message box.
voici le programme, en vert les zones ajoutées ou modifiées.
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
'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.
'Fin initialisation des variables
'comptage du nombre de ligne occupées
Application.ScreenUpdating = False
Range("A9", Range("A3000").End(xlUp)).Select
'on place dans un tableau les N° de lignes visibles
For Each cellule In Selection.SpecialCells(xlCellTypeVisible)
On Error Resume Next
Tablo.Add cellule.Row, CStr(cellule.Row)
Next
'on reprend les N° de lignes depuis la fin du tableau
For N = Tablo.Count To 9 Step -1 'boucle sur toutes les lignes filtrées
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: Tablo(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:
Application.ScreenUpdating = True
Next
If message_alerte = 1 Then Reponse = MsgBox(Msg, Style, Title) 'affichage du message
postabrep = 0 'initilaisation de la position dans le tableau Tablo()
premierelignemauvaise = lastmaint & Tablo(postabrep) 'position de la premiere cellule rouge
If Reponse = vbYes Then sortie_macro = 1: affichage_messages
sortie_macro = 0
End Sub