Option Explicit
Sub Clean()
Dim numcol As Long, p As Range, plage As Range, Prem As Range, Der As Range
Application.ScreenUpdating = False
' on copie les cellules de la fenêtre "Feuil1" ( la fenêtre où se trouve le bouton ? )
Sheets("Feuil1").Cells.Copy Sheets("Temps salariés").Cells ' sur la feuille "Temps salariés"
Sheets("Feuil1").Cells.Copy Sheets("Temps machine").Cells ' sur la feuille "Temps machine"
'========================================================================================================
'======================== Temps machine ==========================================================
'========================================================================================================
Sheets("Temps machine").Activate 'on sélectionne la feuille "Temps machine"
' on y recherche la colonne dont la première ligne contient "Code OF"
numcol = Application.IfError(Application.Match("Code OF", Rows(1), 0), 0)
' si la colonne "Code OF" n'est pas trouvée, on quitte la Sub
If numcol = 0 Then MsgBox "Erreur : Pas de colonne 'Code OF'": Exit Sub
' on va remplacer au sein de la colonne numcol, le texte "AD-DEBUT" par la valeur d'erreur #N/A
Columns(numcol).Replace what:="AD-DEBUT", replacement:="#N/A", LookAt:=xlWhole, MatchCase:=False
' on va remplacer au sein de la colonne numcol, le texte "AD-DEBUT" par la valeur d'erreur #N/A
Columns(numcol).Replace what:="HNONP", replacement:="#N/A", LookAt:=xlWhole, MatchCase:=False
' on trie les lignes selon la colonne numcol
Range("a1").CurrentRegion.Sort key1:=Cells(1, numcol), order1:=xlAscending, Header:=xlYes
On Error Resume Next 'si on ne trouve pas la valeur d'erreur dans la colonne numcol,
'SpecialCells retourne une erreur, cette instruction permet de continuer
'l'exécution
'on recherche toute les cellules avec valeur d'erreur dans la colonne numcol
Set p = Columns(numcol).SpecialCells(xlCellTypeConstants, xlErrors)
On Error GoTo 0
' si p n'est pas vide, on supprime toutes les lignes de p
If Not p Is Nothing Then p.EntireRow.Delete
Set p = Nothing 'important pour la prochaine recherche 'SpecialCells'
'========================================================================================================
'======================== suppression de "Salarié (code)" différent de "MACHINSEUL" ===================
'========================================================================================================
' on trie la feuille selon la colonne "Salarié (code)"
' on y recherche la colonne dont la première ligne contient "Code OF"
numcol = Application.IfError(Application.Match("Salarié (code)", Rows(1), 0), 0)
' si la colonne "Code OF" n'est pas trouvée, on quitte la Sub
If numcol = 0 Then MsgBox "Erreur : Pas de colonne 'Salarié (code)'": Exit Sub
Range("a1").CurrentRegion.Sort key1:=Cells(1, numcol), order1:=xlAscending, Header:=xlYes
'on va rechercher la première cellule à partir du bas qui contient "MACHINSEUL"
On Error Resume Next
Set Der = Columns(numcol).Find("MACHINSEUL", after:=Cells(Rows.Count, numcol), LookAt:=xlWhole, LookIn:=xlValues, SearchDirection:=xlPrevious)
'on supprime à partir de la ligne de la cellule plus une
If Not Der Is Nothing Then Range(Der.Offset(1), Cells(Rows.Count, numcol)).EntireRow.Delete
'on va rechercher la première cellule à partir du haut qui contient "MACHINSEUL"
On Error Resume Next
Set Prem = Columns(numcol).Find("MACHINSEUL", after:=Cells(Rows.Count, numcol), LookAt:=xlWhole, LookIn:=xlValues, SearchDirection:=xlNext)
'on supprime à partir de la ligne 2 jusqu'à la ligne de la cellule moins une
If Not Prem Is Nothing Then Range(Cells(2, numcol), Prem.Offset(-1)).EntireRow.Delete
' on supprime les en-têtes
Rows("1:1").Delete Shift:=xlUp
'========================================================================================================
'======================== Temps salariés ==========================================================
'======================================================================================================
Sheets("Temps salariés").Select 'on sélectionne la feuille "Temps salariés"
' on y recherche la colonne dont la première ligne contient "Code OF"
numcol = Application.IfError(Application.Match("Code OF", Rows(1), 0), 0)
' si la colonne "Code OF" n'est pas trouvée, on quitte la Sub
If numcol = 0 Then MsgBox "Erreur : Pas de colonne 'Code OF'": Exit Sub
' on va remplacer au sein de la colonne numcol, le texte "AD-DEBUT" par la valeur d'erreur #N/A
Columns(numcol).Replace what:="AD-DEBUT", replacement:="#N/A", LookAt:=xlWhole, MatchCase:=False
' on va remplacer au sein de la colonne numcol, le texte "AD-DEBUT" par la valeur d'erreur #N/A
Columns(numcol).Replace what:="HNONP", replacement:="#N/A", LookAt:=xlWhole, MatchCase:=False
' on trie les lignes selon la colonne numcol
Range("a1").CurrentRegion.Sort key1:=Cells(1, numcol), order1:=xlAscending, Header:=xlYes
On Error Resume Next 'si on ne trouve pas la valeur d'erreur dans la colonne numcol,
'SpecialCells retourne une erreur, cette instruction permet de continuer
'l'exécution
'on recherche toute les cellules avec valeur d'erreur dans la colonne numcol
Set p = Columns(numcol).SpecialCells(xlCellTypeConstants, xlErrors)
On Error GoTo 0
' si p n'est pas vide, on supprime toutes les lignes de p
If Not p Is Nothing Then p.EntireRow.Delete
Set p = Nothing 'important pour la prochaine recherche 'SpecialCells'
'============================== Supprime MACHINSEUL ====================================
' on y recherche la colonne dont la première ligne contient "Salarié (code)"
numcol = Application.IfError(Application.Match("Salarié (code)", Rows(1), 0), 0)
' si la colonne "Code OF" n'est pas trouvée, on quitte la Sub
If numcol = 0 Then MsgBox "Erreur : Pas de colonne 'Salarié (code)'": Exit Sub
' on va remplacer au sein de la colonne numcol, le texte "MACHINSEUL" par la valeur d'erreur #N/A
Columns(numcol).Replace what:="MACHINSEUL", replacement:="#N/A", LookAt:=xlWhole, MatchCase:=False
' on trie les lignes selon la colonne numcol
Range("a1").CurrentRegion.Sort key1:=Cells(1, numcol), order1:=xlAscending, Header:=xlYes
On Error Resume Next 'si on ne trouve pas la valeur d'erreur dans la colonne numcol,
'SpecialCells retourne une erreur, cette instruction permet de continuer
'l'exécution
'on recherche toute les cellules avec valeur d'erreur dans la colonne numcol
Set p = Nothing
Set p = Columns(numcol).SpecialCells(xlCellTypeConstants, xlErrors)
On Error GoTo 0
' si p n'est pas vide, on supprime toutes les lignes de p
If Not p Is Nothing Then p.EntireRow.Delete
Rows("1:1").Delete Shift:=xlUp
Application.ScreenUpdating = True
End Sub