Bonjour,
J'ai une feuille excel qui contient des identifiants ainsi que leurs attributs.
Pour chaque valeur d'un attribut, la ligne sera dupliqué (voir le premier tableau).
Je souhaite simplifier mon tableau afin d'obtenir une ligne pour chaque identifiant (voir le deuxieme tableau), sachant que :
-si la meme valeur de l'attribut se represente pour un identifiant -> je ne la rajoute plus
-ne pas rajouter les valeurs nulles
-ne pas effacer les lignes avant d'avoir tourner cet algo pour touts les autres attributs
En pj un exemple qui illustre le resultat attendu.
J'ai fais le code suivant qui fonctionne plutot bien:
J'ai fait le meme algo pour tout les attributs (avant de faire le EntireRow.delete) mais ca fait une centaine de ligne de code!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 lngRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row For x = 2 To lngRow If ActiveSheet.Cells(x, 1).Value <> "" Then aux = VBA.CInt(ActiveSheet.Cells(x, 1).Value) aux_init = ActiveSheet.Cells(x, 2).Value aux_Attr1 = ActiveSheet.Cells(x, 2).Value y = x + 1 For y = lngRow To x + 1 Step -1 If ActiveSheet.Cells(y, 1) = aux Then If ActiveSheet.Cells(y, 2).Value <> aux_Attr1 And ActiveSheet.Cells(y, 2).Value <> aux_init Then aux_Attr1 = ActiveSheet.Cells(y, 2).Value If ActiveSheet.Cells(x, 2) <> "" And ActiveSheet.Cells(y, 2) <> "" Then ActiveSheet.Cells(x, 2) = ActiveSheet.Cells(x, 2) & ";" & ActiveSheet.Cells(y, 2) ElseIf ActiveSheet.Cells(x, 2) = "" And ActiveSheet.Cells(y, 2) <> "" Then ActiveSheet.Cells(x, 6) = ActiveSheet.Cells(x, 2) & ActiveSheet.Cells(y, 2) End If End If ActiveSheet.Rows(y).EntireRow.Delete End If Next y End If Next x
Ca fonctionne bien sauf que pour effectuer le meme algo (mais entre deux chaines de caratere au lieu des colonnes ) Marc-L m'avait aidé a simplifier mon code, en creant une fonction de 5 lignes de code
J'essaye d'adapter cette fonction pour mon exemple mais j'y arrive pas ( vu que les methodes s'appliquent juste sur les chaines de caract' )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Function Completer$(ByVal S1$, ByVal S2$) Dim SP$() SP = Split(S1, ",") For Each MOT In Split(S2, ",") If IsError(Application.Match(MOT, SP, 0)) Then ReDim Preserve SP(UBound(SP) + 1) SP(UBound(SP)) = MOT End If Next Completer = Join(SP, ",") End Function Private Sub demo() Cells(5, 3).Value = Completer(Cells(5, 3).Value, Cells(4, 3).Value) End Sub
J'aimerais simplifier mon algo avec une fonction pareil, qui prend juste les numero de colonnes en input, les comparent, et fait la concatenation pour les attributs.
Merci pour tout aide!
Partager