1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
|
Sub ComparerEtCopierDescriptif()
Dim wsGlobal As Worksheet
Dim wsOld As Worksheet
Dim lastRowGlobal As Long
Dim lastRowOld As Long
Dim numRowGlobal As Range
Dim numRowOld As Range
Dim DescriptifRangeOld As Range
Dim DescriptifCell As Range
Dim matchCell As Range
Dim lastRow As Long
Dim cell As Range
Dim ws As Worksheet
Dim numCell As Range
Dim couleurCell As Range
' Renommer la feuille active en "Global"
ActiveSheet.Name = "Global"
' AnnulationRetourLigneAuto Macro
'
'
Cells.Select
With Selection
.HorizontalAlignment = xlGeneral
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection
.HorizontalAlignment = xlGeneral
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
' Remplacez "Global" par le nom de la feuille de calcul qui contient les données exportées
Set ws = ThisWorkbook.Sheets("Global")
' Applique un style bleu clair comme tableau
If ActiveCell.Row <> lastRow Then
ws.ListObjects.Add(xlSrcRange, ws.UsedRange, , xlYes).TableStyle = "TableStyleLight13"
End If
' LargeurColonne Macro
'
'
Cells.Select
Cells.EntireColumn.AutoFit
Columns("B:B").Select
Selection.ColumnWidth = 6#
Columns("C:C").Select
Selection.ColumnWidth = 10#
Columns("D:D").Select
Selection.ColumnWidth = 16#
Columns("H:H").Select
Selection.ColumnWidth = 57#
Columns("J:J").Select
Selection.ColumnWidth = 9#
Columns("K:K").Select
Selection.ColumnWidth = 16#
' Définir la valeur de la cellule I1 sur "Délai de résolution"
ActiveSheet.Range("I1").Select
ActiveCell.Value = Replace(ActiveCell.Value, "Date d'échéance", "Délai de résolution")
' Définir la valeur de la cellule M1 sur "Commentaires"
ActiveSheet.Range("M1").Select
ActiveCell.Value = Replace(ActiveCell.Value, "En attente de", "Commentaires")
' Vérifier la présence de la feuille "OLD"
Dim sheetOld As Worksheet
On Error Resume Next
Set sheetOld = ThisWorkbook.Sheets("OLD")
On Error GoTo 0
' Remplacez "Global" et "OLD" par les noms de vos feuilles de calcul
Set wsGlobal = ThisWorkbook.Sheets("Global")
Set wsOld = ThisWorkbook.Sheets("OLD")
' Trouver la dernière ligne avec des données dans la colonne "Numéro" de la feuille "Global"
lastRowGlobal = wsGlobal.Cells(wsGlobal.Rows.Count, "A").End(xlUp).Row
' Trouver la dernière ligne avec des données dans la colonne "Numéro" de la feuille "OLD"
lastRowOld = wsOld.Cells(wsOld.Rows.Count, "A").End(xlUp).Row
' Définir la plage de données dans les colonnes "Numéro" et "Commentaires" de la feuille "Global"
Set numRowGlobal = wsGlobal.Range("A2:A" & lastRowGlobal)
Set commentairesRangeGlobal = wsGlobal.Range("M2:M" & lastRowGlobal)
' Définir la plage de données dans les colonnes "Numéro" et "Commentaires" de la feuille "OLD"
Set numRowOld = wsOld.Range("A2:A" & lastRowOld)
Set commentairesRangeOld = wsOld.Range("M2:M" & lastRowOld)
' Date limite : aujourd'hui moins 7 jours
dateLimite = Date - 7
' Parcourir chaque cellule de la colonne "Numéro" de la feuille "Global"
For Each numCell In ws.Range("A2:A" & lastRowGlobal)
' Recherche de la correspondance dans la feuille "OLD"
Set matchCell = wsOld.Range("A2:A" & lastRowOld).Find(numCell.Value, LookIn:=xlValues)
' Si une correspondance est trouvée
If Not matchCell Is Nothing Then
' Vérifier si la date est aujourd'hui ou dans les 7 jours précédents
If IsDate(ws.Cells(numCell.Row, "G").Value) Then
If DateValue(ws.Cells(numCell.Row, "G").Value) >= dateLimite And DateValue(ws.Cells(numCell.Row, "G").Value) <= Date Then
' Si vérifié récent et présent dans OLD, colorier la ligne en rouge
ws.Range("A" & numCell.Row & ":N" & numCell.Row).Interior.Color = RGB(255, 0, 0) ' Rouge
' Copier les commentaires de la feuille "OLD" vers la feuille "Global"
Set commentairesCell = commentairesRangeOld.Cells(matchCell.Row - commentairesRangeOld.Row + 1)
numCell.Offset(0, 12).Value = commentairesCell.Value ' Copier dans la colonne "Commentaires" de la feuille "Global"
Else
' Si non vérifié récent et présent dans OLD, colorier la ligne en orange
ws.Range("A" & numCell.Row & ":N" & numCell.Row).Interior.Color = RGB(255, 192, 0) ' Orange
' Copier les commentaires de la feuille "OLD" vers la feuille "Global"
Set commentairesCell = commentairesRangeOld.Cells(matchCell.Row - commentairesRangeOld.Row + 1)
numCell.Offset(0, 12).Value = commentairesCell.Value ' Copier dans la colonne "Commentaires" de la feuille "Global"
End If
End If
Else
' Si non vérifié récent (colonne D) et non présent dans OLD, colorier la ligne en rose
If IsDate(ws.Cells(numCell.Row, "G").Value) Then
If DateValue(ws.Cells(numCell.Row, "G").Value) >= dateLimite And DateValue(ws.Cells(numCell.Row, "G").Value) <= Date Then
ws.Range("A" & numCell.Row & ":N" & numCell.Row).Interior.Color = RGB(248, 203, 173) ' Rose
End If
End If
End If
Next numCell
Application.ScreenUpdating = False ' Désactiver la mise à jour de l'écran pour accélérer le processus
' Créer un dictionnaire pour stocker les groupes uniques
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' Activer la première cellule de la colonne contenant les groupes d'affectation (colonne L)
Set ws = ThisWorkbook.Sheets("Global")
ws.Activate
ws.Range("L2").Select
' Boucle à travers chaque cellule dans la colonne des groupes d'affectation
Do Until IsEmpty(ActiveCell)
' Obtenir le nom du groupes d'affectation
groupe = ActiveCell.Value
' Si le groupes d'affectation n'est pas déjà dans le dictionnaire, le stocker
If Not dict.Exists(groupe) Then
dict.Add groupe, 0
End If
' Aller à la prochaine cellule dans la colonne des groupes
ActiveCell.Offset(1, 0).Select
Loop
' Boucle à travers les groupes stockés dans le dictionnaire
For Each groupe In dict.Keys
' Créer une nouvelle feuille de calcul avec le nom du groupe
ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)).Name = groupe
Set newWs = ThisWorkbook.Sheets(groupe)
' Copier la ligne d'en-tête depuis la feuille "Global"
ws.Rows(1).Copy Destination:=newWs.Rows(1)
' Réinitialiser la variable lastRow
lastRow = 0
' Activer la première cellule de la colonne contenant les groupes (colonne L)
ws.Activate
ws.Range("L2").Select
' Boucle à travers chaque cellule dans la colonne des groupes
Do Until IsEmpty(ActiveCell)
' Obtenir le nom du groupe
If ActiveCell.Value = groupe Then
' Vérifier si la ligne n'a pas déjà été copiée
If ActiveCell.Row <> lastRow Then
' Copier la ligne de données dans la feuille de calcul du groupe
ws.Rows(ActiveCell.Row).Copy Destination:=newWs.Cells(newWs.Cells(newWs.Rows.Count, "A").End(xlUp).Row + 1, 1)
' Mettre à jour la variable lastRow
lastRow = ActiveCell.Row
End If
End If
' Aller à la prochaine cellule dans la colonne des groupes
ActiveCell.Offset(1, 0).Select
Loop
' Appliquer le style au tableau sur la feuille en cours
newWs.ListObjects.Add(xlSrcRange, newWs.UsedRange, , xlYes).TableStyle = "TableStyleLight13"
' LargeurColonne Macro pour chaque feuille
'
'
newWs.Cells.EntireColumn.AutoFit
newWs.Columns("B:B").ColumnWidth = 6#
newWs.Columns("C:C").ColumnWidth = 10#
newWs.Columns("D:D").ColumnWidth = 16#
newWs.Columns("H:H").ColumnWidth = 57#
newWs.Columns("J:J").ColumnWidth = 9#
newWs.Columns("K:K").ColumnWidth = 16#
Next groupe
' Ajouter le tableau des couleurs en bas de chaque feuille
For Each ws In ThisWorkbook.Sheets
If ws.Name <> "OLD" Then ' Ne pas appliquer sur la feuille "OLD"
' Trouver la première cellule vide 5 lignes en dessous du tableau
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set couleurCell = ws.Cells(lastRow + 5, 5)
' Déja vus
couleurCell.Interior.Color = RGB(255, 192, 0) ' Orange
couleurCell.Offset(0, 0).BorderAround _
ColorIndex:=1, Weight:=xlMedium
couleurCell.Offset(0, 1).Value = "Déjà vus"
couleurCell.Offset(0, 1).BorderAround _
ColorIndex:=1, Weight:=xlMedium
' En cours
couleurCell.Offset(1, 0).Interior.Color = RGB(248, 203, 173) ' Rose
couleurCell.Offset(1, 0).BorderAround _
ColorIndex:=1, Weight:=xlMedium
couleurCell.Offset(1, 1).Value = "En cours"
couleurCell.Offset(1, 1).BorderAround _
ColorIndex:=1, Weight:=xlMedium
' En attente de MEP
couleurCell.Offset(2, 0).Interior.Color = RGB(180, 198, 231) ' Bleu clair
couleurCell.Offset(2, 0).BorderAround _
ColorIndex:=1, Weight:=xlMedium
couleurCell.Offset(2, 1).Value = "En attente de MEP"
couleurCell.Offset(2, 1).BorderAround _
ColorIndex:=1, Weight:=xlMedium
' Clos
couleurCell.Offset(3, 0).Interior.Color = RGB(169, 208, 142) ' Vert clair
couleurCell.Offset(3, 0).BorderAround _
ColorIndex:=1, Weight:=xlMedium
couleurCell.Offset(3, 1).Value = "Clos"
couleurCell.Offset(3, 1).BorderAround _
ColorIndex:=1, Weight:=xlMedium
SurlignerEnAttente ws
End If
Next ws
' Supprimer la feuille "OLD" à la fin
ThisWorkbook.Sheets("OLD").Delete ' Supprimer la feuille "OLD"
' Si la feuille "OLD" n'existe pas, afficher un message et quitter la macro
If sheetOld Is Nothing Then
MsgBox "La feuille 'OLD' n'a pas été trouvée. Veuillez vérifier votre fichier.", vbExclamation
Exit Sub
End If
Application.ScreenUpdating = True ' Réactiver la mise à jour de l'écran
End Sub
Sub SurlignerEnAttente(ws As Worksheet)
Dim rng As Range
Dim cell As Range
' Spécifiez la plage de données, ajustez selon vos besoins
Set rng = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
' Parcours chaque cellule de la colonne "Ref" depuis la deuxième ligne
For Each cell In rng
' Vérifie si "Ref" n'est pas vide et "Statut" est "En attente"
If cell.Offset(0, 9).Value <> "" And cell.Offset(0, 4).Value = "En attente" Then
' Surligne la ligne en RGB(180,198,231)
cell.Resize(, ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column).Interior.Color = RGB(180, 198, 231)
End If
Next cell
End Sub |
Partager