VBA - gestion de beaucoup de données

LoicL89 Messages postés 15 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai réalisé une macro permettant de supprimer les lignes dont une cellule contient la valeur 2. Cette dernière fonctionne pour un certain nombre de données, mais lorsque je souhaite réaliser l'opération sur l'ensemble de mes données (environ 800000 points - mais cela est variable selon les fichiers analysés, et sera majoritairement plus important) on dirait qu'elle tourne dans le vide (j'ai attendu 20 minutes, sans résultats...).

Sub suppression_points_sol()

Dim i As Double
With ThisWorkbook.Sheets("Feuil1")

For i = .Range("D" & .Rows.Count).End(xlUp).Row To 2 Step -1

If .Range("D" & i).Value = "2" Then
.Rows(i).Delete
End If
Next i

End With

End Sub


Je souhaiterais savoir s'il est possible d'améliorer la macro et son temps de traitement.

Merci d'avance

4 réponses

  1. Utilisateur anonyme
     
    Bonjour,

    Tu peux essayer avant ta boucle :

        Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False


    Et ensuite tu remets

        Application.Calculation = varCalcMode
    Application.ScreenUpdating = True


    Ca pourrait améliorer la vitesse.

    Pour ne pas avoir cette sensation de plantage, juste avant ton Next i tu mets :

    DoEvents
    0
  2. LoicL89 Messages postés 15 Statut Membre
     
    Merci pour ta réponse ! Je viens d'essayer et il me met variable non définie pour " varCalcMode"... Je suis débutant et ne comprends pas trop pourquoi il me dit ça, ce n'est pas une variable...

    Sub suppression_points_sol()

    Dim i As Double
    With ThisWorkbook.Sheets("Feuil1")

    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False

    For i = .Range("D" & .Rows.Count).End(xlUp).Row To 2 Step -1

    If .Range("D" & i).Value = "2" Then
    .Rows(i).Delete
    End If

    DoEvents
    Next i

    Application.Calculation = varCalcMode
    Application.ScreenUpdating = True

    End With

    End Sub
    0
    1. Utilisateur anonyme
       
      Au début tu mets Dim varCalcMode as integer et
      varcalcmode = Application.Calculation

      , et l'autre avec screenupdating ça marche?
      0
    2. LoicL89 Messages postés 15 Statut Membre
       
      Je viens de le lancer, c'est en cours, ça a l'air long toujours...

      Screenupdating sert à faire quoi exactement?
      0
    3. Utilisateur anonyme
       
      A ne pas mettre à jour l'écran pendant la suppression pour éviter un traitement inutile
      0
    4. LoicL89 Messages postés 15 Statut Membre
       
      Ok ! Sinon ça charge toujours...
      0
    5. Utilisateur anonyme
       
      En même temps, 800.000 données pour Excel c'est quand même gros car ce logiciel n'a pas été prévu pour gérer massivement des données, c'est plus une vraie base de données que tu aurais dû utiliser, là c'est quasi instantané.
      0
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Le plus rapide sur excel c'est de filtrer ta colonne et de supprimer les lignes (manuellement ou par macro)
    eric
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour
    essai sur 1048576 lignes (toute la colonne)
    suppression des lignes avec 2 et non "2" en environ 11 à 12 sec avec un tableau de 8 colonnes commencant colonne A
    https://www.cjoint.com/?3EplI7XhmKt

    mais on peut peut-^tre aller plus vite en utilisant la technologie ADO pour cela il faudrait mettre en pièce jointe la feuille avec 200 ou 300 lignes et préciser la version Excel...

    en attendant,ci dessous le code actuel
    Option Explicit
    Option Base 1
    '-------------------------------------------------------------------------
    Sub supprimer()
    Dim Nbre As Long, Derlig As Long, Dercol As Integer, T_in, T_out
    Dim Cptr As Long, idx As Long, Col As Integer
    Dim Start As Single

    '--- initialisations
    Application.ScreenUpdating = False
    Start = Timer
    'Nbre = Application.CountIf(Columns("D"), 2
    With Sheets(1)
    Dercol = .Rows(1).Find(what:="*", searchdirection:=xlPrevious).Column
    Derlig = .Columns("D").Find(what:="*", searchdirection:=xlPrevious).Row
    'mémorisation feuille Excel en RAM
    T_in = .Range(.Cells(1, "A"), .Cells(Derlig, Dercol))
    ReDim T_out(1 To Derlig, 1 To Dercol)
    End With

    '--- construction du tableau de sortie si colonne D =2
    For Cptr = 1 To UBound(T_in)
    If T_in(Cptr, 4) <> 2 Then
    idx = idx + 1
    For Col = 1 To Dercol
    T_out(idx, Col) = T_in(Cptr, Col)
    Next
    End If
    Next
    'restitution en feuille2 pour essai
    With Sheets(2)
    .Range("A1").Resize(UBound(T_out), Dercol) = T_out
    .Activate
    End With
    Application.ScreenUpdating = True
    MsgBox "durée: " & Timer - Start & " sec."
    End Sub


    Michel
    0