Temps d'execution trop long

  • Initiateur de la discussion Initiateur de la discussion David
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

D

David

Guest
Bonjour à tous.
J'utilise le code suivant (Pris sur le forum)
Ce qui me permet de supprimer les lignes qui ont dans la colonne Z le nombre 122.
Le problème est que mon tableau possede plusieur milliers de ligne (32000).
Avez vous une solution plus rapide.

Code:
Application.ScreenUpdating = False
Dim I As Integer
I = 1
With Sheets('Tableau de synthèse')
For I = .Range('C65536').End(xlUp).Row To 2 Step -1
If .Range('C' & I) = '122' Then Rows(I).Delete
Next I
End With
Application.ScreenUpdating = True

Merci de votre aide

David
 
Re

Le problème et que je ne suis pas sur que ce soit la recherche qui prennent autant de temps.

En effet, j'ai plusieur format à changer également: (code pris sur différent post)

Format de date:
Car dans mon fichier j'ai des dates sous cette forme 12.12.2005

Des valeur qui se mettent sous la forme
1.000

et je pense que c la modification de ces format qui prend beaucoup de temps.



Code:
'Selectionne colonne E,I et change les . par des /
    Range('E2' & ':E' & dl).Select
    For Each c In Selection
    c.Value = CDate(Replace(c, '.', '/'))
    Next c
    
    Range('I2' & ':I' & dl).Select
    For Each c In Selection
    c.Value = CDate(Replace(c, '.', '/'))
    Next c
    
    'Remet en forme des chiffres de la colonne J (quantité)
    Dim rngCell As Range

    With ActiveSheet
    Range('J2' & ':J' & dl).Select

    '      .UsedRange.NumberFormat = '0'
        For Each rngCell In Selection
                 rngCell.Value = Val(Replace(rngCell.Value, '.', ''))
        Next rngCell
    End With
Lorsque je lance ma macro et que je la coupe au bout de 30/40s (en faisant échap) je suis encore sur le 1er 'Next c'

En ce qui concerne mon fichier, il fait plus de 8Méga.


David
 
Re

Pour information si je ne réalise pas ces taches à l'aide de la macro.
Je passe de 12 minutes à 30 seconde.

Ce qui est vraiment très bien.
Le problème est que je dois absoluement transformer ces valeurs à l'aide de la macro.


David
 
Bonjour

Une piste
Au lieu de supprimer une ligne ( excel décalant l'ensemble des lignes ) pourquoi ne pas faire une copie des lignes à conserver dans une nouvelle feuille et ensuite supprimer la feuille.

Pour déterminer l'efficacité des macros rajouter des compteurs dans une feuille pour mesurer
le temps d'éxécution
le nombre de ligne supprimé
le nombre de lignes par ...

Bon courage
 
Re

Je sais que je devrais envoyer un fichier joint mais mon fichier pese 8 méga.

J'ai essayé avec ton code hervé alors coté vitesse c'est parfait mais par contre a chaque fois que le jour est <12 il me le met à la place du mois.


23.11.2005
19.12.2005
09.01.2006
09.01.2006
09.01.2006
09.01.2006
Transformé en

23/11/2005
19/12/2005
01/09/2006
01/09/2006
01/09/2006
01/09/2006


Voila

Merci

David
 
Voici un fichier joint comme vous me l'avez demandé.

Cela fonctionne parfaitement pour 700 lignes mais pour 32000 ca prend vraiment longtemps, surtout que je n'ai pas que deux colonnes de date a transformer.

Merci d'avance a vous tous.

David
[file name=TESTDavid_20060119180128.zip size=16979]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/TESTDavid_20060119180128.zip[/file]
 

Pièces jointes

Re,

David, je ne me suis intéressé qu'à la suppression pour le moment, mais je te joins un fichier qui contient une procédure TriSupprime :

Option Explicit

Sub TriSupprime()
'
'****************************************************************
' TriSupprime : 19/01/2006 à 18:00
' --------------------------------
' La pièce que nous vous présentons ce soir est de @+Thierry
' les décors de @+Thierry
' les costumes de Charly2
'****************************************************************
'
Dim NouvCol%
Dim DerLigne&
Dim OldCalculation&
Dim Start, Finish
'
Start = Timer
With Application
.ScreenUpdating = False
' Pas de calcul automatique
OldCalculation = .Calculation
.Calculation = xlCalculationManual
End With
'
' recherche de la première colonne de titre vide et de la
' dernière ligne de données
NouvCol = Range('IV1').End(xlToLeft).Column + 1
DerLigne = Range('A1').End(xlDown).Row
'
' on saisit une formule dans la colonne à droite du tableau...
Cells(2, NouvCol).FormulaLocal = '=SI(OU(Z2=122;AF2='' '';MAJUSCULE(AF2)=''E'');1;0)'
Cells(2, NouvCol).Copy Range(Cells(2, NouvCol), Cells(DerLigne, NouvCol))
'
' Calcul de la nouvelle colonne
Columns(NouvCol).Calculate
'
' Copie des valeurs seules
Range(Selection, Cells(DerLigne, NouvCol)).Copy
Range(Selection, Cells(DerLigne, NouvCol)).PasteSpecial Paste:=xlValues
'
' Puis on trie le tableau avec le résultat de la formule
Selection.Sort Key1:=Cells(2, NouvCol), Order1:=xlDescending, header:=xlYes
'
' seules les lignes à supprimer seront visibles
Range('BA1').AutoFilter Field:=NouvCol, Criteria1:='1'
'
' Et on les supprime
On Error Resume Next
Range('A2:A' & Range('A65536').End(xlUp).Row) _
.SpecialCells(xlCellTypeVisible).EntireRow.Delete Shift:=xlUp
On Error GoTo 0
With ActiveSheet
.ShowAllData
.AutoFilterMode = False
End With
Columns(NouvCol).Delete Shift:=xlShiftToLeft
With Application
.Calculation = OldCalculation
.ScreenUpdating = True
End With
Finish = Timer
MsgBox 'Temps d'exécution : ' & (Finish - Start)
End Sub

J'ai vérifié le temps d'exécution sur plus de 32000 lignes : 8s50 avec mon vieux PII-400...

[file name=David_20060119183851.zip size=51097]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/David_20060119183851.zip[/file]

A+ pour la suite
 

Pièces jointes

Bonsoir le fil, bonsoir Yeahou 🙂

C'est vrai que c'est époustouflant ! Je me suis basé sur le code de Thierry mais il restait un peu lent sur 32000 lignes avec une suppression de lignes non adjacentes : XL décale le tableau à chaque série de lignes adjacentes.

J'ai donc pensé qu'en plaçant les lignes à supprimer en un seul bloc, cela irait plus vite : bingo !!! 😉

Merci @+Thierry !!!

Juste une petite erreur dans le code de ma part :

Option Explicit

Sub TriSupprime()
'
'****************************************************************
' TriSupprime : 19/01/2006 à 18:00
' --------------------------------
' La pièce que nous vous présentons ce soir est de @+Thierry
' les décors de @+Thierry
' les costumes de Charly2
'****************************************************************
'
Dim NouvCol%
Dim DerLigne&
Dim OldCalculation&
Dim Start, Finish
'
Start = Timer
With Application
.ScreenUpdating = False
' Pas de calcul automatique
OldCalculation = .Calculation
.Calculation = xlCalculationManual
End With
'
' recherche de la première colonne de titre vide et de la
' dernière ligne de données
NouvCol = Range('IV1').End(xlToLeft).Column + 1
DerLigne = Range('A1').End(xlDown).Row
'
' on saisit une formule dans la colonne à droite du tableau...
Cells(1, NouvCol) = 'TitreBidon'
Cells(2, NouvCol).FormulaLocal = '=SI(OU(Z2=122;AF2='' '';MAJUSCULE(AF2)=''E'');1;0)'
Cells(2, NouvCol).Copy Range(Cells(2, NouvCol), Cells(DerLigne, NouvCol))
'
' Calcul de la nouvelle colonne
Columns(NouvCol).Calculate
'
' Copie des valeurs seules
Range(Selection, Cells(DerLigne, NouvCol)).Copy
Range(Selection, Cells(DerLigne, NouvCol)).PasteSpecial Paste:=xlValues
'
' Puis on trie le tableau avec le résultat de la formule
Selection.Sort Key1:=Cells(2, NouvCol), Order1:=xlDescending, header:=xlYes
'
' seules les lignes à supprimer seront visibles
Range('BA1').AutoFilter Field:=NouvCol, Criteria1:='1'
'
' Et on les supprime
On Error Resume Next
Range('A2:A' & Range('A65536').End(xlUp).Row) _
.SpecialCells(xlCellTypeVisible).EntireRow.Delete Shift:=xlUp
On Error GoTo 0
With ActiveSheet
.ShowAllData
.AutoFilterMode = False
End With
Columns(NouvCol).Delete Shift:=xlShiftToLeft
With Application
.Calculation = OldCalculation
.ScreenUpdating = True
End With
Finish = Timer
MsgBox 'Temps d'exécution : ' & (Finish - Start)
End Sub

A+

Message édité par: Charly2, à: 19/01/2006 21:43
 
Bonjour tous le monde.

Tout d'abord merci de vous etre penchez sur mon problème.

Charly2, j'ai essayé ton code mais, il ne me supprime pas tous les 122 et les E.

Et j'ai l'impression qu'il me supprime des lignes qu'il ne devrait pas supprimer.
J'ai essayé d'exécuter la macro plusieurs fois et a la fin il me reste une 20ène de ligne.

Sinon c'est vrai que c'est super rapide, c'est exactement ce qu'il me faudrait.

Ya t'il un moyen pour modifier également les format à cette vitesse?


David
 
Bonjour David, bonjour à toutes et tous 🙂

Je suis un peu surpris car je viens de tester à nouveau sur 31500 lignes avec :
- 4200 cellules égales à 122 dans la colonne Z
- 16380 cellules contenant 'e' ou 'E' ou '' dans la colonne AF

et 17430 lignes à supprimer ; elles le sont en moins de 12s.

J'aimerais bien voir le format de ton fichier : la feuille concernée avec quelques lignes de données organisées comme dans ton fichier.

A+
 
Re David,

Tu as déjà celui que j'ai joint à l'exemple de macro (à rectifier comme indiqué plus bas). Sinon, je veux bien t'envoyer mon fichier test mais il pèse près de 7Mo zippé (pourtant sans fioriture).

Je regarde ton fichier cet AM 😉

A+
 
Bonjour le Fil
Bonjour David

Ci joint un fichier avec une macro qui recopie la feuille (ligne par ligne) en éliminant les lignes à supprimer, qui modifie le format des dates et des nombres.
Temps 108 lignes par seconde 8 minutes pour traiter 54000 lignes.
(Il faut effacer les lignes pour visualiser le temps)

A + [file name=TESTDavid11.zip size=25343]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/TESTDavid11.zip[/file]
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
5
Affichages
905
Retour