Supprimer les montant en double

10ninos06.zip (449.06 Ko)
Salut
vraiment je voudrais votre aide à mon problème
j'ai un fichier Excel qui dépasse 580.000 lignes

et je voudrais bien supprimer les montant en double et les dossier = 0

j'explique

1- supprimer les dossiers qui ont un total Zéro
2- supprimer les montant ( + - ) en double et qui ont le même numéro du dossier

Merci d'avance pour votre aide.

Bonjour,

Voici un essai avec la référence de la plage à adapter.

Je n'ai pas regardé le fichier. Ici, le code suppose que les numéros de dossier sont en colonne 1 et les montants en colonne 8. Il faudra également adapter cela dans le code :

sub dedoublonner()
set dico = createobject("Scripting.dictionary")
with activesheet.range("plage") '<<< ADAPTER
    t = .value2
    for i = lbound(t) to ubound(t)
        if t(i, 8) <> 0 and not dico.exists(t(i, 1) & "_" & t(i, 8)) then '<<< ADAPTER
            n = n + 1
            dico(t(i, 1) & "_" & t(i, 8)) = "" '<<< ADAPTER
            for k = lbound(t, 2) to ubound(t, 2)
                t(n, k) = t(i, k)
            next k
        end if
    next i
    .clearcontents
    if n > 0 then .resize(n, ubound(t, 2)).value2 = t
end with
end sub

Je n'ai aucune idée du temps que l'exécution pourra prendre...

Cdlt,

Merci 3GB pour ton soutien

mais j'arrive pas à adapter la plage à mon fichier

mes salutations

Attention, je viens de faire des toutes petites modifs sur le code avant ta réponse donc il faudra le recopier pour essayer...

Et bien supposons que tes données soient en A1:H580000, il faut mettre dans le code (ligne 3) :

with activesheet.range("A1:H580000")

Puis, pour les colonnes, j'ai considéré que le dossier était en première colonne de la plage et le montant en 8è colonne. Mais ce n'est probablement pas le cas, alors il faudra que tu modifies le 1 (dans chaque t(i, 1)) par la position de la colonne avec les dossiers et le 8 (dans chaque t(i, 8)) par la position de la colonne avec les montants.

La seule incertitude, c'est que tu as parlé de total. Or, j'écarte seulement dossiers avec un montant égal à 0 pour l'instant, sans calculer le total. Me suis-je trompé ?

Mr 3GB je vous joindre un autre fichier sans filtre et j'aimerai bien

si possible que tu applique le VB directe sur mon fichier

paracerque je suis novis en xls et ton soutien m'aide énormément

4ninos06-a.xlsx (10.89 Ko)

D'accord, tu veux supprimer les écritures soldées si je comprends bien ?

Peux-tu poster un exemple plus "réel", car j'aurai besoin d'un champ avec des valeurs uniques, le code opération peut-être...

Et je ne comprends pas ces montants négatifs ? Soit on a que des montants positifs, soit tous les montants négatifs sont rattachés à D et tous les montants positifs sont rattachés à C.

Cdlt,

tu veux supprimer les écritures soldées si je comprends bien ? oui

ça veut dire lorsque je totalise tout les montant négatifs ET positifs ( - + )
de la colonne Mvts et qui ont le même numéro du dossier
et nous donne un total 0 je supprime tout

et le 2 cas
supprimer les valeur ( - + ) qui ont le même montant et le même numéro dossier

Voici un nouvel essai :

Sub dedoublonner()

Application.Calculation = xlCalculationManual
Set dico = CreateObject("Scripting.dictionary")
With ActiveSheet.UsedRange
    t = .Value2
    ReDim temp(1 To UBound(t, 2))
    For i = LBound(t) To UBound(t)
        solde = Application.SumIf(.Columns(11), t(i, 11), .Columns(14))
        If solde <> 0 Then
            cle = t(i, 11) & "_" & Abs(t(i, 14))
            If Not dico.exists(cle) Then '<<< ADAPTER
                For k = LBound(temp) To UBound(temp)
                    temp(k) = t(i, k)
                Next k
                dico(cle) = temp
            Else
                dico.Remove cle
            End If
        End If
    Next i
    .ClearContents
    If dico.Count > 0 Then .Resize(dico.Count, UBound(t, 2)).Value2 = Application.Transpose(Application.Transpose(dico.items))
End With
Application.Calculation = xlCalculationAutomatic

End Sub

Je ne suis pas sûr qu'il réponde en totalité au besoin...

Cdlt,

Merci 3GB pour la solution

après l’exécution du vb sur mon fichier qui contient presque 61985 lignes

il a supprimer 54.295 ligne

mais le total de la colonne 14 a donné un montant erroné

merci pour votre soutien

et j’attends TJR votre aide

Salut ninos,

Ca y est, je pense que ce code sera concluant :

Sub dedoublonner()

Application.Calculation = xlCalculationManual
Set wf = WorksheetFunction
Set dico = CreateObject("Scripting.dictionary")
With ActiveSheet.Range("A2:P28") '<<<<<<<<<<<<<< ADAPTER REF DE LA PLAGE
    t = .Value2
    ReDim temp(1 To UBound(t, 2))
    For i = LBound(t) To UBound(t)
        solde = wf.SumIf(.Columns(11), t(i, 11), .Columns(14))
        If solde <> 0 Then
            cle = Join(Array(t(i, 11), IIf(t(i, 14) < 0, "D", "C"), _
                wf.CountIfs(.Columns(11).Resize(i), t(i, 11), .Columns(14).Resize(i), t(i, 14)), t(i, 14)), "_")
            cleinv = Join(Array(t(i, 11), IIf(t(i, 14) < 0, "C", "D"), _
                wf.CountIfs(.Columns(11).Resize(i), t(i, 11), .Columns(14).Resize(i), t(i, 14)), -t(i, 14)), "_")
            If Not dico.exists(cleinv) Then
                For k = LBound(temp) To UBound(temp)
                    temp(k) = t(i, k)
                Next k
                dico(cle) = temp
            Else
                dico.Remove cleinv
            End If
        End If
    Next i
    .ClearContents
    If dico.Count > 0 Then .Resize(dico.Count, UBound(t, 2)).Value2 = wf.Transpose(wf.Transpose(dico.items))
End With
Application.Calculation = xlCalculationAutomatic

End Sub

Celui-ci ne supprime que les lignes du montant opposé...

Je joins le fichier qui a servi à faire les tests mais c'est bien ce code qu'il faut utiliser à partir de la feuille contenant la base de données. Il faudra juste adapter la plage !

2ninos06-a-1.xlsm (26.78 Ko)

Bonjour 3GB, ninos066

Pas testé, n'ayant pas VBA sous la main.

J'ai surligné pour bien visualiser le problème posé.

Option Explicit
Sub test()
Dim a, i As Long, x As Range, e
    With Sheets("Sheet2").Cells(1).CurrentRegion
        .EntireRow.Interior.ColorIndex = xlNone
        a = .Value
        With CreateObject("Scripting.Dictionary")
            For i = 2 To UBound(a, 1)
                'colonne N
                If a(i, 14) > 0 Then
                     'colonne K
                    If Not .exists(a(i, 11)) Then
                        Set .Item(a(i, 11)) = CreateObject("Scripting.Dictionary")
                    End If
                    .Item(a(i, 11))(i) = a(i, 14)
                End If
            Next
            For i = 2 To UBound(a, 1)
                'colonne N
                If a(i, 14) < 0 Then
                    If .exists(a(i, 11)) Then
                        For Each e In .Item(a(i, 11)).keys
                            If a(i, 14) + .Item(a(i, 11))(e) = 0 Then
                                If x Is Nothing Then
                                    Set x = Union(Rows(i), Rows(e))
                                Else
                                    Set x = Union(x, Rows(e), Rows(i))
                                End If
                                .Item(a(i, 11)).Remove e: Exit For
                            End If
                        Next
                    End If
                End If
            Next
        End With
        'If Not x Is Nothing Then x.EntireRow.Delete 'supprime
        'colorie
        If Not x Is Nothing Then x.EntireRow.Interior.ColorIndex = 42
    End With
End Sub

klin89

Rechercher des sujets similaires à "supprimer montant double"