Demande d'optimisation de mon code vba

napo124

XLDnaute Junior
Bonjour,

Je travaille sur un projet, et je suis amené à préparer une macro de tri de données.
Celle ci doit éffectuer plusieurs test, ligne par ligne.

Deux lignes ayant le même fournisseurs et le même ID est considéré comme DOUBLON.
La base de données est triée par ID, puis par fournisseurs et enfin par "ref" (cf fichier)

La base de données sera constituée de plusieurs milliers de lignes. Ma macro est fonctionnel, mais commence à être vraiment longue au bout de 10 000 lignes.
Pouvez vous m'aider à rendre mon code plus rapide?

Le schéma décisionnel est présenté dans le fichier. Le code vba est détaillé avec mes commentaires.

Pouvez vous m'aider ?

Cordialement
 

Pièces jointes

  • Needtobeoptimized.xlsx
    16.3 KB · Affichages: 67

napo124

XLDnaute Junior
Re : Demande d'optimisation de mon code vba

Ah, merci de vos réponses!
J'actualise le fichier...
 

Pièces jointes

  • Needtobeoptimized.xls
    100.5 KB · Affichages: 57
  • Needtobeoptimized.xls
    100.5 KB · Affichages: 66
  • Needtobeoptimized.xls
    100.5 KB · Affichages: 61

GeoTrouvePas

XLDnaute Impliqué
Re : Demande d'optimisation de mon code vba

Après avoir trié ton tableau par ID puis par fournisseur, tu peux éventuellement utiliser cette macro :

Code:
Sub SupprDoublons()
    Application.ScreenUpdating = False
    i = 2
    While Cells(i, 1) <> ""
        If Cells(i + 1, 1) = Cells(i, 1) And Cells(i + 1, 2) = Cells(i, 2) Then
            Rows(i).Delete xlShiftUp
        Else
            i = i + 1
        End If
    Wend
    Application.ScreenUpdating = True
End Sub

Mais effectivement, ce n'est pas très optimisé (environ 30 sec pour 5 000 lignes)
 

napo124

XLDnaute Junior
Re : Demande d'optimisation de mon code vba

GeoTrouvePas,

Ton code est bon! Mais le test en question prend en compte d'autre critères!
Un doublon peut être conservé s'il remplit certains conditions (ex: colonne REF: "o" ou priorité= minimum des priorités des doublons).
Cf le petit schéma dans le fichier.

Et oui, j'ai pas dis que c'était simple ;)
 

GeoTrouvePas

XLDnaute Impliqué
Re : Demande d'optimisation de mon code vba

Oui je viens de voir ça. Je me suis contenté de supprimer les lignes avec même "ID" et même "Fournisseur". Je suis passé à côté des autres critères (c'est pas étonnant de ma part ^^).

Toutefois en lisant ton code, j'ai du mal à distinguer les données présentes dès le départ dans ton fichier et les données que tu calcules toi même.

Car pour moi, l'optimisation commence par là : éviter de rajouter des données inutiles à chaque ligne et supprimer au plus vite les doublons clairement identifiables.
 

napo124

XLDnaute Junior
Re : Demande d'optimisation de mon code vba

En fait, la base de données est triées par ID et ensuite par Fournisseur.
Cela permet de ne pas s'attarder sur des lignes MONO (qui ne sont pas en double).

Je fais donc un premier test qui indique si la ligne est MONO ou MULTI (doublons), informations que j'ai besoin de renvoyer dans une colonne.

Ensuite, la vraie problématique est de faire ressortir la PRIORITE la plus petite parmi les MULTI dont le code ref est "N"

Pour cela, la base de données est d'ores et déjà trié par "ref" (O ou N avec les N en premier). C'est à dire que nous avons toujours au sein d'un groupe de doublons consécutifs les "N" en premier suivis des "O".
Je lance donc une boucle permettant de trouver la priorité minimale dans ce "sous groupe" de doublons. C'est là que je perds du temps je pense.

Une fois le minimum trouvé, je le marque dans une colonne, et je recopie ce minimum pour toutes les lignes de même type de doublons.

A la fin, je fais un test final qui va effectuer les interrogations nécessaires pour savoir si la ligne doit être gardée ou supprimée.
 

GeoTrouvePas

XLDnaute Impliqué
Re : Demande d'optimisation de mon code vba

Je vois déjà un peu mieux.

Dans un premier temps, il faut que tu fasses comme dans ton arbre décisionnel, c'est à dire que tu supprimes toutes les lignes dont le statut est 9.

Ça sera toujours ça en moins à étudier.

Actuellement tu perds beaucoup de temps à calculer des données pour ces lignes alors qu'au final elles seront systématiquement supprimées.
 

napo124

XLDnaute Junior
Re : Demande d'optimisation de mon code vba

Oui ce n'est pas simple:


Quelles sont les colonnes remplies au départ et quelles sont celles qui sont vides ?
Les colonnes "classe" et "résultat" sont vides et renseignées par la macro. La macro doit déterminer quelles lignes sont MULTI (doublons) ou MONO, et quelles lignes doivent être supprimées.
La grosse difficulté est de savoir si la valeur "priorité" de la ligne correspond au MINIMUM des valeurs priorités du groupe de doublons, car si c'est le cas, on doit la conserver!

Dans un premier temps, il faut que tu fasses comme dans ton arbre décisionnel, c'est à dire que tu supprimes toutes les lignes dont le statut est 9.
Certainement! Mais petit problème, il faudrait ne pas supprimer les lignes dans un premier temps, et juste indiquer quelles n'ont pas passé le test (d'où le "suppr" dans le résultat). La suppression se ferait plus tard...
 

Statistiques des forums

Discussions
311 707
Messages
2 081 746
Membres
101 812
dernier inscrit
trufu