ListobjectListrows.add

Bonjour à tous,

Un petit souci de lenteurs....

J'ai une DB que j'alimente à partir d'un formulaire, tout fonctionne bien excepté la lenteur d'insertion de ligne.

Chaque ligne fait 20 colonnes, 6 ou 7 données sont insérées par le formulaire, les autres sont calculées par formules.

J'ai mis un stop juste avant le Sheets("DB").ListObjects(1).ListRows.Add pour bien me rendre compte de ce qui faisait ramer le truc, et c'est bien sur cette ligne que ça bloque, mais pas 2 secondes hein.... ça dure minimum 6 ou 7 secondes.

Le souci c'est que le formulaire peut envoyer plusieurs lignes d'un coup, ce qui fait un temps de "ramage" inacceptable pour l'utilisateur...

J'ai ajouté des Application.Calculation = xlManual, aucune différence.

Qu'est-ce qui peut faire ramer autant, sachant que mes premières versions étaient très rapides ? Ai-je ajouté trop de trucs autour ? (2700 Ko)

Comment trouver/comprendre le problème ?

Merci d'avance pour votre temps

Bonne soirée

edit : Le temps de 6 secondes c'est juste pour "créer" la nouvelle ligne, avant l'insertion des données....

Bonjour,

Merci de joindre un fichier représentatif avec les procédures VBA.

Cdlt.

Bonjour Jean-Eric,

Malheureusement, un fichier représentatif allégé fonctionne parfaitement comme je l'ai dit, et je ne mettrai pas le fichier complet

Je ne veux pas qu'on me corrige le fichier mais juste trouver des pistes pour comprendre.

A ce que j'ai compris sur une réponse de MFerrand ailleurs, listobject(1).listrows.add permet (entre autres) d'ajouter une ligne en gardant les formules de la ligne du dessus.

Existe-t-il d'autres méthodes ? J'ai croisé des "rows.insert" par exemple, quelle est la différence ?

Merci pour vos conseils et bonne soirée.

Re,

Comment veux-tu que l'on intervienne ? On a rien pour supputer !...

Cdlt.

J'adore ce verbe

Ok tant pis, merci quand même

Re,

Pour ma part, pour insérer une ligne dans un tableau (listobject), j'opère ainsi.

Cdlt.

Public Sub XXX()
Dim lo As ListObject, rCell As Range, Calc As XlCalculation
    Calc = Application.Calculation
    Application.Calculation = xlCalculationManual
    Set lo = Worksheets("DB").ListObjects(1)
    With lo
        'si le tableau n'est pas vide, dernière cellule colonne décalée d'une ligne
        If .InsertRowRange Is Nothing Then
            Set rCell = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
        Else
            '1ère. ligne du tableau
            Set rCell = .InsertRowRange.Cells(1)
        End If
    End With
    'restitution des données du formulaire
    'à adapter !...
    With rCell
        .Value = "à définir"
        .Offset(, 1).Value = "à définir"
        'etc...
        .Offset(, 6).Value = "à définir"
    End With
    Application.Calculation = Calc
End Sub

Bonjour à tous,

Si tu as joué beaucoup dans tes feuilles pour développer ton fichier, il arrive qu'il y ait des tonnes de lignes et de colonnes inutilisées qui alourdissent inutilement le fichier.

Faire une sauvegarde avant :

Sur chacune des feuilles : CTRL-FIN (CTRL-END si le clavier a un affichage english).

La cellule sélectionnée, est-elle proche de tes données (lignes ou colonnes) ?

S'il y a trop de lignes inutilisées, supprime ces lignes.

S'il y a trop de colonnes inutilisées, supprime ces colonnes.

Vérifier toutes les feuilles. Enregistrer ... le poids du fichier s'en est-il ressenti ?

La vitesse d'exécution en a-t-elle été améliorée ?

Ou si tout était déjà optimisé ??

ric

Merci Jean Eric, ça me semble assez proche de ce que j'utilise.

Je penche plus pour un problème tel que celui que Ric suggère.

Un ctrl+fin sur ma BD me renvoie la ligne 9838 alors qu'elle n'a que 200 lignes pour l'instant.

La colonne est OK.

"S'il y a trop de lignes inutilisées, supprime ces lignes."

Hum oui, je supprime ces lignes vides mais ça ne change rien, Ctrl+fin me renvoie toujours la même ligne 9838.

Je dois mal m'y prendre ?

Et y a un truc que je ne pige pas bien, lorsque je sélectionne [Tableau1], ça me prend bien la totalité des lignes et des colonnes sans dépasser, pourquoi Excel m'envoie 9600 lignes plus bas ?

Merci à vous deux

Je me réponds tout seul

J'ai supprimé ces lignes vides, enregistré-réouvert le fichier qui a perdu 200 Ko, et la vitesse d'exécution a chuté de moitié je dirais !!!

Ca devient acceptable.

Merci Ric pour cette bonne piste, je ne sais pas encore comment optimiser un code, je m'y colle doucement, vos conseils sont précieux !

Très bonne journée.

Bonjour,

Essaie cette procédure sur une copie de ton fichier.

Elle nettoie le classeur !...

Cdlt.

Option Explicit
'laurent Longre
Public Sub CleanWorkbook()
Dim wb As Workbook
Dim ws As Worksheet
Dim rCell As Range
Dim vVersion
Dim xx As String

    For Each ws In wb.Worksheets
        If ws.Visible = xlSheetVisible Then
            If ws.UsedRange.Cells.Address = "$A$1" And _
               IsEmpty(ws.Range("A1")) And ws.Shapes.Count = 0 Then
                If wb.Worksheets.Count > 1 Then ws.Delete
            End If
        End If
    Next ws

    For Each ws In wb.Worksheets
        If ws.UsedRange.Address <> "$A$1" Or Not IsEmpty(ws.[A1]) Then
            On Error Resume Next
            Set rCell = ws.Cells.Find("*", , , , xlByRows, xlPrevious)(2)
            If Not rCell Is Nothing Then
                ws.Range(rCell, ws.Cells([A:A].Count, 1)).EntireRow.Clear
                Set rCell = Nothing
                Set rCell = ws.Cells.Find("*", , , , xlByColumns, xlPrevious)(, 2)
                If Not rCell Is Nothing Then
                    vVersion = Val(Application.Version)
                    If vVersion < 12 Then
                        ws.Range(rCell, ws.[IV1]).EntireColumn.Clear
                    Else
                        ws.Range(rCell, ws.[XFD1]).EntireColumn.Clear
                    End If
                End If
                On Error GoTo 0
                xx = ws.UsedRange.Address
            End If
        End If
    Next ws

End Sub

Ooooh intéressant ça

J'essaie tout de suite !

Merci beaucoup Jean Eric !

Rechercher des sujets similaires à "listobjectlistrows add"