Simplification code/macro

Bonsoir le forum,

Sur une de mes bases de données, après un ajout ou modification ou suppression via un userform se déroule plusieurs macros qui doivent être lourdes puisqu'elles font bugger excel avec un message "excel ne répond pas". Ce message disparaît assez vite et en 10/20s tout est rentré dans l’ordre. Sauf que ces 20s peuvent paraître courtes mais cette base subit des ajouts/modif/suppression des centaines de fois par jour soit beaucoup de seconde...

J'ai déjà simplifier quelques macros que j'avais écrit en vba mais je bloque sur celle ci-jointe "Extractionbase" que j'avais enregistré manuellement.

Son but est de copier toutes les données de la base sans doublons, les coller sur la feuille 3 et enfin trier dans l'ordre alphabétique ou croissant. Il me semble que c'est cette macro à l'origine des bugs. Le vrai problème est peut-être que ce genre de macro n'est pas adapté pour une base lourde en donnée...

Quelqu'un aurait-il une solution pour simplifier cette macro ?

Je vous en remercie d'avance

16transport.xlsm (76.94 Ko)

Bonjour/soir,

voilà un début, à toi de faire le reste

P.

Bonjour à vous deux,

Sur des volumes importants, l'utilisation d'un "dictionary" (pour la gestion des doublons) et de tableaux en mémoire peuvent s'avérer utiles.

Un essai en pièce jointe qui illustre ce qui précède.

J'ai renommé "Feuil3" en "Listes" et y ai inséré une colonne vide avant les deux tableaux qui sont passés en colonnes M et suivantes.

À tester ...

Merci beaucoup à tous les 2 d'avoir pris de votre temps pour m'aider.

La solution de U.Milité me parait plus intéressante au vu de ma grande base de données.

J'avais par contre oublié de préciser que je ne veux pas d'extraction de ma colonne E vers la "Feuil3". En revanche je souhaiterais que ma colonne E de "Feuil3" reste vide pour ne pas décaler mes données. Ne connaissant absolument pas la méthode "dictionary" je n'ai pas réussi à retoucher le code moi-même.

Auriez-vous une solution ?

@+

Bonjour,

Pour le tri du tableau, essaie ainsi :

Sub Tri_B_E()
Dim lo As ListObject
    Set lo = ActiveWorkbook.Worksheets("Base").ListObjects(1)
    With lo
        .Sort.SortFields.Add _
                Key:=.ListColumns(2).DataBodyRange, _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                DataOption:=xlSortNormal
        .Sort.SortFields.Add _
                Key:=.ListColumns(3).DataBodyRange, _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                DataOption:=xlSortNormal
        .Sort.SortFields.Add _
                Key:=.ListColumns(4).DataBodyRange, _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                DataOption:=xlSortNormal
        .Sort.SortFields.Add _
                Key:=.ListColumns(5).DataBodyRange, _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                DataOption:=xlSortNormal
        .Sort.Apply
        .Sort.SortFields.Clear
        .HeaderRowRange.Cells(1).Select
    End With
End Sub

Sub Tri_Référence()
Dim lo As ListObject
    Set lo = ActiveWorkbook.Worksheets("Base").ListObjects(1)
    With lo
        .Sort.SortFields.Add _
                Key:=.ListColumns(1).DataBodyRange, _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                DataOption:=xlSortNormal
        .Sort.Apply
        .Sort.SortFields.Clear
        .HeaderRowRange.Cells(1).Select
    End With
End Sub

Re-bonjour,

Salut Jean-Eric,

je ne veux pas d'extraction de ma colonne E vers la "Feuil3"

Au début de la boucle For col = 1 To UBound(tablo, 2)ajoute la ligne suivante: If col = 5 Then col = col + 1

Avant d'exécuter le code, efface le contenu de la colonne E en Feuille "Listes" ... et dis-nous si c'est OK?

Tu penseras aussi à nous dire si le gain de temps est conséquent (pour autant qu'il n'y ait pas d'autres macros chronophages qui s’exécutent au même moment) ?

Parfait pour la colonne E tout s’exécute comme je le souhaite. Le gain de temps n'est pas de 10s mais bel et bien présent puisque excel ne se mets plus en mode "ne répond pas" ce qui est déjà une très bonne chose. Après j'ai re-tester hier, la plus grosse perte de temps est le fait de réactualiser toutes les données après chaque manip' d'autant plus que j'ai pas mal de TCD pour mon tableau de bord, mais pour cela, il n'y a pas tellement de solution. En tout cas un grand merci U.Milité !

Merci également à Jean-Eric pour vos codes, ils me paraissent également plus efficaces. En revanche, il m'est impossible de les exécuter sur une autre feuille que ma base. Cette ligne est à l'origine de ce problème :

.HeaderRowRange.Cells(1).Select

Avez-vous une suggestion ?

A+

Re,

Pour le souci de HeaderRowRange, il faut évidemment qu(il y ait un tableau (Listobject) dans la feuille de calcul.

Bon, je crains de ne pas comprendre tes propos !...

A te relire.

Cdlt.

Re,

Mal formulé de ma part en effet.

Je voulais dire que je ne peux pas effectuer cette macro depuis (et non "sur") une autre feuille.

Par exemple, je veux effectuer la macro sur mon tableau depuis la feuille référence, et bien la ligne cité me renvoie une erreur.

J’espère être plus compréhensible,

@+

Re,

Je ne comprends toujours pas.

Les 2 procédures que j'ai envoyé peuvent être lancées depuis n'importe quelle feuille.

Tu ne dis pas tout.

Cdlt.

Re-bonsoir

Un exemple vaut mieux qu'un long discours.

Lorsqu'on clique sur tri B_E ou tri référence de la feuille "base" tout fonctionne.

Lorsqu'on clique sur les mêmes boutons mais depuis la feuille "référence" une erreur survient.

L'erreur est-elle la même chez vous ? je vous joins un fichier démo

@+

10transport.xlsm (72.79 Ko)

Re,

Ton fichier en retour.

Désolé, j'aurai dû acter plus rapidement.

Cdlt.

8transport.xlsm (68.32 Ko)

Re,

L'essentiel est que cela fonctionne et c'est le cas,

Merci beaucoup

Bonne soirée

Rechercher des sujets similaires à "simplification code macro"