VBA - gestion de beaucoup de données

LoicL89 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   -  
michel_m Messages postés 16602 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
A voir également:

4 réponses

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
LoicL89 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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
Utilisateur anonyme
 
Au début tu mets Dim varCalcMode as integer et
varcalcmode = Application.Calculation

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

Screenupdating sert à faire quoi exactement?
0
Utilisateur anonyme
 
A ne pas mettre à jour l'écran pendant la suppression pour éviter un traitement inutile
0
LoicL89 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
Ok ! Sinon ça charge toujours...
0
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
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
Bonjour,

Le plus rapide sur excel c'est de filtrer ta colonne et de supprimer les lignes (manuellement ou par macro)
eric
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 313
 
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