VBA - gestion de beaucoup de données

Fermé
LoicL89 Messages postés 15 Date d'inscription jeudi 14 mai 2015 Statut Membre Dernière intervention 16 mai 2015 - 14 mai 2015 à 22:22
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 15 mai 2015 à 11:24
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

Utilisateur anonyme
14 mai 2015 à 22:38
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 jeudi 14 mai 2015 Statut Membre Dernière intervention 16 mai 2015
Modifié par LoicL89 le 14/05/2015 à 22:45
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
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 jeudi 14 mai 2015 Statut Membre Dernière intervention 16 mai 2015
14 mai 2015 à 22:49
Je viens de le lancer, c'est en cours, ça a l'air long toujours...

Screenupdating sert à faire quoi exactement?
0
Utilisateur anonyme
14 mai 2015 à 22:50
A ne pas mettre à jour l'écran pendant la suppression pour éviter un traitement inutile
0
LoicL89 Messages postés 15 Date d'inscription jeudi 14 mai 2015 Statut Membre Dernière intervention 16 mai 2015
14 mai 2015 à 22:55
Ok ! Sinon ça charge toujours...
0
Utilisateur anonyme
14 mai 2015 à 22:57
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 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
15 mai 2015 à 00:58
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 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 15/05/2015 à 11:27
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