Réorganiser les données présentes dans un tableau
Bonjour,
Je viens chercher de l'aide auprès d'un problème pour lequel je ne vois pas trop par où commencer.
Concrètement, vous trouverez dans le fichier joint un tableau qui reprend la liste des cours donnés à certaines classe et/ou groupes classe par certains enseignants. Lors de la conception de ce tableau, nous devons essayer de ne pas mettre un même enseignant sur la même ligne sauf si celui donne cours à plusieurs groupes en même temps (Exemple de Dupont dans le fichier).
Ce que j'aimerais pouvoir obtenir à partir de ce tableau :
Lorsque je sélectionne le professeur dans la cellule AE6, le tableau du dessous se complète avec le cours qu'il donne avec l'heure (1ère colonne) ainsi que la (ou les) classes (pas besoin forcément du groupe) où le cours a lieu.
Je ne sais pas si c'est très clair et si ce n'est pas trop complexe. J'avais pensé à passer par Power Query mais le format est très limitant pour exploiter au mieux toutes les données. Peut-être qu'une remise en cause de la mise en forme pourrait aider. Je suis ouvert à toutes les propositions. A savoir, ce tableau est très souvent manipulé (suppression de case, ajout de colonne, ...).
Je ne maîtrise pas le VBA mais je suis à l'aise en codage de manière générale.
Merci en tout cas si vous prenez le temps de m'aider :-)
Bonjour drmath4, le forum,
Un essai....pas optimisé...
Cordialement,
Magnifique ! Mille mercis ! Il est donc temps que je me mette au VBA, la "simplicité" du code me fait rendre compte à quel point je suis nul :-p
Il me reste à adapter pour faire une conclusion sur plusieurs feuilles en même temps.
J'imagine qu'il doit être possible de concatener les les classes lorsque celles-ci ont le même prof et le même cours.
Bonjour à tous,
J'imagine qu'il doit être possible de concatener les les classes lorsque celles-ci ont le même prof et le même cours.
Un essai...
Cordialement,
Bonjour xorsankukai,
Je viens seulement de voir que vous aviez répondu à ma dernière question. Merci et désolé. J'ai un peu regardé de mon côté et j'ai changé changer de façon de travailler depuis le premier post.
Voici ce à quoi je suis arrivé pour compiler le tableau qui reprend une liste pour chaque professeur (plutôt qu'en en sélectionnant 1) :
Maintenant l'idée est de rassembler les lignes qui ont les mêmes "Prof", "Matière", "Année" et "Heure" en faisant en sorte que les différences dans les colonnes "Classes" et "Groupes" soit concaténées seulement si elles sont différentes. Les 2 exemples de la feuille devraient aider à comprendre (j'espère :-p).
Voici le code sur lequel je me base pour générer le tableau :
Sub collecte_donnee()
Dim dl%
Application.ScreenUpdating = False
With Sheets(1)
dl = 2
For i = 7 To 80 Step 2
For y = 2 To 30
gt = y
If .Cells(i - 1, 1) <> 0 Then
If .Cells(i, y) = 0 Then
Do
gt = gt - 1
Loop While .Cells(i, gt) = 0
End If
End If
If .Cells(i, gt) <> "" And .Cells(4, y) <> "" Then
Worksheets(2).Cells(dl, 1) = .Cells(i, gt).Value
Worksheets(2).Cells(dl, 2) = .Cells(i - 1, gt)
Worksheets(2).Cells(dl, 3) = .Cells(1, gt).MergeArea.Cells(1, 1)
Worksheets(2).Cells(dl, 4) = .Cells(4, y)
Worksheets(2).Cells(dl, 5) = Sheets(1).Name
Worksheets(2).Cells(dl, 6) = (i - 5) / 2
dl = dl + 1
End If
Next y
Next i
End With
End SubJ'ai bien vu votre proposition pour le fichier originale mais ne le comprenant pas tout à fait, je n'arrive pas à l'adapter ici. Si vous avez, une idée, je vous remercie d'avance pour votre aide :-)
Bonne journée.
Bonjour drmath4, le forum,
Après avoir pas mal galéré à cause de tes cellules fusionnées et ma maitrise approximative des dicos, voici un essai....à titre expérimental...
La macro s'exécute à l'activation de la feuille Synthèse.
Je te laisse le soin de vérifier la cohérence des résultats,
Cordialement,
Merci ! Ca m'aide à bien avancer !
Néanmoins, j'ai du modifier un peu le code (que je ne comprends toujours pas tout à fait :-p) car les heures ne doivent pas être fusionnées.
Autre subtilité : à terme, je devrai faire ça avec 5 autres feuilles (1ère,3ème,4ème,5ème,6ème - il y a d'autres années, sinon ce ne serait pas drôle !) et tout compiler dans ce même tableau Synthèse. Du coup, je me demande si je ne suis pas mieux de compiler d'abord un premier tableau sans tri et d'effectuer le tri seulement une fois que toutes les années ont été répertoriées dans le tableau.
Dernières petites choses : J'ai rajouté un "/" pour faire la distinction entre groupe d'une même classe et une virgule pour séparé les groupes d'autres classes. Néanmoins, comment puis-je éviter la virgule ou le slash seul en fin ou début de cellule ?
J'espère être clair ^^ Voici le fichier et code mis à jour :
Sub recap()
Dim dl%, ligne%, n%, i%, Ncol%, lig%, k%
Dim dico, d1, d2, d3, d4, clé, clé2, clé3, clé4
Dim t(), tb()
Application.ScreenUpdating = False
Set dico = CreateObject("Scripting.Dictionary")
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
Set d3 = CreateObject("Scripting.Dictionary")
Set d4 = CreateObject("Scripting.Dictionary")
With Sheets("2ème")
dl = 9
ReDim t(1 To 200, 1 To 6)
For y = 2 To 25
For i = 7 To 25 Step 2
If .Cells(i, y) <> "" Then
col = .Cells(i, y).MergeArea.Columns.Count
cl = .Cells(i, y).MergeArea.Column
c = 1
Do While c <= col
groupe = groupe & "/" & .Cells(4, cl + c - 1)
c = c + 1
Loop
n = n + 1
t(n, 1) = .Cells(i, y) 'prof
t(n, 2) = .Cells(i - 1, y) 'matière
t(n, 3) = .Cells(1, y).MergeArea.Cells(1, 1) 'classe
t(n, 4) = t(n, 4) & groupe: groupe = "" 'groupe
t(n, 5) = .Name 'année
t(n, 6) = .Cells(i - 1, 1) 'heure
End If
Next i
Next y
If n > 0 Then
Ncol = 6
ReDim tb(1 To UBound(t), 1 To Ncol)
For ligne = 1 To UBound(t)
clé = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 6)
If d1.exists(clé) Then
lig = d1(clé)
Else
d1(clé) = d1.Count + 1: lig = d1.Count
tb(lig, 1) = t(ligne, 1) 'prof
tb(lig, 2) = t(ligne, 2) 'matière
tb(lig, 5) = .Name 'année
tb(lig, 6) = t(ligne, 6) 'heure
End If
clé2 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 3)
If Not d2.exists(clé2) Then
tb(lig, 3) = tb(lig, 3) & t(ligne, 3) & " ,": d2(clé2) = "" 'classe
End If
clé3 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 4)
If Not d3.exists(clé3) Then
tb(lig, 4) = tb(lig, 4) & t(ligne, 4) & " ,": d3(clé3) = "" 'groupe
End If
Next ligne
End If
End With
With Sheets("Synthèse")
If Not .ListObjects(1).DataBodyRange Is Nothing Then .ListObjects(1).DataBodyRange.Delete
.ListObjects(1).InsertRowRange.Cells(1).Resize(d1.Count - 1, Ncol) = tb
.ListObjects(1).Sort.SortFields.Clear
.ListObjects(1).ListColumns(1).Range.Sort Key1:=.ListObjects(1).HeaderRowRange.Cells(1, 1), Header:=xlYes
.Columns.AutoFit
.Activate
End With
End SubBonsoir à tous,
Je réponds à ceci :
Maintenant l'idée est de rassembler les lignes qui ont les mêmes "Prof", "Matière", "Année" et "Heure" en faisant en sorte que les différences dans les colonnes "Classes" et "Groupes" soit concaténées seulement si elles sont différentes.
drmath4, je me suis basé sur la feuille Recap pour fusionner vos lignes, c'est bien ça.
Donc pas de doublons en colonnes Classes et groupes, on forme la clé du dictionnaire avec les éléments des colonnes Prof, Matière, Année et Heure.
Option Explicit
Sub Fusion()
Dim a, b(), i As Long, txt As String
a = Sheets("Recap").Cells(1).CurrentRegion.Value
ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
b(1, 1) = a(1, 1): b(1, 2) = a(1, 2): b(1, 3) = a(1, 3)
b(1, 4) = a(1, 4): b(1, 5) = a(1, 5): b(1, 6) = a(1, 6)
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For i = 2 To UBound(a, 1)
txt = Join(Array(a(i, 1), a(i, 2), a(i, 5), a(i, 6)), Chr(2))
If Not .exists(txt) Then
b(.Count + 2, 1) = a(i, 1): b(.Count + 2, 2) = a(i, 2)
b(.Count + 2, 5) = a(i, 5): b(.Count + 2, 6) = a(i, 6)
.Item(txt) = Array(.Count + 2, CreateObject("Scripting.Dictionary"), _
CreateObject("Scripting.Dictionary"))
.Item(txt)(1).CompareMode = 1: .Item(txt)(2).CompareMode = 1
End If
If Not .Item(txt)(1).exists(a(i, 3)) Then
b(.Item(txt)(0), 3) = b(.Item(txt)(0), 3) & _
IIf(b(.Item(txt)(0), 3) <> "", ",", "") & a(i, 3)
.Item(txt)(1)(a(i, 3)) = Empty
End If
If Not .Item(txt)(2).exists(a(i, 4)) Then
b(.Item(txt)(0), 4) = b(.Item(txt)(0), 4) & _
IIf(b(.Item(txt)(0), 4) <> "", ",", "") & a(i, 4)
.Item(txt)(2)(a(i, 4)) = Empty
End If
Next
i = .Count + 1
End With
Application.ScreenUpdating = False
With Sheets("Feuil1").Cells(1).Resize(i, 6) 'restitution
.CurrentRegion.Clear
.Value = b
With .Font
.Name = "calibri"
.Size = 10
End With
.VerticalAlignment = xlCenter
.Borders(xlInsideVertical).Weight = xlThin
.BorderAround Weight:=xlThin
With .Rows(1)
.BorderAround Weight:=xlThin
.Interior.ColorIndex = 40
End With
End With
Application.ScreenUpdating = True
End SubRestitution dans une feuille nommée Feuil1.
On doit pouvoir obtenir le même résultat avec Power Query non !
klin89
Bonsoir à tous,
@Klin89:
Je suis admiratif de ta maitrise des dictionnaires, je constate qu'il me reste encore beaucoup de travail pour les maitriser convenablement,
Tu as traité à partir de la feuille Recap, peux-tu effectuer ce même traitement directement à partir de la feuille 2ème ?
@drmath4 :
A partir de ton dernier fichier,
Si j'arrivais bien à supprimer le dernier caractère de groupe à partir du dico, je n'y suis pas parvenu pour classe (
Option Explicit
Sub recap()
Dim ligne%, n%, i%, y%, lig%
Dim Ncol%, col%, cl%, c%
Dim d1, d2, d3, d4, clé1, clé2, clé3
Dim groupe$
Dim t(), tb()
Application.ScreenUpdating = False
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
Set d3 = CreateObject("Scripting.Dictionary")
Ncol = 6
With Sheets("2ème")
ReDim t(1 To .UsedRange.Rows.Count * Ncol, 1 To Ncol)
For y = 2 To 25
For i = 7 To 25 Step 2
If .Cells(i, y) <> "" Then
col = .Cells(i, y).MergeArea.Columns.Count
cl = .Cells(i, y).MergeArea.Column
c = 1
Do While c <= col
groupe = groupe & .Cells(4, cl + c - 1) & "/"
c = c + 1
Loop
n = n + 1
t(n, 1) = .Cells(i, y) '...........................prof
t(n, 2) = .Cells(i - 1, y) '.......................matière
t(n, 3) = .Cells(1, y).MergeArea.Cells(1, 1) '.....classe
t(n, 4) = groupe: groupe = "" '...................groupe
t(n, 5) = .Name '..................................année
t(n, 6) = .Cells(i - 1, 1) '.......................heure
End If
Next i
Next y
If n > 0 Then
ReDim tb(1 To UBound(t), 1 To Ncol)
For ligne = 1 To UBound(t)
clé1 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 6)
If d1.exists(clé1) Then
lig = d1(clé1)
Else
d1(clé1) = d1.Count + 1: lig = d1.Count
tb(lig, 1) = t(ligne, 1) '......................prof
tb(lig, 2) = t(ligne, 2) '......................matière
tb(lig, 5) = .Name '............................année
tb(lig, 6) = t(ligne, 6) 'heure
End If
clé2 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 3)
If Not d2.exists(clé2) Then
tb(lig, 3) = tb(lig, 3) & t(ligne, 3) & " ,": d2(clé2) = "" 'classe
End If
clé3 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 4)
If Not d3.exists(clé3) Then
tb(lig, 4) = tb(lig, 4) & t(ligne, 4): d3(clé3) = "" 'groupe
End If
Next ligne
End If
End With
With Sheets("Synthèse")
With .ListObjects(1)
If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
.InsertRowRange.Cells(1).Resize(d1.Count - 1, Ncol) = tb
.Sort.SortFields.Clear
.ListColumns(1).Range.Sort Key1:=.HeaderRowRange.Cells(1, 1), Header:=xlYes
For lig = 1 To .ListRows.Count
.DataBodyRange(lig, 3) = Left(.DataBodyRange(lig, 3), Len(.DataBodyRange(lig, 3)) - 1) 'retire la dernière , de classe
.DataBodyRange(lig, 4) = Left(.DataBodyRange(lig, 4), Len(.DataBodyRange(lig, 4)) - 1) 'retire le dernier / de groupe
Next lig
End With
.Columns.AutoFit
.Activate
End With
End SubComme tu n'as pas énormément de lignes, le temps d'exécution ne devrait pas être impacté.
[EDIT]
Cordialement,
Re xorsankukai,
Dans le code précédent, le dictionnaire enfant nous permet de tester la présence des doublons en colonnes Classes et Groupes pour les supprimer.
Le code suivant délesté de ces 2 dictionnaires laisse apparaître les doublons.
Option Explicit
Sub Fusion1()
Dim a, b(), i As Long, txt As String
a = Sheets("Recap").Cells(1).CurrentRegion.Value
ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
b(1, 1) = a(1, 1): b(1, 2) = a(1, 2): b(1, 3) = a(1, 3)
b(1, 4) = a(1, 4): b(1, 5) = a(1, 5): b(1, 6) = a(1, 6)
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For i = 2 To UBound(a, 1)
txt = Join(Array(a(i, 1), a(i, 2), a(i, 5), a(i, 6)), Chr(2))
If Not .exists(txt) Then
b(.Count + 2, 1) = a(i, 1): b(.Count + 2, 2) = a(i, 2)
b(.Count + 2, 5) = a(i, 5): b(.Count + 2, 6) = a(i, 6)
.Item(txt) = .Count + 2
End If
b(.Item(txt), 3) = b(.Item(txt), 3) & _
IIf(b(.Item(txt), 3) <> "", ",", "") & a(i, 3)
b(.Item(txt), 4) = b(.Item(txt), 4) & _
IIf(b(.Item(txt), 4) <> "", ",", "") & a(i, 4)
Next
i = .Count + 1
End With
Application.ScreenUpdating = False
With Sheets("Feuil1").Cells(1).Resize(i, 6) 'restitution
.CurrentRegion.Clear
.Value = b
With .Font
.Name = "calibri"
.Size = 10
End With
.VerticalAlignment = xlCenter
.Borders(xlInsideVertical).Weight = xlThin
.BorderAround Weight:=xlThin
With .Rows(1)
.BorderAround Weight:=xlThin
.Interior.ColorIndex = 40
End With
End With
Application.ScreenUpdating = True
End SubQuand on compare les 2 codes, c'est assez simple à comprendre finalement.
klin89
Bonjour à tous,
Merci pour vos retours. J'ai un peu trituré vos 2 propositions et au final, je m'en suis un peu mieux sorti avec le code de xorsankukai.
Du coup, il fait bien tout ce que je veux faire mais j'ai eu une nouvelle idée de colonnes pour laquelle j'ai évidemment un problème (Ben tiens ! :-D)
La nouvelle colonne donne le nombre total d'élève devant le prof. Je me suis basé sur les lignes qui géraient les groupes puisque ces 2 infos sont liées mais sans succès. Pourriez-vous m'aider à trouver le problème dans mon code ? (Il marche pour certains profs/matières mais pas pour tous. Exemple : Dupond en Socio-Eco en heure 1)
Sub collecte_donnees()
Dim ligne%, n%, i%, y%, lig%, eleve%
Dim Ncol%, col%, cl%, c%
Dim d1, d2, d3, d4, clé1, clé2, clé3, clé4
Dim groupe$
Dim t(), tb()
Dim k As Long
Application.ScreenUpdating = False
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
Set d3 = CreateObject("Scripting.Dictionary")
Set d4 = CreateObject("Scripting.Dictionary")
Ncol = 7
eleve = 0
With Sheets(1)
ReDim t(1 To .UsedRange.Rows.Count * Ncol, 1 To Ncol)
For y = 2 To 52
For i = 7 To 80 Step 2
If .Cells(i, y) <> "" Then
col = .Cells(i, y).MergeArea.Columns.Count
cl = .Cells(i, y).MergeArea.Column
c = 1
Do While c <= col
groupe = groupe & .Cells(4, cl + c - 1) & ", "
eleve = eleve + .Cells(5, cl + c - 1).Value
c = c + 1
Loop
n = n + 1
t(n, 1) = .Cells(i, y) '...........................prof
t(n, 2) = .Cells(i - 1, y) '.......................matière
t(n, 3) = .Cells(1, y).MergeArea.Cells(1, 1) '.....classe
t(n, 4) = groupe: groupe = "" '...................groupe
t(n, 5) = .Name '..................................année
t(n, 6) = .Cells(i - 1, 1) '.......................heure
t(n, 7) = eleve: eleve = 0 '...................nombre d'élèves
End If
Next i
Next y
If n > 0 Then
ReDim tb(1 To UBound(t), 1 To Ncol)
For ligne = 1 To UBound(t)
clé1 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 6)
If d1.exists(clé1) Then
lig = d1(clé1)
Else
d1(clé1) = d1.Count + 1: lig = d1.Count
tb(lig, 1) = t(ligne, 1) '......................prof
tb(lig, 2) = t(ligne, 2) '......................matière
tb(lig, 5) = .Name '............................année
tb(lig, 6) = t(ligne, 6) 'heure
End If
clé2 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 3)
If Not d2.exists(clé2) Then
tb(lig, 3) = tb(lig, 3) & t(ligne, 3) & ", ": d2(clé2) = "" 'classe
End If
clé3 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 4)
If Not d3.exists(clé3) Then
tb(lig, 4) = tb(lig, 4) & t(ligne, 4): d3(clé3) = "" 'groupe
End If
clé4 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 7)
If Not d4.exists(clé4) Then
tb(lig, 7) = tb(lig, 7) + t(ligne, 7): d4(clé4) = 0 'Nb élèves
End If
Next ligne
End If
End With
With Sheets("Recap Profs")
With .ListObjects(1)
If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
.InsertRowRange.Cells(1).Resize(d1.Count - 1, Ncol) = tb
.Sort.SortFields.Clear
.ListColumns(1).Range.Sort Key1:=.HeaderRowRange.Cells(1, 6), Header:=xlYes
For lig = 1 To .ListRows.Count
.DataBodyRange(lig, 3) = Left(.DataBodyRange(lig, 3), Len(.DataBodyRange(lig, 3)) - 2) 'retire la dernière , de classe
.DataBodyRange(lig, 4) = Left(.DataBodyRange(lig, 4), Len(.DataBodyRange(lig, 4)) - 2) 'retire le dernier / de groupe
Next lig
End With
.Columns.AutoFit
.Activate
End With
End SubMerci !
Bonjour à tous,
A tester:
Sub collecte_donnees()
Dim ligne%, n%, i%, y%, lig%, eleve%
Dim Ncol%, col%, cl%, c%
Dim d1, d2, d3, clé1, clé2, clé3
Dim groupe$
Dim t(), tb()
Dim k As Long
Application.ScreenUpdating = False
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
Set d3 = CreateObject("Scripting.Dictionary")
Ncol = 7
eleve = 0
With Sheets(1)
ReDim t(1 To .UsedRange.Rows.Count * Ncol, 1 To Ncol)
For y = 2 To 25
For i = 7 To 25 Step 2
If .Cells(i, y) <> "" Then
col = .Cells(i, y).MergeArea.Columns.Count
cl = .Cells(i, y).MergeArea.Column
c = 1
Do While c <= col
groupe = groupe & .Cells(4, cl + c - 1) & ", "
eleve = eleve + .Cells(5, cl + c - 1).Value
c = c + 1
Loop
n = n + 1
t(n, 1) = .Cells(i, y) '...........................prof
t(n, 2) = .Cells(i - 1, y) '.......................matière
t(n, 3) = .Cells(1, y).MergeArea.Cells(1, 1) '.....classe
t(n, 4) = groupe: groupe = "" '...................groupe
t(n, 5) = .Name '..................................année
t(n, 6) = .Cells(i - 1, 1) '.......................heure
t(n, 7) = eleve: eleve = 0 '.......................nombre d'élèves
End If
Next i
Next y
If n > 0 Then
ReDim tb(1 To UBound(t), 1 To Ncol)
For ligne = 1 To UBound(t)
clé1 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 6)
If d1.exists(clé1) Then
lig = d1(clé1)
Else
d1(clé1) = d1.Count + 1: lig = d1.Count
tb(lig, 1) = t(ligne, 1) '......................prof
tb(lig, 2) = t(ligne, 2) '......................matière
tb(lig, 5) = .Name '............................année
tb(lig, 6) = t(ligne, 6) '......................heure
End If
clé2 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 3)
If Not d2.exists(clé2) Then
tb(lig, 3) = tb(lig, 3) & t(ligne, 3) & ", ": d2(clé2) = "" 'classe
End If
clé3 = t(ligne, 1) & "|" & t(ligne, 2) & "|" & t(ligne, 5) & "|" & t(ligne, 6) & "|" & t(ligne, 4)
If Not d3.exists(clé3) Then
tb(lig, 4) = tb(lig, 4) & t(ligne, 4): d3(clé3) = "" 'groupe
End If
tb(lig, 7) = tb(lig, 7) + t(ligne, 7)
Next ligne
End If
End With
With Sheets("Recap Profs")
With .ListObjects(1)
If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
.InsertRowRange.Cells(1).Resize(d1.Count - 1, Ncol) = tb
.Sort.SortFields.Clear
.ListColumns(1).Range.Sort Key1:=.HeaderRowRange.Cells(1, 6), Header:=xlYes
For lig = 1 To .ListRows.Count
.DataBodyRange(lig, 3) = Left(.DataBodyRange(lig, 3), Len(.DataBodyRange(lig, 3)) - 2) 'retire la dernière , de classe
.DataBodyRange(lig, 4) = Left(.DataBodyRange(lig, 4), Len(.DataBodyRange(lig, 4)) - 2) 'retire le dernier / de groupe
Next lig
End With
.Columns.AutoFit
.Activate
End With
End SubJ'ai supprimé le dictionnaire d4....
Cordialement,
Magnifique ! Ça m'a l'air de bien fonctionné :-)
Merci !