Option Explicit
Option Base 1
Public Ws_Cible As Worksheet
Public Coll_ID As Collection
Public Nbr_RDv As Integer
Public Tab_Gen As Variant
Public Tab_Recup As Variant
Public Tab_Recap() As Variant
Public Tab_BY_ID() As Variant
Public DerLgn As Long
Public Lgn As Long
Public DerCol As Byte
Public Str_ID As String
Public x As Long
Public xx As Long
Public i As Integer
Public ii As Integer
Public iii As Integer
Public Sub Recap_ID()
Application.ScreenUpdating = False
Set Ws_Cible = Worksheets("Feuil1") 'on initialise la variable
Set Coll_ID = New Collection 'Initialise la Collection des Noms
x = 1: xx = 1 'on initialise les variables
With Ws_Cible 'avec la feuille ainsi definie
DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row 'on détermmine la derniere ligne non vide de la Colonne A(1) de la feuille Cible
DerCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 'on dtermine la Derniere colonne non vide de la premiere ligne
Tab_Gen = .Range(.Cells(2, 1), .Cells(DerLgn, DerCol)).Value 'on récupére les données de la palge ainsi définie dans un tableau
For Lgn = 1 To UBound(Tab_Gen, 1) 'pour chaque lignes du tableau
Nbr_RDv = Tab_Gen(Lgn, 2) 'on récupére le nombre de points
If InStr(1, Tab_Gen(Lgn, 1), ";") <> 0 Then 'si plusieurs ID
Tab_Recup = Split(Tab_Gen(Lgn, 1), ";") 'on les récuépre dans un tableau temporaire
Else
Tab_Recup(1) = Tab_Gen(Lgn, 1) 'si un seul nom on le récupére
End If
For i = 0 To UBound(Tab_Recup) 'pour chaque colonnes du tableau temporaire
ReDim Preserve Tab_Recap(2, x) 'on redimansionne le tableau 2 lignes x colonnes
Tab_Recap(1, x) = Trim(Tab_Recup(i)) 'on récupére le Contact
Tab_Recap(2, x) = Nbr_RDv 'on récuépre les Points
x = x + 1 'on incremente les colonnes du tableau temporaire
Next i
Next Lgn
'pour test
.Cells(1, 4) = "Contacts": .Cells(1, 5) = "rdv" 'on colle les entetes
.Range("D2").Resize(UBound(Tab_Recap, 2), 2) = Application.Transpose(Tab_Recap) 'ici on récupére la Liste des Rdv
'on va réunir les Rdv par Contact
On Error Resume Next 'gestion des erreurs
For ii = 1 To UBound(Tab_Recap, 2) 'pour chaque colonnees du tableau temporaire
Str_ID = UCase(Tab_Recap(1, ii)) 'on récupére le Contact
'**************
Coll_ID.Add Str_ID, CStr(Str_ID) 'on l'entre dans la collection des Contacts Unique
'**************
If Err.Number = 0 Then 'si contact pas encore dans la Collection
ReDim Preserve Tab_BY_ID(2, xx) 'on redimmansionne le tableau 2 lignes Toujours
Tab_BY_ID(1, xx) = Str_ID 'on colle le Contact sur la première ligne
For iii = 1 To UBound(Tab_Recap, 2) 'on va lister toutes les lignes pour vérifier si contact présent plusieurs fois
If UCase(Tab_Recap(1, iii)) = Str_ID Then 'si present
Tab_BY_ID(2, xx) = Tab_BY_ID(2, xx) + Tab_Recap(2, iii) 'on cumule les RDVs
End If
Next iii 'autre colonne
xx = xx + 1 'on incremente le Nombre de colonnes du tableau
End If
Err.Clear
Next ii
.Cells(1, 7) = "CONTACTS": .Cells(1, 8) = "RDV" 'on colle les entetes
.Range("G2").Resize(UBound(Tab_BY_ID, 2), 2) = Application.Transpose(Tab_BY_ID) 'on colle le tableau en l'inversant
End With
Application.ScreenUpdating = True
Erase Tab_Gen: Erase Tab_Recup: Erase Tab_Recup: Erase Tab_BY_ID 'on vide les tableaux
End Sub