Lenteurs et Freeze / Optimiser code

Bonjour à tous,

J'ai récemment modifié une grosse partie d'un code pour y intégrer des tableau structurés, ma table ayant pour but d'être changeante, cela m'apporte beaucoup moins de problèmes.

Cependant j'ai une certaine lenteur dans certains modules lorsque qu'ils sont appliqués plusieurs fois, le fichier finit par figer et je dois quitter et relancer. La table et les macros sont assez lourdes, cela gère des dossiers Windows, du Outlook, du PDF en plus des tables Excel, avec beaucoup de find dans deux tables différentes qui cumulent quasi à 5000 lignes sur 20 colonnes, lignes qui augmenterons d'environ 2500 chaque année...

Je réinitialise bien mes Objets à chaque fin de SUB, je suis passé par du "Select Case" au lieu des "IF" multiples, mais cela ne semble pas suffisant. J'ai donc quelques questions pour tenter de simplifier toutes ces recherches.

1) Est-ce que trier une colonne pour afficher moins de lignes permettrait de simplifier la recherche ou il va chercher sans tenir compte du tri ?

2) J'utilise pas mal le "With" pour simplifier mon code exemple: With [Table_SP].ListObject mais y aurait-il un intérêt a déclarer une variable courte pour éviter de répéter le [Table_SP].ListObject ?

3) J'utilise le find pour chercher une valeur dans une colonne, peut-être existe-t'il un moyen moins gourmand ? En général je procède ainsi:

        'Initialisation des objets
        Set Colonne = [Table_SP[Numéro d''offre]]
        Set Recherche = Colonne.Find(UT2_TB_Offre)

        If Recherche Is Nothing Then
            MsgBox "L'offre " & UT2_TB_Offre & " n'existe pas.", vbExclamation, "Erreur"
            UT2_TB_Offre = vbNullString
            'Réinitialisation des objets
            Set Colonne = Nothing
            Set Recherche = Nothing
            Exit Sub
        End If

        'Recherche de la ligne devis
        Ligne = Recherche.Row - [Table_SP].ListObject.HeaderRowRange.Row 'Ligne du tableau structuré

        'Réinitialisation des objets
        Set Colonne = Nothing
        Set Recherche = Nothing

        'Suite du code...

Merci.

bonjour Helflip,

sans fichier, c'est un pari, mais voici un essai, je pense que match est 20 fois plus vite que find avec 10.000 lignes

Sub test()
     'Initialisation des objets

     t0 = Timer
     For i = 1 To 100                        'pour mesurer le temps on le fait 100 fois consécutif
          i = Application.Match(UT2_TB_Offre, Range("Table_SP[Numéro d''offre]"), 0)
     Next
     t1 = Timer

     Set Colonne = [Table_SP[Numéro d        ''offre]]
     For i = 1 To 100
          Set Recherche = Colonne.Find(UT2_TB_Offre)
     Next
     t2 = Timer

     MsgBox "100 recherches ""Match"" en " & Format(t1 - t0, "0.000\s") & vbLf & "100 recherches ""Find"" en " & Format(t2 - t1, "0.000\s")

     If Not IsNumeric(i) Then
          MsgBox "L'offre " & UT2_TB_Offre & " n'existe pas.", vbExclamation, "Erreur"
          UT2_TB_Offre = vbNullString
          'Réinitialisation des objets
          Exit Sub
     Else

          'Recherche de la ligne devis
          Ligne = i                          'Ligne du tableau structuré
     End If
     'Réinitialisation des objets

     'Suite du code...
End Sub

Bonjour,

Mieux vaut effectivement utiliser match. Autre proposition :

        'Initialisation des objets
        Set TS = [Table_SP].ListObject

        ligne = Application.IfError(Application.Match(UT2_TB_Offre, TS.ListColumns("Numéro d'offre").DataBodyRange, 0), 0)

        If ligne = 0 Then
            MsgBox "L'offre " & UT2_TB_Offre & " n'existe pas.", vbExclamation, "Erreur"
            UT2_TB_Offre = vbNullString
            Exit Sub
        End If

        'Suite du code...

Salut à vous,

Je me doute que c'est un pari mais le fichier serait juste imbuvable, avec des liens vers serveur etc. il me faudrait quelque jours pour en produire un présentable

Je vais tester match, j'avoue que je ne l'ai jamais utiliser... Avant j'utilisais une boucle for et cela fonctionnait pas trop trop mal, j'ai voulu utiliser le find pour simplifier mon code, c'est plus simple mais plus long

Alors avec match le code est presque 24 fois plus rapide c'est assez dingue...

En plus il trouve les correspondance dans des case contenant un concatener donc nickel

Plus que quelques soucis à résoudre et ce sera tip top, merci à vous deux

re,

et si ce ne sont que 10 ou 100 lignes, c'est encore 24 fois ?

Je n'ai pas testé. La j'ai 4856 ligne et franchement c'est beaucoup plus simple.

Rechercher des sujets similaires à "lenteurs freeze optimiser code"