problème Assembler des données VBA
Bonjour, Bonjour,
Je dispose d'un classeur Excel dans lequel je dois regrouper les lignes du classeur selon des conditions sur les colonnes. Par exemple :
1 - je prends la première ligne du fichier
2 - je compare les éléments de colonnes suivants : le prix, le libelle, le code client
3 - s'ils sont égaux, j'assemble toutes les lignes ensemble ensuite, je décale deux lignes et je recommence
Grâce à l'aide Tauthème, j'ai obtenu ce code :
Code:
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
| Sub Macro1()
Dim D As Object 'déclare la variable ND (Dictionnaire)
Dim CC As String 'déclare la variable CC (Concaténation de Colonnes)
Dim TL() As Variant 'déclare la variable TL (Tableai de Lignes)
Dim I As Long 'déclare la variable I (Incrément de lignes)
Dim J As Integer 'déclare la variable J (incrément de lignes)
Dim K As Long 'déclare la variable K (incrément de lignes)
Dim L As Integer 'déclare la variable L (incrément de colonnes)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Set OS = Sheets("Feuil1") 'définit l'onglet source OS (à adapter)
Set OD = Sheets("Feuil2") 'définit l'onglet destination OD (à adapter)
TC = OS.Range("A1").CurrentRegion 'définit le tableau de cellules TC (à adapter)
NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellulles TC
NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellulles TC
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionaire D
For I = 2 To NL 'boucle sur toutes les ligne du tableau de cellues TC (en partant de la seconde)
'définit la concaténation CC
'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
CC = CStr(TC(I, 1)) & CStr(TC(I, 2)) & CStr(TC(I, 3))
D(CC) = D(CC) + 1 'alimente le dictionnaire avec le concaténation CC
Next I 'prichaine ligne de la boucle
TE = D.keys 'récupère tableau TE (Tableau des Éléments) les éléments du dictionnaire D sabs doiblon
TOC = D.items 'récupère tableau TOC (Tableau des OCcurrences) le nombre d'occurrence de chaque élément de TE
For I = LBound(TE) To UBound(TE) 'boucle sur tous les éléments de TE
If TOC(I) > 1 Then 'condition 1 : si l'élément a plusieurs occurrences
K = 1 'initialise la variable K
For J = 2 To NL 'boucle 1 sur toutes les lignes J du tableau de cellules TC (en partant de la seconde)
'condition 2 : si la concaténation des colonne 1 deux et trois est égale à TE(I)
'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
If CStr(TC(J, 1)) & CStr(TC(J, 2)) & CStr(TC(J, 3)) = TE(I) Then
'redimensionne le tableau de lignes TL (autant de ligne que TC a de colonnes,K colonnes)
ReDim Preserve TL(1 To NC, 1 To K)
For L = 1 To NC 'boucle 2 : sur toutes les colonnes de TC
TL(L, K) = TC(J, L) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition)
Next L 'prochaine colonne de la boujcle 2
K = K + 1 'incrémente K
End If 'fin de la condition 2
Next J 'prochaien ligne de la boucle 1
If K > 1 Then 'condition 3 : si K est supérieur à 1 (au moins une occurrence trouvée)
'définit la cellue de destination DEST
Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(3, 0))
'revoie dans DEST redinensionnée le tableau TL transposé
DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End If 'fin de la condition 3
Erase TL 'vide le tableau TL
End If 'fin de la condition 1
Next I 'prochain élément du tableau TE
End Sub |
il permet de rassembler toutes les lignes contenant plusieurs occurences. Le hic, c'est qu'il met trop temps (Bizarre, vu qu'il n'utilise que les tableaux), je l'ai lancé depuis 15h52, il est 16h54 et je n'ai toujours pas de réponses !
Mon but est de créer des périmètres (un ou plusieurs pour chaque groupe d'entreprises) ! Joe m'a alors suggéré de créer des classeurs par groupe avant de faire le traitement à l'aide d'un clic !
J'ai créé une macro qui créé un classeur qui fait un filtre sur la valeur de la cellule lorsqu'on clique sur un élément de la colonne "groupe" et créé un nouveau classeur ! Premier hic : la fonction ne me copie pas toutes les lignes, je ne comprends vraiment pas pourquoi ? le code ci-dessous :
Code:
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
| Dim WsCible As Worksheet
Dim WsSOurce As Worksheet
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Set WsSOurce = ThisWorkbook.Worksheets("RT_SANTE_FIC_COMPLETE")
On Error Resume Next: WsSOurce.ShowAllData: On Error GoTo 0
Nbl = WsSOurce.Range("E1").CurrentRegion.Rows.Count
If Not Intersect(Target, Range("E1:E" & Nbl)) Is Nothing Then
If FeuilleExiste(Target.Value) Then
MsgBox ("La feuille associée à ce groupe existe déjà")
Else
Set WsCible = ThisWorkbook.Sheets.Add(After:=WsSOurce)
WsCible.Name = Target.Value
Nbl1 = WsCible.Range("A1").CurrentRegion.Rows.Count
End If
Application.ScreenUpdating = False
Set filtre = Workbooks.Add
filtre.Sheets(1).Range("A1") = "GROUPE"
filtre.Sheets(1).Range("A2") = Target.Value
FiltreActif WsSOurce.UsedRange, filtre.Sheets(1).UsedRange, WsCible.Range("A1")
filtre.Close False
Set filtre = Nothing
Application.ScreenUpdating = True
End If
End Sub |
Merci d'avance pour votre aide !