gros fichier - lignes à supprimer

G

gab

Guest
Bonjour,

J'ai un document Excel assez conséquent (40 000 lignes ou plus) et je souhaite effectuer une macro qui permettrait d'effacer RAPIDEMENT les lignes dont la cellule en colonne I ne contient pas 'MUT' :

j'avais fait ceci, mais cela ne marche plus, et de plus, c'était extrêmement lent... auriez vous une solution ?

Dim L As Integer
With Sheets(1)
For L = 2 To .Range('I65536').End(xlUp).Row
If Left(.Range('I' & L).Text, 3) <> 'MUT' Then
.Range('I' & L).ClearContents
End If
Next
On Error Resume Next
.Range('I2:I' & L).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With

merci beaucoup :)
 

Abel

XLDnaute Accro
Bonjour gab,

Y a t'il une raison particulière à se que tu effaces le contenu avant d'effacer la ligne ?

Sinon, essaie :

application.screenupdating=false
for c= range('I65536').end(xlup).row to 2 step -1
If Left(Range('I' & c).Text, 3) <> 'MUT' Then
Range('I' & c).EntireRow.Delete
End If
Next
application.screenupdating=true

Je n'ai pas testé mais ça doit pas être très loin.
Autre chose, ce code ne fonctionne que si 'MUT' est placé en début de chaine. C'est à dire les trois premiers caractères en partant de la gauche.
Code à placer dans la feuille (dans feuil1 ou sheet1 dans VBE).

C'est une solution. Il y en a sûrement d'autres plus rapide.
J'espère avoir bien lu le sujet.


Abel.
 

myDearFriend!

XLDnaute Barbatruc
Bonjour gab, Abel,

Ci-dessous une autre façon de faire peut-être un peu plus rapide :
Sub Traitement()
Dim Plage As Range, C As Range
Dim L As Long
      With Sheets(1)
            For Each C In .Range(.Cells(2, 9), .Cells(.Range('I65536').End(xlUp).Row, 9))
                  If Not C.Value Like '*MUT*' Then
                        If Plage Is Nothing Then
                              Set Plage = C
                        Else
                              Set Plage = Application.Union(Plage, C)
                        End If
                  End If
            Next C
      End With
      If Not Plage Is Nothing Then
            Plage.EntireRow.Delete
      End If
End Sub
Compte tenu de ce que tu indiques gab : 'effacer RAPIDEMENT les lignes dont la cellule en colonne I ne contient pas 'MUT'', j'en ai conclus qu'il fallait vérifier si la cellule contenait l'expression 'MUT', quelque soit sa position dans la chaine... Si toutefois, il faut tester la chaine 'MUT' systématiquement en début de chaine, il te faudra remplacer dans le code ci-dessus '*MUT*' par 'MUT*'.

Cordialement,
 
G

gab

Guest
Merci pour votre aide précieuse.
En effet, je faisais un clear car les cellules contenant 'MUT' et les autres vides étaient toutes des résultats de formules (Vlookup). J'étais obligé des virer les formules... enfin je pense...
Quoiqu'il en soit, les deux propositions sont super sympa.

Encore merci.
 
G

gab

Guest
Si je peux encore me permettre......
Juste avant d'utiliser la macro que vous m'avez rédigée, j'ai ceci :

Dim EndRow As Long
Dim EndCol As Long
EndRow = Range('A65536').End(xlUp).Row
EndCol = Range('IV1').End(xlToLeft).Column
Range(Cells(2, EndCol + 1), Cells(EndRow, EndCol + 1)).FormulaR1C1 = _
'=IF(VLOOKUP(RC[-3],'C:\\COD\\[fichier.xls]tableau'!R2C2:R100C5,4,FALSE)<>''MUTUEL'','''',''MUT'')'

C'est un petit bout de code qui positionne une formule sur toutes les lignes contenant des valeurs. Cela indique MUT si il trouve la valeur MUTUEL dans le fichier interrogé en Vlookup...

Le souci, c'est que cette macro tourne assez lentement aussi (du certainement au fait qu'il y a beaucoup de lignes à traiter), y a t'il moyen que cela se fasse plus rapidement ?
 

myDearFriend!

XLDnaute Barbatruc
Re gab,

Pour ma part, je n'ai jamais été fan des formules Excel qu'on insère par VBA pour obtenir un résultat... Sauf obligation (par exemple, tu souhaiterais des formules dans ces cellules pour pouvoir obtenir d'autres résultats ultérieurement sans pour autant relancer une macro VBA), je pars d'un principe simple : soit on fait tout par formules, soit on fait tout par VBA...
Et comme je ne suis pas très doué en formule Excel et que je ne comprends pas celle-ci, navré, mais je suis bien incapable de pouvoir te proposer l'équivalent en tout VBA pour améliorer ton code...

Cordialement,
 

Discussions similaires

Réponses
4
Affichages
213
Réponses
6
Affichages
142

Statistiques des forums

Discussions
312 300
Messages
2 087 020
Membres
103 435
dernier inscrit
azizou31