Se connecter avec
S'enregistrer | Connectez-vous

Aide Macro Excel fusion doublons

Dernière réponse : dans Programmation

Bonjour,

je dois réaliser une base de données sous Excel et je voudrais supprimer des doublons.

Pour faire simple j'ai quelquechose du genre:

Date / Heure / A / B / C / D
12/10/1997 / 12:00 / 1 / / / 10
12/10/1997 / 12:00 / / 5 / /
12/10/1997 / 15:30 / / 1 / 2 / 10

J'ai donc adapté une macro qui avait été proposée il y a quelques temps sur le forum pour un problème de ce type.

J'ai ainsi pu prendre compte le fait que dans mon cas, il faille comparer à la fois la date et l'heure avant de fusionner les lignes.

Mais ce qui me gène c'est que lorsque deux cellules sont vides au départ pour une même date (ici C2 et C3), j'obtiens au final la valeur 0 (vu que la macro utilise une somme), alors que je voudrais conserver une cellule vide dans ce cas (la valeur 0 a en effet une signification dans ma base de données, qui est différente de l'absence de valeur)...

Quelqu'un pourrait m'aider dans la syntaxe à utiliser pour cela?

Si je n'ai pas été assez clair, n'hésitez pas à demander des précisions!

Merci par avance aux âmes charitables qui pourraient au moins me mettre sur la piste de la solution.


Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Ah, voilà qui est mieux !

Je déclare les variables, je retire les parenthèses inutiles (C'est pas du C, c'est du VB), je vérifie si l'une des deux cellules est non vide, et si c'est le cas, j'additionne.

Ça donne :
  1. Dim derli As Long
  2. Dim i As Long
  3. Dim j As Long
  4.  
  5. derli = Columns(1).Find("*", , , , , xlPrevious).Row
  6.  
  7. For i = derli To 2 Step -1
  8. If Cells(i, 1) = Cells(i - 1, 1) And Cells(i, 2) = Cells(i - 1, 2) Then
  9. For j = 3 To 21
  10. If Cells(i - 1, j) <> "" Or Cells(i, j) <> "" Then
  11. Cells(i - 1, j) = Cells(i - 1, j) + Cells(i, j)
  12. End If
  13. Next
  14. Range(Cells(i, 1), Cells(i, 21)).Delete Shift:=xlUp
  15. End If
  16. Next


Comment Diable n'y as-tu pas pensé toi-même ?

-------------

Tips: Déclare systématiquement tes variables, et renseigne-toi sur l'Option Explicit.

Je précise que le précédent sujet dont je me suis servi est intitulé :
Citation :
Aide macro excel pour fusionner doublons


Une macro y est proposée pour résoudre la question de la fusion des doublons, mais elle génère des 0 lorsque deux cases à fusionner étaient initialement vides.
Expert Programmation

Salut Djorge84,

Donne un lien vers le sujet précédent, ou mieux, copie le code que tu as adapté ici.

Attention de bien respecter les règles de publication de code : utilise les balises [code][/code].

Bonjour,

voilà le code que j'ai adapté.

  1. Sub Test()
  2. 'Recherche de la dernière ligne de la colonne A
  3. derli = Columns(1).Find("*", , , , , xlPrevious).Row
  4. ' boucle qui commence à la fin à cause des suppression de cellules
  5. For i = derli To 2 Step -1
  6. 'Si la valeur de la cellule au dessus est égale à la valeur de la cellule (colonne A) alors
  7. If (Cells(i, 1) = Cells(i - 1, 1) And Cells(i, 2) = Cells(i - 1, 2)) Then
  8. 'on additionne les deux montants dans la cellule "au-dessus"
  9. Cells(i - 1, 3) = Cells(i - 1, 3) + Cells(i, 3)
  10. Cells(i - 1, 4) = Cells(i - 1, 4) + Cells(i, 4)
  11. Cells(i - 1, 5) = Cells(i - 1, 5) + Cells(i, 5)
  12. Cells(i - 1, 6) = Cells(i - 1, 6) + Cells(i, 6)
  13. Cells(i - 1, 7) = Cells(i - 1, 7) + Cells(i, 7)
  14. Cells(i - 1, 8) = Cells(i - 1, 8) + Cells(i, 8)
  15. Cells(i - 1, 9) = Cells(i - 1, 9) + Cells(i, 9)
  16. Cells(i - 1, 10) = Cells(i - 1, 10) + Cells(i, 10)
  17. Cells(i - 1, 11) = Cells(i - 1, 11) + Cells(i, 11)
  18. Cells(i - 1, 12) = Cells(i - 1, 12) + Cells(i, 12)
  19. Cells(i - 1, 13) = Cells(i - 1, 13) + Cells(i, 13)
  20. Cells(i - 1, 14) = Cells(i - 1, 14) + Cells(i, 14)
  21. Cells(i - 1, 15) = Cells(i - 1, 15) + Cells(i, 15)
  22. Cells(i - 1, 16) = Cells(i - 1, 16) + Cells(i, 16)
  23. Cells(i - 1, 17) = Cells(i - 1, 17) + Cells(i, 17)
  24. Cells(i - 1, 18) = Cells(i - 1, 18) + Cells(i, 18)
  25. Cells(i - 1, 19) = Cells(i - 1, 19) + Cells(i, 19)
  26. Cells(i - 1, 20) = Cells(i - 1, 20) + Cells(i, 20)
  27. Cells(i - 1, 21) = Cells(i - 1, 21) + Cells(i, 21)
  28. 'on supprime les cellules
  29. Range(Cells(i, 1), Cells(i, 21)).Delete Shift:=xlUp
  30. End If
  31. Next
  32. End Sub


En fait en y réfléchissant, j'aimerai avoir autre chose qu'une addition de deux lignes pour obtenir leur fusion. Car je pense que lorsque deux lignes font doublons et sont fusionnées au moyen d'une addition, on obtiendra tout le temps un 0 lorsque deux cellules additionnées étaient vides au départ... Mais je ne vois pas comment faire n'étant que débutant en macro...
Expert Programmation

Euh....

Il y a longtemps que tu programmes ?
Parce que 19 lignes identiques à un chiffre près, ça mériterait une petite boucle !

D'autant que je serais tenté d'ajouter 2 tests pour vérifier le contenu de tes cellules avant de faire l'addition. Si on garde ce code, ça fait 38 lignes de plus :pt1cable: 

Bon, tu me refais ça, et je te montre comment faire ;) 

---------------------

Tiens, tu as utilisé Find(). Comme j'ai l'habitude de faire autrement, je n'y pense jamais. Grâce à toi, j'ai ajouté cette façon de faire aux Trucs et astuces.

bon je pense que comme ça, c'est mieux effectivement ;) 

  1. Sub Test()
  2. 'Recherche de la dernière ligne de la colonne A
  3. derli = Columns(1).Find("*", , , , , xlPrevious).Row
  4. ' boucle qui commence à la fin à cause des suppression de cellules
  5. For i = derli To 2 Step -1
  6. 'Si la valeur de la cellule au dessus est égale à la valeur de la cellule (colonne A) alors
  7. If (Cells(i, 1) = Cells(i - 1, 1) And Cells(i, 2) = Cells(i - 1, 2)) Then
  8. 'on additionne les deux montants dans la cellule "au-dessus"
  9. For j = 3 To 21
  10. Cells(i - 1, j) = Cells(i - 1, j) + Cells(i, j)
  11. Next
  12. 'on supprime les cellules
  13. Range(Cells(i, 1), Cells(i, 21)).Delete Shift:=xlUp
  14. End If
  15. Next
  16. End Sub


Désolé pour la version précédente du code, j'imagine que ça doit choquer des codeurs avertis! :lol: 

Donc maintenant si tu as une solution, tu me sauves!

merci beaucoup pour le coup de main.

Si je comprends bien, dans le cas où la condition que tu as rajouté pour vérifier si l'une des deux cellules est vide n'est pas vérifiée, le code fait juste du copier/coller d'une ligne à l'autre, c'est ça? Je croyais en fait qu'il fallait lui donner un truc à faire du genre un Else...

EN tout cas je vais m'attacher à déclarer mes variables. J'avoue quand même qu'en VB je ne connais pas la syntaxe, maisje vais m'y pencher sans faute! Et je vais suivre ton conseil concernant l'Option Explicit.

Merci encore!
Expert Programmation

Citation :
si l'une des deux cellules est non vide n'est pas vérifiée

Attention à l'algèbre de Boole et aux lois de Morgan. Une négation inversée et il faut changer les Et en Ou et vice-versa !
:o 

Lassé par la pub ? Créez un compte