Macro Suppression ligne très longue

randle88

XLDnaute Junior
Bonjour à tous,

Je cherche donc à optimiser la macro ci-dessous.

Pour faire simple j'ai une BDD de 100 000 lignes et 15 colonnes. En H j'ai soit 100 soit 200. Je cherche donc à supprimer tous les 100 de la BDD.

Pour l'instant la macro (récupérer sur le forum)est très très longue (quand elle ne fait pas planter l'ordinateur). Je cherche donc un moyen de l'optimiser pour la rendre productive (car à l'heure actuelle un tri manuel est plus rapide ).

A noter tout de même que en réalité le tri s'effectue sur plusieurs critères de plusieurs colonnes. C'est pour cela que je souhaiterais l'automatiser.

Merci d'avance



Code:
Dim Ligne As Long
    ActiveCell.SpecialCells(xlLastCell).Select 'dernière cellule Fichier
    Range("H" & Selection.End(xlDown).Row).Select 'dernière cellule Excel colonne A
    Ligne = Selection.End(xlUp).Row 'dernière ligne remplie en colonne A
For Ligne = Ligne To 1 Step -1
    If Range("H" & Ligne).Value = 100 Then Rows(Ligne).Delete Shift:=xlUp
Next
 

pierrejean

XLDnaute Barbatruc
Re : Macro Suppression ligne très longue

Re

Arf !!!

Je me contrôle et m’aperçois que c'est ma macro qui en détruit trop (mes plus plates excuses Gerard)
Voila avec la correction
 

Pièces jointes

  • randle_b.xlsm
    375.4 KB · Affichages: 45
  • randle_b.xlsm
    375.4 KB · Affichages: 43
  • randle_b.xlsm
    375.4 KB · Affichages: 46

job75

XLDnaute Barbatruc
Re : Macro Suppression ligne très longue

Re,

Concernant la rapidité, ma macro va mieux en remplaçant les formules par les valeurs avant le tri :

Code:
Sub Supprime()
'la colonne auxiliaire Z est supposée non utilisée
Dim F As String
F = "=LN(AND(RC8<>100,RC8<>400,RC8<>500))" 'formule à adapter si nécessaire
Application.ScreenUpdating = False
With ActiveSheet
  With Intersect(.[Z:Z], .UsedRange.EntireRow)
    .FormulaR1C1 = F
    .Value = .Value 'remplace les formules par les valeurs
  End With
  .UsedRange.Sort .[Z:Z], xlAscending, Header:=xlNo 'tri
  On Error Resume Next 's'il n'y a pas de #NOMBRE! en colonne Z
  .[Z:Z].SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete
  .[Z:Z].ClearContents
End With
End Sub
A+
 

randle88

XLDnaute Junior
Re : Macro Suppression ligne très longue

Bonjour pierrejean et merci pour cette version commentée (qui me sera très utile car les tableaux en VBA c'est pas encore ca..).

Juste une petite question j'ai fait un test ce matin en remplaçant une valeur à supprimer par un texte entre "".

Mais les lignes ne se supprime pas, est-ce normal ?

Cdt,
 

pierrejean

XLDnaute Barbatruc
Re : Macro Suppression ligne très longue

Re

Non ce n'est pas normal !!
Vois dans le fichier joint
Au cas ou tu souhaites ne pas être gêné par la casse ,tu peux mettre en tête de module : Option Compare Text
De même il peut être utile d'utiliser Trim pour éviter les espaces parasites
Enfin si malgré tout tu as encore un souci ,poste un exemple et on regardera
 

Pièces jointes

  • randle_b.xlsm
    19.7 KB · Affichages: 21
  • randle_b.xlsm
    19.7 KB · Affichages: 28
  • randle_b.xlsm
    19.7 KB · Affichages: 25

poulpor78

XLDnaute Junior
Re : Macro Suppression ligne très longue

Bonjour,

Juste deux trucs en passant si ça n'a pas été dit. En début de code, ces instructions peuvent potentiellement augmenter très significativement la vitesse de code.

1/ Bloquer l'affichage de la macro :

Application.ScreenUpdating = False (ca se remet à true en automatique en fin de code) => l'affichage étant toujours à la ramasse par rapport aux calculs, selon les cas ça accélère nettement le code)

2/ Bloquer le calcul à chaque changement dans le classeur :

Application.Calculation = xlCalculationManual (ici il faudra remettre la valeurApplication.Calculation = xlCalculationAutomatic en fin de code)

Poulpor
 

randle88

XLDnaute Junior
Re : Macro Suppression ligne très longue

Bonsoir à tous,

Juste dernière petite question pour pierrejean.

Je commence à cerner le code mais il reste un point ambigu. C'est la variable début et les opérations associées.

Code:
 ' si le debut n'a pas encore été trouvé et si la valeur est celle a supprimer
  If debut = 0 And tablo(n, 1) = aeff(m) Then
    ' on note dans debut la 1ere ligne ou apparait la valeur à supprimer
   debut = n
 'sinon
  Else
    'si le debut a été trouvé et si l'on a plus la valeur à supprimer
   If debut <> 0 And tablo(n, 1) <> aeff(m) Then

Pourrais je avoir une petite explication ?

Merci d'avance
 

pierrejean

XLDnaute Barbatruc
Re : Macro Suppression ligne très longue

Re

Apres avoir trié par rapport à la colonne H,les valeurs a supprimer se suivent (exemple 100)
On cherche à situer les lignes ou elles débutent et ou elles finissent
debut est initialisé à 0 soit avant meme la macro ,soit a la fin de la boucle
La ligne de debut des valeurs 100 (par exemple ) sera obtenue si debut est a 0 et la colonne à 100
ensuite debut n'etant plus a 0 il n'y aura plus de changement (de qui permet de garder la valeur debut= N° de ligne du tableau)
pour la valeur fin ,il faut que debut ne soit pas a 0 et que la colonne ne soit plus a 100
des lors on peut quitter la boucle et proceder a l'effacement
 

Discussions similaires

Réponses
1
Affichages
199
Réponses
0
Affichages
178

Membres actuellement en ligne

Statistiques des forums

Discussions
312 520
Messages
2 089 299
Membres
104 092
dernier inscrit
karbone57