Action repetitive et complexe.... le rêve?

zorg92

XLDnaute Nouveau
Bonjour à tous,
Et merci de m'accueillir parmis vous.

Je viens solliciter votre aide, car sinon je risque de finir aveugle ou fou...

Je vous explique ma problématique :

je dois repéter une action complexe à l'infini (environ sur 400 000 lignes reparties dans plusieurs fichiers avec par feuilles 65 000 lignes).
l'action est la suivante : si la date(colonne B),l'unité(colonneC) le numéro de caisse(colonne F) et le numéro de ticket (colonne G) sont identiques, alors il faut supprimer la valeur de la colonne E , mais toutefois il faut au moins conserver cette valeur pour une des lignes :

exemple

Date Numero carte Unité valeur carte val ticket caisse ticket
11/03/2010 18002763077 83 19,00 € 36,94 € 16 147
11/03/2010 18002763078 83 8,73 € 36,94 € 16 147

11/03/2010 18002835261 83 19,00 € 391,82 € 17 166 0
11/03/2010 18002307422 83 16,74 € 391,82 € 17 166 0
11/03/2010 18002835260 83 19,00 € 391,82 € 17 166 0

Dans le 1er cas, je supprime une fois 36,94 mais dans le deuxiéme cas je supprime deux fois 391,82.

Voilà donc mon dilemme... aprés avoir mesuré le temps necessaire pour raliser cette opération en manuel, je me dis qu'il y a forcement une meilleure solution...

J'ai pensé à le faire sous access, mais je suis débutant, et je ne sais pas faire de programmation.. et pour excel, je ne vois pas comment aborder le probléme...

Merci encore de l'aide que vous voudrez bien m'apporter.

PS mon fichier exemple zip étant trop lourd, je cherche une solution... sorry

Bon week end à tous!!

Eric
 

Pièces jointes

  • Fichier test 2.zip
    30.3 KB · Affichages: 43
  • Fichier test 2.zip
    30.3 KB · Affichages: 41
  • Fichier test 2.zip
    30.3 KB · Affichages: 43
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re : Action repetitive et complexe.... le rêve?

Re
Bonjour le Fil
Bonjour le Forum
Pour être un peu Chiant lol (pour Pascal)
mets
Dim MaLigne as String (ça prend moins de place dans la mémoire )
puis en fin de procédure mettre
Set MonDico = Nothing
Erase a
Arfff vraiment Chiant le gars non ????? Lol
je n'ai pas testé le fait de recopier le tableau afin de remplacer les données
je n'ai pas testé mais on pourrait peut être mettre
With Feuil1
.Range("A2").Resize(Ubound(a,1),Ubound(a,2))=a
End With
puisque le tableau contient le même nombre de lignes que la plage
ps : j'ai testé le Resize , cela ne va pas plus vite au contraire on perd quelques centièmes
Bonne Journée
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Action repetitive et complexe.... le rêve?

Re

Pourquoi dans ce cas ne pas faire un export hebdo ?
(cela réduirait encore ton temps de traitement non ? car =65536/8 =8192 )

et dans ce cas tu peux importer tes données dans un seul fichier et même un seul onglet

PS: c'est gentil Paritec de penser à moi et de m'offrir des endives en ce jour de Paques ;)

Mais pourquoi n'avoir pas utilisé ton With/End With ainsi ?

Code:
Sub SansDoublons3() [COLOR=Green]'chez moi : 0,09375[/COLOR]
Dim MonDico As Object, MaLigne$, t, a, i&, x&: t = Timer
 With Feuil1 [COLOR=Green]' tout dans le même With/End With[/COLOR]
    i = .Range("A65536").End(xlUp).Row: a = .Range("A2:G" & i)
    Set MonDico = CreateObject("Scripting.Dictionary")
    For x = 1 To UBound(a)
        MaLigne = a(x, 1) & "#" & a(x, 3) & "#" & a(x, 6) & "#" & a(x, 7)
        If Not MonDico.Exists(MaLigne) Then
            MonDico.Add MaLigne, MaLigne
        Else
            a(x, 5) = ""
        End If
    Next x
    .Range("A2:G" & i) = a: .Cells(2, 10) = Timer - t
End With
Set MonDico = Nothing
End Sub
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re : Action repetitive et complexe.... le rêve?

Re
un adaptation de la procédure de Pascal
comme on ne modifie que la colonne E on crée donc un tableau b avec cette colonne et on modifie ce tableau en fonction du tableau a
ensuite on colle le résultat en colonne E

Sub SansDoublons()
Dim MonDico As Object
Dim MaLigne As Variant, t, t1
Dim i As Long, x As Long, a As Variant
Dim b As Variant
Application.ScreenUpdating = False
t = Timer
With Feuil1
i = .Cells(1, 1).End(xlDown).Row
a = .Range("A2:G" & i)
b = .Range(.Cells(2, 5), .Cells(i, 5)) 'ici on récupère les données de la colonne E
Set MonDico = CreateObject("Scripting.Dictionary")
For x = 1 To UBound(a)
MaLigne = a(x, 1) & "#" & a(x, 3) & "#" & a(x, 6) & "#" & a(x, 7)
If Not MonDico.Exists(MaLigne) Then
MonDico.Add MaLigne, MaLigne
Else
'ici on modifie le tableau b
b(x, 1) = 0
End If
Next x
.Range("E2").Resize(UBound(b, 1), 1) = b
t1 = Timer - t
.Cells(3, 10) = t1
End With
'ici on vide les différents éléments utilisés
Erase a
Erase b
Set MonDico=nothing
Application.ScreenUpdating = True
End Sub
a voir
bonne journée
 

ChTi160

XLDnaute Barbatruc
Re : Action repetitive et complexe.... le rêve?

Re
la procédure que j'avais proposé avec l'utilisation d'une collection ,adaptée
Sub Test()
Set Coll_RowUnique = New Collection
Set Ws = Worksheets("Feuil1")
On Error Resume Next

t = Timer
With Ws
Tabtemp = .Range("A1").CurrentRegion
b = .Range(.Cells(1, 5), .Cells(UBound(Tabtemp, 1), 5))
For Lgn = 1 To UBound(Tabtemp, 1)

StrSearch = Tabtemp(Lgn, 1) & "!" & Tabtemp(Lgn, 3) & "!" & Tabtemp(Lgn, 6) & "!" & Tabtemp(Lgn, 7)
Coll_RowUnique.Add StrSearch, CStr(StrSearch)
If Err.Number <> 0 Then b(Lgn, 1) = 0: Err.Clear
Next Lgn
.Range("E1").Resize(UBound(b, 1), 1) = b
t1 = Timer - t
.Cells(1, 10) = t1
End With

On Error GoTo 0

End Sub
je confirme que sur 65536 lignes , l'utilisation de
Set MonDico = CreateObject("Scripting.Dictionary")
reste le plus rapide avec cette adaptation
1,03125 contre 1,32421875 pour l'utilisation de la Collection
bonne fin de Journée
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Action repetitive et complexe.... le rêve?

Re

Bonjour JeanMarie

Je comprends pas que tous vous acharniez à vouloir travailler sur des feuilles de 65536 cellules...

(cf mes précédents messages)

zorg92
Je ne comprends pas non plus comment tu peux avoir des doublons dans ton système d'encaissement ?

Comment un numéro de ticket peut apparaitre plusieurs fois ?
Et comment des numéros de cartes différents peuvent être reliés un même numéro de ticket ??
 
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : Action repetitive et complexe.... le rêve?

Bonjour à tous,

zorg92
Je ne comprends pas non plus comment tu peux avoir des doublons dans ton système d'encaissement ?
Comment un numéro de ticket peut apparaitre plusieurs fois ?
Et comment des numéros de cartes différents peuvent être reliés un même numéro de ticket ??

Je me pose depuis le début la même question...
Un client peut "prêter sa carte" mais le N° de ticket doit être différent... Je crois...

A+ à tous
 

ChTi160

XLDnaute Barbatruc
Re : Action repetitive et complexe.... le rêve?

Re
Salut à tous
coucou particulier à JCGL ,Staple1600 (j'ai très bien compris tes remarques sur tes précédents messages)
Moi je ne me pose pas de question Lol , je tente d'y répondre Lol .
Donc aucun acharnement , je m'amuse à voir comment on peut faire pour faire plus rapide , qu'il y ai 10000 ou 65536 lignes .

Car sur le fond, la macro ayant ainsi évoluée , restera tout aussi rapide , quelque soit le nombre de lignes Lol :p
et la je vais même arrêter de chercher , car je ne m'amuse plus lol
Bonne fin de journée
 

zorg92

XLDnaute Nouveau
Re : Action repetitive et complexe.... le rêve?

Bonsoir,

désolé de n'avoir pu revenir plus tôt...

en fait, pour etre plus précis, ces numéros sont des numéros de cartes cadeaux (mais incomplet bien sur et bien sûr sans le code secret :)). Ce qui explique que l'on peut en avoir plusieurs sur le même ticket.

Malheureusement IT ne me donne les résultats qu'une fois par mois...


Merci encore de votre aide...

je vais tester vos propositions.

Eric
 

Discussions similaires

Réponses
4
Affichages
960

Statistiques des forums

Discussions
312 778
Messages
2 092 038
Membres
105 161
dernier inscrit
lorina