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
| Sub Macro1()
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim T As Worksheet 'déclare la variable T (onglet Total)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim I As Integer 'déclare la variable I (Incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TemPoRaire)
Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes)
Dim PL As Range 'déclare la variable PL (PLage)
Dim LI As Integer 'déclare la variable LI (LIgne)
'*********************************************
'récupération des clients et du nombre de mois
'*********************************************
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
Set T = Sheets("total") 'définit l'onglet T
For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
If Not O.Name = T.Name Then 'condition : si l'onglet ne se nomme pas "total"
COL = COL + 1 'incrément la colonne COL
TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
For I = 2 To UBound(TC, 1) 'boucle 2 : sur toutes ls lignes I du tableau de cellules TC
D(TC(I, 1)) = "" 'alimente le dictionnaire D
Next I 'prochaine ligne de la boucle 2
End If 'fin de la condition
Next O 'prochain onglet de la boucle 1
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des clients sans doublons
NC = COL + 2 'définit la nombre de colonnes (donc le nombre de mois)
'*************************************************************************
'effacement ancien tableau du total, nouvelles étiquettes et mise en forme
'*************************************************************************
T.Cells.Clear 'efface d'éventuelles anciennes données de l'onglet T
T.Range("A1").Value = "CLIENT" 'écrit dans A1
With T.Range(T.Cells(1, 2), T.Cells(1, COL + 2))
.Merge 'fusionne les cellules A2:A...
.Cells(1).Value = "NOMBRE COMMANDES" 'ecrit dans la plage fusionné
End With
For I = 1 To COL + 1
T.Cells(2, I + 1).Value = "mois" & I 'écrit moisx dans la cellule de la boucle
Next I
T.Cells(2, COL + 2).Value = "Total" 'écrit
T.Range("A3").Resize(UBound(TMP, 1), 1).Value = Application.Transpose(TMP) 'renvoie la liste des clients (sans doublon) transposée dans la cellule A3
'mise en forme de la plage PL
Set PL = T.Range("A1").CurrentRegion 'définit la plage PL
PL.HorizontalAlignment = xlCenter
Application.Intersect(PL, T.Rows("1:2")).Font.Bold = True
With PL.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With PL.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With PL.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With PL.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With PL.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With PL.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
'*********************************************
'dispacthing des données dans le tableau total
'*********************************************
COL = 2 'redéfinit la colonne COL
For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
If Not O.Name = T.Name Then 'condition : si l'onglet ne se nomme pas "total"
TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
For I = 2 To UBound(TC, 1) 'boucle 2 : sur toutes ls lignes I du tableau de cellules TC
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
LI = T.Columns(1).Find(TC(I, 1), , xlValues, xlWhole).Row 'définit la ligne LI (génère une erreur si le client n'existe pas)
If Err <> 0 Then Err = 0: GoTo suite 'si une erreur a été générée, efface l'erreur, va a l'étiquette "suite"
T.Cells(LI, COL) = TC(I, 2) 'renvoie la valeur du client dans le mois correspondant du tableau total
suite: 'étiquette
Next I 'prochaine ligne de la boucle 2
COL = COL + 1 'incrémente la colonne COL
End If 'fin de la condition
Next O 'prochain onglet de la boucle 1
'mise en place des formules de Somme
For I = 3 To UBound(TMP, 1) + 2
T.Cells(I, NC).Formula = "=SUM(" & T.Range(T.Cells(I, 2), T.Cells(I, NC - 1)).Address & ")"
Next I
'zéro dans les cellules vides
For Each cel In PL
If Not cel.Address = "$A$2" Then
If IsEmpty(cel) Then cel.Value = 0
End If
Next cel
End Sub |
Partager