Fusion de lignes sous plusieurs conditions

Résolu/Fermé
Pompom974 Messages postés 20 Date d'inscription lundi 15 juin 2015 Statut Membre Dernière intervention 9 août 2015 - 30 juil. 2015 à 23:27
Pompom974 Messages postés 20 Date d'inscription lundi 15 juin 2015 Statut Membre Dernière intervention 9 août 2015 - 9 août 2015 à 16:43
Bonjour tout le monde !
Je fais appel à vous car je ne sais vraiment pas comment faire... Je suis débutante en VBA, mais grâce à mon stage j'ai pu apprendre quelques notions.

Je viens vers vous car j'ai un problème que je n'arrive pas à résoudre, malgré de multiples essais.
J'ai un classeur excel avec plusieurs colonnes : un numéro 1, un nom de produit, un deuxième numéro, des quantités et des dates.
Je voudrais fusionner des cellules si les numéros de la colonne A sont les mêmes, et si les numéros de la colonne C sont les mêmes. Je voudrais également sommer les quantités des cellules que je fusionne, et dans la colonne date, conserver la date la plus récente.

Voici un exemple du fichier de travail (c'est un fichier professionnel, et je ne peux donc pas le partager... Il contient 800 lignes et une 30aines de colonnes) :

A B C D E

Numéro1 Produit Numéro2 Quantité Date
4315955 Produit1 A4546545 1 12/09/2015
1314116 Produit2 B5465452 6 08/07/2015
4157819 Produit3 C6545454 5 04/09/2015
5548455 Produit4 D7874361 8 06/08/2015
4315955 Produit1 A4546545 1 17/05/2015
1314116 Produit2 B5465452 5 15/06/2015

Et voici le code que j'ai commencé à faire, et qui plante, mais je n'ai pas encore trouvé pourquoi (je me suis dit que ça devait être à cause du nombre de lignes présents dans le fichier et du nombre de boucles que je demandais à Excel de faire) :


Dim i As Integer

Dim EndLigFusion As Integer

EndLigFusion = .Range("B" & Rows.Count).End(xlUp).Row



Application.DisplayAlerts = False



For NumLig = EndLigFusion To 7 Step -1

For i = EndLigFusion To 8 Step -1



If .Range("B" & NumLig).Value = .Range("B" & i).Value And .Range("D" & NumLig).Value = .Range("D" & i).Value Then

.Range("B" & NumLig, "B" & i).Merge

.Range("D" & NumLig, "D" & i).Merge

.Range("E" & NumLig).Formula = .Range("E" & NumLig).Value + .Range("E" & i).Value



If .Range("O" & NumLig).Value > .Range("O" & i).Value Then

.Range("O" & NumLig).Value = .Range("O" & NumLig).Value

Else

.Range("O" & NumLig).Value = .Range("O" & i).Value

End If

End If

Next i

Next NumLig



En vous remerciant d'avance de vos réponses!
A voir également:

5 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
31 juil. 2015 à 08:43
Bonjour,

Est tu obligée de créer des celules fusionnées (les cellules fusionnées sont à éviter dans les automatisations Excel) surtout que l'on pourrait avoir une seule ligne en fonction des numéros...
mais comme on ne sait pas ce qu'il y a dans les 25 autres colonnes....
mais peut-^tre as tu besoin en retour qu'un taableau à 5 colonnes ?
0
Pompom974 Messages postés 20 Date d'inscription lundi 15 juin 2015 Statut Membre Dernière intervention 9 août 2015
31 juil. 2015 à 09:34
Alors non pas vraiment, les autres colonnes en fait sont les mêmes lorsque le produit est le même, il y a juste la quantité qui va changer et la date de livraison. Donc j'ai bien besoin de mon tableau de 25 colonnes, mais je me suis dit que comme les valeurs dans les cellules étaient les mêmes lorsque le produit est le même, je n'ai pas besoin de m'y intéresser.

J'ai besoin de fusionner les cellules pour effectuer un calcul sur un nombre de lignes, et si je ne les fusionne pas je compte donc des "lignes en trop" (à cause du coup des doublons de produit qui ont des quantités et des dates de livraison différente). La seule solution que j'avais trouvé pour éviter de compter ces lignes en trop et récupérer les informations dont j'ai besoin (notamment la date), c'était de fusionner les cellules de mon tableau sous certaines conditions... Mais si vous avez une autre idée, je ne dis pas non :$

Merci de votre réponse
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > Pompom974 Messages postés 20 Date d'inscription lundi 15 juin 2015 Statut Membre Dernière intervention 9 août 2015
Modifié par michel_m le 31/07/2015 à 12:00
re,
ok
je te propose une solution cet aprem ou demain matin...

edit 12:00h:
ton exemple est faux par rapport àton code !!! :-(

les quantités sont dans colonne D dans ton exemple et en E dans ton code
les dates sont dans colonne E dans ton exemple et O dans ton code...

donc, j'attend; vérifie bien que ta demande est exacte et complète: je ne recommence jamais un code dans le cas contraire
0
Pompom974 Messages postés 20 Date d'inscription lundi 15 juin 2015 Statut Membre Dernière intervention 9 août 2015
Modifié par Pompom974 le 31/07/2015 à 13:04
Oui, pardon, j'ai créé l'exemple rapidement après avoir écrit le code. Je le renvoie donc ici après l'avoir adapté à mon exemple :



Dim i As Integer
Dim EndLigFusion As Integer
EndLigFusion = .Range("A" & Rows.Count).End(xlUp).Row

Application.DisplayAlerts = False

For NumLig = EndLigFusion To 7 Step -1
For i = EndLigFusion To 8 Step -1

If .Range("A" & NumLig).Value = .Range("A" & i).Value And .Range("C" & NumLig).Value = .Range("C" & i).Value Then
.Range("A" & NumLig, "A" & i).Merge
.Range("C" & NumLig, "C" & i).Merge
.Range("D" & NumLig).Formula = .Range("D" & NumLig).Value + .Range("D" & i).Value

If .Range("E" & NumLig).Value > .Range("E" & i).Value Then
.Range("E" & NumLig).Value = .Range("E" & NumLig).Value
Else
.Range("E" & NumLig).Value = .Range("E" & i).Value
End If
End If
Next i
Next NumLig

Application.DisplayAlerts = True


0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
1 août 2015 à 11:44
Bonjour
ci joint proposition
avec durée du traitement 7/100 secondes pour 600 lignes

http://www.cjoint.com/c/EHbjR7xYDiY
0
Pompom974 Messages postés 20 Date d'inscription lundi 15 juin 2015 Statut Membre Dernière intervention 9 août 2015
2 août 2015 à 12:05
Merci beaucoup michel_m pour ton aide. Je ne pourrais tester le code sur mes données que demain, sur mon ordinateur de bureau, mais je te remercie de la rapidité de ta réponse et de ton aide précieuse.

Je te souhaite une bonne journée !
Merci encore !
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 6/08/2015 à 10:56
annulé
Michel
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pompom974 Messages postés 20 Date d'inscription lundi 15 juin 2015 Statut Membre Dernière intervention 9 août 2015
9 août 2015 à 16:43
Désolée de ne pas avoir répondu plus tôt... Donc je n'ai pas réussi à le faire fonctionner avec mon code, et je n'ai pas eu le temps de comprendre pourquoi.

Merci beaucoup de t'être dérangée pour moi, et désolée !!
0