Amélioration de code
Bonjour le forum,
J'ai fais cette macro mais elle est très lente. Y aurait-il moyen de l'améliorer ? Merci.
Application.ScreenUpdating = False
Sheets("Prime").Unprotect
Dim C%, D%, NOM%, Nb%, iRowCP%, iRow%
iRow = Sheets("BDD").Cells(Rows.Count, 2).End(xlUp).Row
'Mise en forme de la feuille "Prime"
With Sheets("Prime")
.Range("B:E").Clear
.Range("C3").Value = "Gardes Semaine"
.Range("D3").Value = "Gardes Week-End"
.Range("C3:D3").Font.Bold = True
.Range("C:D").HorizontalAlignment = xlCenter
.Range("C:D").VerticalAlignment = xlBottom
.Range("B:B").Font.Bold = True
.Range("C:D").NumberFormat = "dd/mm/yyyy"
'On ajoute les personnels
Dep = 5
For i = 2 To iRow
.Range("B" & Dep).Value = Sheets("BDD").Range("F" & i).Value
Dep = Dep + 11
Next i
End With
iRowD = Sheets("Données").Cells(Rows.Count, 2).End(xlUp).Row
'Nombre de personnels
Nb = Sheets("BDD").Cells(Rows.Count, 6).End(xlUp).Row
'On définit les 1ère ligne
C = 5: D = 5: NOM = 5
'Boucle (dates de gardes par personnel)
For j = 1 To Nb
'On efface la feuille "CherchePrime"
With Sheets("CherchePrime")
.Range("A:F").Clear
End With
'On filtre la feuille "Données" par "Nom"/"Date"/"PO et WPO"
iRowD = Sheets("Données").Cells(Rows.Count, 2).End(xlDown).Row
If Sheets("Données").AutoFilterMode Then
Sheets("Données").AutoFilterMode = False
End If
With Sheets("Données")
.ListObjects("Tableau3").Range.AutoFilter Field:=3, _
Criteria1:=">=" & Format(Sheets("Prime").Range("O2"), "mm/dd/yy"), Operator:=xlAnd, _
Criteria2:="<=" & Format(Sheets("Prime").Range("P2"), "mm/dd/yy")
Sheets("Données").ListObjects("Tableau3").Range.AutoFilter Field:=4, Criteria1:= _
"PO", Operator:=xlOr, Criteria2:="WPO"
Sheets("Données").ListObjects("Tableau3").Range.AutoFilter Field:=2, Criteria1:= _
Sheets("Prime").Range("B" & NOM).Value
End With
'On copie les lignes visibles
With Sheets("Données").Range("A2:F" & iRowD)
.SpecialCells(xlCellTypeVisible).Copy
Sheets("CherchePrime").Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End With
If Sheets("CherchePrime").Range("A3").Value = "" Then
iRowCP = 2
Else
iRowCP = Sheets("CherchePrime").Cells(2, 2).End(xlDown).Row
End If
For i = 2 To iRowCP
If Sheets("CherchePrime").Range("F" & i).Value = Sheets("Prime").Range("B" & NOM).Value & "PO" Then
Sheets("Prime").Range("C" & C).Value = Sheets("CherchePrime").Range("C" & i).Value
C = C + 1
ElseIf Sheets("CherchePrime").Range("F" & i).Value = Sheets("Prime").Range("B" & NOM).Value & "WPO" Then
Sheets("Prime").Range("D" & D).Value = Sheets("CherchePrime").Range("C" & i).Value
D = D + 1
End If
Next i
NOM = NOM + 11
C = 5 + (11 * j)
D = 5 + (11 * j)
iRowD = 0
Next j
Dim iRowPO%, iRowWPO%, iRowMax%
iRowPO = Sheets("Prime").Cells(Rows.Count, 3).End(xlUp).Row
iRowWPO = Sheets("Prime").Cells(Rows.Count, 4).End(xlUp).Row
If iRowWPO > iRowPO Then
iRowMax = iRowWPO
Else
iRowMax = iRowPO
End If
For i = iRowMax To 6 Step -1
If Sheets("Prime").Range("C" & i).Value = "" And Sheets("Prime").Range("D" & i).Value = "" Then
Sheets("Prime").Range("C" & i).EntireRow.Delete
End If
Next i
iRowPO = Sheets("Prime").Cells(Rows.Count, 3).End(xlUp).Row
iRowWPO = Sheets("Prime").Cells(Rows.Count, 4).End(xlUp).Row
If iRowWPO > iRowPO Then
iRowMax = iRowWPO
Else
iRowMax = iRowPO
End If
For i = 4 To iRowMax
If Sheets("Prime").Range("B" & i).Value <> "" Then
Sheets("Prime").Range("B" & i & ":D" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
End If
Next
Sheets("Prime").Range("C3:D" & iRowMax).Borders(xlEdgeRight).LineStyle = xlContinuous
Sheets("Prime").Range("C3:C" & iRowMax).Borders(xlEdgeRight).LineStyle = xlContinuous
Sheets("Prime").Range("C3:D" & iRowMax).Borders(xlEdgeLeft).LineStyle = xlContinuous
ActiveWorkbook.Worksheets("Données").ListObjects("Tableau3").Sort.SortFields. _
Clear
Sheets("Données").ShowAllData
Sheets("prime").Select
Sheets("Prime").Range("A1:A500").Interior.Color = RGB(124, 124, 124)
Sheets("Prime").Protect
Application.ScreenUpdating = True
bonjour
supprime la macro !
tu as un superbe tableau
as-tu songé à ajouter une colonne dite de pointage
= SI(jour=ferié ; 1 ; 0 )
ensuite un TCD ou des SOMMEPROD pour extraire les données de chacun de date à date.
Merci jmd mais je ne suis pas familier des TCD, pourrais tu m'aiguiller .Merci
re
donne la méthode de calcul que fait la macro (je ne lis pas les macros)
J'ai réussi à faire ceci mais j'ai encore 2 problèmes:
1 : Pouvoir filtrer les dates "Début" et "Fin" via valeur cellule.
2: Je voudrais que les dates se rangent dans les colonnes "PO" et "WPO".
Auriez-vous une idée ?
Cordialement
Benoist
En fait la macro fait comme le TCD sauf qu'elle les rangent dans les colonnes "PO" et "WPO"
un essai TCD
Non, en fait je cherche à reproduire la même disposition que le tableau sur l'image précédente mais avec les dates dans les colonnes "PO" et "WPO"