Autres Excel 2007 Optimisation macro Mise en forme

eric57

XLDnaute Occasionnel
Bonjour le Forum

J'ai une macro pour mettre en forme un résultat ,
Le problème est que ma méthode prend un temps énorme ( env 4' pour 1000 lignes)

Existe-t-il un moyen d'aborder le problème sous un autre angle pour gagner en temps ?

Merci pour votre aide.

En PJ un fichier exemple. Les colonnes sont en AN car je ne voulais pas modifier ma macro existante.

Amicalement

Eric
 

Pièces jointes

  • Classeur3.xlsm
    132.5 KB · Affichages: 8

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Eric,
Deux essais en PJ avec une approche par array, et une approche par formules. A voir.
Sur mon PC met 675ms par array et 1280ms par formules.
[Edit] dans la V2 j'ai rajouté un essai d'optimisation avec un WhileWend au lieu de ForNext. Pas flagrant.

NB: Dans votre macro, il manque à minima "Application.ScreenUpdating = False" qui accélère les choses en figeant l'écran. ( à iso algo )
 

Pièces jointes

  • Eric2.xlsm
    169 KB · Affichages: 2
Dernière édition:

eric57

XLDnaute Occasionnel
Bonjour Sylvanu

Merci pour tes essais

Les macros fonctionnent, mais je n'obtiens pas le résultat souhaité.

L'idée a la base c'est d'avoir au départ les 3 informations des colonnes Marques (AP) + Code Technique (AR) + Modèle (AQ) et je rajoute entre parenthèses les informations des colonnes AN et AO sous réserve qu'elles ne sont pas en doublons de la colonne Code Technique (AR)

Ainsi je n'ai pas 2 fois le même code dans une ligne donnée
 

eric57

XLDnaute Occasionnel
On approche .... On approche

L'amélioration est a peine visible, on est passé de 4minutes à environs 1 seconde 🤣

C'est génial

Sauf que du coup, on a les infos en doublons par ex sur la ligne N° 2 . Tu ne l'as pas constaté car ma macro avait effacé les doublons en colonne AN

Je te mets dans le tableau les infos comme au départ .

Je n'ai pas besoin des entêtes de colonnes, je ne les avaient mis que pour la compréhension, la formule doit démarrer à la ligne 1

Enfin, dans l'exemple, je n'ai rien en colonne "P" mais je dois en tenir compte et ajouter le contenu de "P" dans mon résultat final
 

eric57

XLDnaute Occasionnel
Dans votre fichier, il faut virer les doublons de la colonne AN, et commencer en ligne 1 ?
Oui on commence à la ligne 1

Il faut virer les doublons entre AN AO et AR et ne mettre en AS que des données "simples" AR étant prioritaire et AN et AO ne sont ajoutés que si différents de AR ( et eux même différents entre eux )

Pfff vais allez prendre une aspirine moi

Je te joint le tableau, je l'ai allégé au 5 premières lignes,( le job pour optimisé étant fait )

j'ai mis en colonne AT le résultat souhaité

Je me rend compte aussi que la dernière ligne n'est pas traitée
 

Pièces jointes

  • Classeur3.xlsm
    54.3 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Pas bien sur d'avoir tout suivi pour le dédoublonnage.
En PJ je vire les doublons sur colonnes AN, AO,AR. Comme ceci :
1639303069974.png

Si faux, donnez moi votre filtre.
En PJ je n'ai conservé qu'une macro, celle par WhileWend qui semble la plus rapide.
Mais avec le dédoublonnage on augmente le temps d'exécution bien sur.

PS: Pour en revenir à votre fichier initial, quand on veut aller très vite, il faut toujours commencer par un "Application.ScreenUpdating = False", et surtout ne jamais écrire dans des cellules. ( évidemment ce n'est pas possible, aussi faut il le minimiser. )
En 2ème PJ un fichier test qui montre les différents temps en fonction du contexte.
 

Pièces jointes

  • Eric4.xlsm
    135.1 KB · Affichages: 2
  • 3- Test RW cellules vs array.xlsm
    67.6 KB · Affichages: 1

eric57

XLDnaute Occasionnel
Le filtre par colonne ne marche pas, je dois travailler par ligne

Sur une même ligne j'ai jusqu’à 5 cellules avec des données . ma 6em cellule doit reprendre toutes les informations mais que une fois . Donc si sur la ligne j'ai 2 ou 3 fois la même info, je n'en conserve que 1

J'ai donc au minimum 3 info (colonne AP AQ et AR ) et je rajoute entre les parenthèses les infos des colonnes AN et AO si elles sont différentes de AR
 

eric57

XLDnaute Occasionnel
Finalement, je suis parti sur cette macro ( la 2) que j'ai adapté :

VB:
Sub EssaiEric2()
    Dim Tout(), T, i%
    T0 = Timer
    'Application.ScreenUpdating = False
    T = Range("AM1:AR" & Range("AP65000").End(xlUp).Row)
    ReDim Tout(UBound(T)): Tout(0) = "Résultat"
    For i = 1 To UBound(T)
                
        If T(1, 6) = T(i, 2) And T(1, 6) = T(i, 3) Then Chaine = ""
        If T(i, 2) = "" And T(i, 3) = "" Then Chaine = ""
        If T(i, 3) = T(i, 6) And T(i, 2) <> T(i, 3) Then Chaine = " -(" & T(i, 2) & ")"
        If T(i, 2) = T(i, 3) And T(i, 3) <> "" Then Chaine = " -(" & T(i, 3) & ")"
        If T(i, 6) = T(i, 3) And T(i, 2) = "" Then Chaine = ""
        If T(i, 6) <> T(i, 3) And T(i, 2) <> T(i, 3) Then Chaine = " -(" & T(i, 2) & " " & T(i, 3) & ")"
      
        Tout(i - 1) = T(i, 4) & " " & T(i, 6) & " " & T(i, 5) & Chaine & " " & T(i, 1) & " "
        
    Next i
    Range("$AS$1").Resize(UBound(Tout), 1).Value = Application.Transpose(Tout)
    Application.ScreenUpdating = True
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 191
Messages
2 086 051
Membres
103 108
dernier inscrit
Captain NRJ