'=====================================================================================
'Transfert des données "Employé" après éventuelle création de la feuille correspondant
'=====================================================================================
Sub TransfertDonnéesEmployés()
Dim wShSce As Worksheet, wSh As Worksheet
Dim Dico As Object, DicLgn As Object
Dim Shp As Shape
Application.ScreenUpdating = False
Set Dico = CreateObject("Scripting.Dictionary")
Set DicLgn = CreateObject("Scripting.Dictionary")
'Lecture de la feuille source (ici "Suivi des dossiers")
Set wShSce = ShSuivi
With wShSce
If .FilterMode Then .ShowAllData
ColEmployé = WorksheetFunction.Match("Employé", .Rows(lgn1), 0)
tbdonnées = .Cells(lgn1, 1).CurrentRegion
End With
NbLgnSce = UBound(tbdonnées, 1)
nbcol = UBound(tbdonnées, 2)
ReDim TitresCol(1 To 1, 1 To nbcol) 'titre des colonnes à copier
For j = 1 To nbcol
TitresCol(1, j) = tbdonnées(1, j)
Next
'Collecte dans un dictionnaire des employés et des lignes qui leur correspondent
DicLgn("1") = 1
For i = 2 To UBound(tbdonnées)
If tbdonnées(i, ColEmployé) <> "" Then Dico(tbdonnées(i, ColEmployé)) = Dico(tbdonnées(i, ColEmployé)) & "¤" & i
DicLgn(CStr(i)) = i
Next i
clefs = Dico.Keys: valeurs = Dico.Items
n = -1
Message = "Nouvelle(s) feuille(s) crée(s) :"
Texte = Message
For Each clef In clefs
n = n + 1
If FeuilleExiste(CStr(clef)) Then '=>ne pas tenter de créer une feuile qui existe déjà
Set wSh = ThisWorkbook.Worksheets(CStr(clef))
Else
Texte = Texte & Chr(10) & Chr(9) & "Employé " & clef
Set wSh = ThisWorkbook.Worksheets.Add(before:=shDonnées) 'Création de la feuille Employé
ActiveWindow.DisplayGridlines = False
With wSh
.Name = clef 'Attribution du nom
.Cells(lgn1, 1).Resize(1, nbcol).Value = TitresCol 'Coller les titres de colonne
'Ajouter le bouton
Set Shp = .Shapes.AddShape(msoShapeRoundedRectangle, .[J1].Left, .[J1].Top, 180, 30)
Shp.OnAction = "InsérerLigne"
With Shp.TextFrame2
.VerticalAnchor = msoAnchorMiddle
With .TextRange
.Font.Size = 16
.Font.Bold = True
.Text = "Ajouter ligne"
With .ParagraphFormat
.Alignment = msoTextEffectAlignmentCentered
End With
End With
End With
End With
End If
With wSh
LgnDéb = .Cells(.Rows.Count, ColEmployé).End(xlUp).Row 'Première ligne libre dans la colonne Employé
LgnàCopier = Split(valeurs(n), "¤") 'Identifier les lignes à copier (l'élément 0 est vide et ne sera pas lu)
nblgn = UBound(LgnàCopier)
ReDim tbres(1 To nblgn, 1 To nbcol) 'Créer un tableau avec les valeurs à copier
For i = 1 To nblgn
For j = 1 To nbcol
tbres(i, j) = tbdonnées(LgnàCopier(i), j)
Next j
DicLgn.Remove LgnàCopier(i) 'Retire cette ligne du dictionnaire des lignes à conserver
Next i
.Cells(LgnDéb + 1, 1).Resize(nblgn, nbcol).Value = tbres 'Coller les valeur dans la feuille Employé
'Validation des données
derlgn = .Cells(.Rows.Count, ColEmployé).End(xlUp).Row
With .Range(.Cells(lgn1 + 1, 1), .Cells(derlgn, 1)).Validation 'de la 1ère ligne de saisie à la dernière (col A)
.Delete
.Add Type:=xlValidateList, Formula1:="=chx_Ville" 'utilisation du nom défini chx_ville
End With
With .Range(.Cells(lgn1 + 1, 2), .Cells(derlgn, 2)).Validation 'de la 1ère ligne de saisie à la dernière (col B)
.Delete
.Add Type:=xlValidateList, Formula1:="=chx_Type" 'utilisation du nom défini chx_type
End With
'Mettre un format (jjj* jj/mm/aaa) par exemple en colonne 4
With .Range(.Cells(lgn1 + 1, 4), .Cells(derlgn, 4))
.NumberFormatLocal = "jjj* jj/mm/aaaa"
.HorizontalAlignment = xlRight
.IndentLevel = 1
End With
'format conditionnel pour bordures
Application.Goto .Cells(lgn1, 1)
With .Range(.Cells(lgn1, 1), .Cells(.Rows.Count, ColEmployé)).FormatConditions
.Delete
With .Add(xlExpression, Formula1:="=" & wSh.Cells(lgn1, ColEmployé).Address(False, True, xlA1) & "<>""""")
.Borders.LineStyle = xlContinuous
.Borders.Color = 12874308
End With
End With
wShSce.Rows(lgn1).Copy
.Rows(lgn1).PasteSpecial Paste:=xlPasteColumnWidths
If Not .AutoFilterMode Then .Cells(lgn1, 1).AutoFilter
End With
Next
lgnAconserver = DicLgn.Count 'nbre de lignes à conserver restantes
'Constitution d'une tableau des données à conserver
ReDim tbres(1 To lgnAconserver, 1 To nbcol)
clefs = DicLgn.Keys: valeurs = DicLgn.Items
For i = 1 To lgnAconserver
l = valeurs(i - 1)
For j = 1 To nbcol
tbres(i, j) = tbdonnées(l, j)
Next
Next
'Effacer les anciennes données et coller les données à conserver
With wShSce
.Cells(lgn1, 1).CurrentRegion.ClearContents
.Cells(lgn1, 1).Resize(lgnAconserver, nbcol) = tbres
If Not .AutoFilterMode Then .Cells(lgn1, 1).AutoFilter
.Activate
End With
Application.ScreenUpdating = True
If Texte <> Message Then MsgBox Title:="Création de feuilles employé", Prompt:=Texte
End Sub