Calculateur d'absence selon plusieurs fichiers
En effet je vais faire comme ça ! Merci !
Pour les dates de vacances scolaires tu me conseil quoi ?
Demain, je te ferai :
- la visualisation des vacances scolaires dans les 3 zones ou une seule et laquelle ?
- un module de compilation des 4 plannings
Les 3 zones serait parfait ! (Plusieurs collaborateurs sur toute la France)
Merci beaucoup encore une fois !
Demain, je te ferai :
- la visualisation des vacances scolaires dans les 3 zones ou une seule et laquelle ?
- un module de compilation des 4 plannings
Pour le point 2 :
Option Explicit
Sub compiler()
Dim c As Workbook ' compil
Dim s As Workbook ' source
Dim f As String ' nom du fichier
Dim r As String ' répertoire
Dim o As String ' onglet
Dim t As String ' onglet contenant le TCD et réactivant la récap dans la source si nécssaire
Dim x As Long ' ligne
Set c = ThisWorkbook
r = c.Path & "\SERVICES\" ' à modifier si nécessaire
o = "Recap"
t = "Synthese"
f = Dir(r & "*.xlsm")
If Not c.Sheets(o).ListObjects(1).DataBodyRange Is Nothing Then c.Sheets(o).ListObjects(1).DataBodyRange.Delete
Do While f <> ""
c.Sheets(o).ListObjects(1).ListRows.Add
x = c.Sheets(o).ListObjects(1).ListRows.Count
Set s = Workbooks.Open(r & f)
s.Sheets(t).Select ' pou réactiver la compilation des mois dans le fichier source
s.Sheets(o).ListObjects(1).DataBodyRange.Copy Destination:=c.Sheets(o).ListObjects(1).DataBodyRange.Cells(x, 1)
Application.DisplayAlerts = False
s.Close False
Application.DisplayAlerts = True
f = Dir
Loop
End Sub
Ca me vas bien, j'ai modifié un peu la macro pour l'adapter à mes fichiers,
Merci !
Ca me vas bien, j'ai modifié un peu la macro pour l'adapter à mes fichiers,
Merci !
Modifie r = mais le reste laisse le en l'état !
pour le point 1, avec les vacances scolaires (2019/2020 et 2020/2021)
Un retour sur le code pour la communauté
A l'activation de l'onglet Synthèse, on compile l'ensemble des onglets mensuels (une entorse à ma conception des choses) et on actualise le TCD
Private Sub Worksheet_Activate()
COMPILER True
ActiveSheet.PivotTables(1).PivotCache.Refresh
End SubLorsqu'on change de feuille, ce code n'a aucune fonction si ce n'est d'empêcher les modifications incontrôlées de calendrier.
- s'il s'agit d'une feuille mensuelle on interdit de changer l'année et le mois en A4 et B4
- s'il s'agit de l'onglet calendrier, alors après confirmation on remettra aussi à zéro les feuilles mensuelles
Private Sub Workbook_SheetChange(ByVal f As Object, ByVal Target As Range)
If IsNumeric(Left(f.Name, 1)) Then
If Not Intersect(Target, Range("A4:B4")) Is Nothing Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
MsgBox "Pour modifier l'année, rendez-vous dans ''Calendrier'' !"
End If
ElseIf f.Name = "Calendrier" Then
If Not Intersect(Target, Range("A1")) Is Nothing Then
Application.EnableEvents = False
rep = MsgBox("Etes vous sûr(e) de vouloir changer l'année ?" & vbCrLf & "Si OUI : ceci effacera toutes les données ... (faites alors auparavant une sauvegarde)", vbYesNo, "Sondage")
If rep = vbYes Then
raz True
ElseIf rep = vbNo Then
Application.Undo
Else
End If
Application.EnableEvents = True
End If
End If
End SubL'effacement se trouve dans un module
Sub raz(ok As Boolean)
For Each f In Worksheets
If IsNumeric(Left(f.Name, 1)) Then
derL = f.Range("A" & Rows.Count).End(xlUp).Row
f.Range("B11:AF" & derL).Clear
End If
Next
End SubEnfin le module qui compile les feuilles mensuelles, c'est le cœur du sujet
Sub COMPILER(ok As Boolean)
Dim f As Worksheet, tbl, bdd As Worksheet, fam As Object, result()
' raz de la bas de données
Set bdd = Sheets("Recap")
If Not bdd.ListObjects(1).DataBodyRange Is Nothing Then bdd.ListObjects(1).DataBodyRange.Delete
' chargement des familles de code
cod = Range("Tcodes[#All]").Value
Set fam = CreateObject("Scripting.Dictionary")
For i = LBound(cod) + 1 To UBound(cod)
fam(cod(i, 1)) = cod(i, 3)
Next
n = 0
For Each f In Worksheets
If IsNumeric(Left(f.Name, 1)) Then
derL = f.Range("A" & Rows.Count).End(xlUp).Row
tbl = f.Range("A8:AF" & derL).Value ' importation globale de la plage dans tbl
For i = 4 To UBound(tbl) Step 3 ' ce qui donnera les noms en colonne 1
For j = 2 To UBound(tbl, 2) ' balayage de toutes les dates
If tbl(i + 1, j) <> "" Then ' motif présent le matin
n = n + 1
ReDim Preserve result(1 To 9, 1 To n)
result(1, n) = tbl(i, 1)
result(2, n) = Format(tbl(1, j), "mm/dd/yyyy")
result(3, n) = tbl(i + 1, 1)
result(4, n) = tbl(i + 1, j)
result(5, n) = 0.5
result(6, n) = fam(tbl(i + 1, j))
End If
If tbl(i + 2, j) <> "" Then ' motif présent l'apm
n = n + 1
ReDim Preserve result(1 To 9, 1 To n)
result(1, n) = tbl(i, 1)
result(2, n) = Format(tbl(1, j), "mm/dd/yyyy")
result(3, n) = tbl(i + 2, 1)
result(4, n) = tbl(i + 2, j)
result(5, n) = 0.5
result(6, n) = fam(tbl(i + 2, j))
End If
Next
Next
End If
Next
bdd.Cells(2, 1).Resize(UBound(result, 2), UBound(result)) = Application.Transpose(result)
End SubAprès, il s'agit d'une question d'organisation des données. Pratiquement pas de formules. Quelques MFC.
Ca me vas bien, j'ai modifié un peu la macro pour l'adapter à mes fichiers,
Merci !
Modifie
r =mais le reste laisse le en l'état !pour le point 1, avec les vacances scolaires (2019/2020 et 2020/2021)
C'est parfait, une question quand même
une MFC
mais en fait je l'ai codée pour la dupliquer facilement sur toutes les pages, sinon c'est fastidieux !
normalement la MFC ne disparait pas ensuite
Private Sub Workbook_SheetActivate(ByVal f As Object)
If Not IsNumeric(Left(f.Name, 1)) Then Exit Sub
derL = f.Range("A" & Rows.Count).End(xlUp).Row
f.Cells.FormatConditions.Delete
With f.Range("B8:AF" & derL)
.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=JOURSEM(B$8;2)>5"
.FormatConditions(.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.799981688894314
End With
.FormatConditions(1).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=NB.SI(_JF;B$8)"
.FormatConditions(.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.799981688894314
End With
.FormatConditions(1).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ANNEE(B$8)<>$A$4"
.FormatConditions(.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.14996795556505
End With
.FormatConditions(1).StopIfTrue = False
End With
With f.Range("B10:AF" & derL)
.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=JOURSEM(B$8;2)=7"
.FormatConditions(.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Borders(xlRight)
.LineStyle = xlContinuous
.TintAndShade = 0
.Weight = xlThin
End With
.FormatConditions(1).StopIfTrue = False
End With
' vacances scolaires
With f.Range("B5:AF5")
.FormatConditions.Add Type:=xlExpression, Formula1:="=SOMMEPROD((deA<=B$9)*(aA>B$9))>0"
.FormatConditions(.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent6
.TintAndShade = 0.599963377788629
End With
.FormatConditions(1).StopIfTrue = False
End With
With f.Range("B6:AF6")
.FormatConditions.Add Type:=xlExpression, Formula1:="=SOMMEPROD((deB<=B$9)*(aB>B$9))>0"
.FormatConditions(.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.599963377788629
End With
.FormatConditions(1).StopIfTrue = False
End With
With f.Range("B7:AF7")
.FormatConditions.Add Type:=xlExpression, Formula1:="=SOMMEPROD((deC<=B$9)*(aC>B$9))>0"
.FormatConditions(.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.599963377788629
End With
.FormatConditions(1).StopIfTrue = False
End With
End SubSi tu as exporté le tableau, alors il faut aussi nommer les zones
Tu peux le faire rapidement avec ceci en te mettant sur l'onglet Calendrier.
Sub vacances()
On Error Resume Next
With ActiveWorkbook.Names
.Add Name:="deA", RefersToR1C1:="=Calendrier!R2C9:R16C9"
.Add Name:="aA", RefersToR1C1:="=Calendrier!R2C10:R16C10"
.Add Name:="deB", RefersToR1C1:="=Calendrier!R2C11:R16C11"
.Add Name:="aB", RefersToR1C1:="=Calendrier!R2C12:R16C12"
.Add Name:="deC", RefersToR1C1:="=Calendrier!R2C13:R16C13"
.Add Name:="aC", RefersToR1C1:="=Calendrier!R2C14:R16C14"
End With
End SubJ'espère aussi au passage que tu as défusionné toutes les lignes 5/6/7 des onglets mensuels
Parfait, ça marche !
Oui façon j'ai pris comme basse ton fichier, et j'ai remplacé par mes données. Il me reste juste à bloquer certain paramètre tel que : Le déplacement des onglets, le changement d'années.
Ecoute on arrive au bout, en tout cas merci beaucoup de ton aide de ta patience et de ta sympathie !
Merci pour tes retours, c'est aussi très agréable de travailler avec quelqu'un de réactif et à l'écoute.
Tu peux solder le fil en cliquant sur V
Cela n'empêche pas qu'en cas de besoin tu peux revenir ici ou en mp.
Michel

