Résolu Aide Macro Excel fusion doublons

Djorge84

Habitué
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.


 

Djorge84

Habitué
Je précise que le précédent sujet dont je me suis servi est intitulé :
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.
 

zeb

Modérateur
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:
[[i]/[/i]code].[/size]
 

Djorge84

Habitué
Bonjour,

voilà le code que j'ai adapté.

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

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...
 

zeb

Modérateur
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 .
 

Djorge84

Habitué
pour réponde à ta question (tu l'avais sans doute deviné), non ça ne fait pas longtemps que je programme...

Je suis même ultra débutant! :)

je vais essayer d'améliorer ça !
 

Djorge84

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

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

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!
 

zeb

Modérateur
Meilleure réponse
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 :
Code:
Dim derli As Long
Dim i     As Long
Dim j     As Long

derli = Columns(1).Find("*", , , , , xlPrevious).Row

For i = derli To 2 Step -1
    If Cells(i, 1) = Cells(i - 1, 1) And Cells(i, 2) = Cells(i - 1, 2) Then
        For j = 3 To 21
            If Cells(i - 1, j) <> "" Or Cells(i, j) <> "" Then
                Cells(i - 1, j) = Cells(i - 1, j) + Cells(i, j)
            End If
        Next
        Range(Cells(i, 1), Cells(i, 21)).Delete Shift:=xlUp
    End If
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.
 

Djorge84

Habitué
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!
 

zeb

Modérateur
si l'une des deux cellules est non vide [strike]n'[/strike]est [strike]pas[/strike] 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

Vous devez être connecté pour voir les images.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 845
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut