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
 
Bonjour David,

Ton fichier est énorme !! 32000 lignes !!
Donc évidemment quand tu analyses chaque ligne il faut du temps, relation de cause à effet.

ça me rappelle l'histoire de Toto qui pleure parce que tout le monde rit de lui en lui disant 'Toto tu as une grosse tête'
Son père cherche à le consoler et lui dit 'Allez Toto mais non tu n'as pas une grosse tête et pour te changer les idées va nous chercher 10 kg de pommes de terre dans ta casquette'

De plus le code que tu utilises est parfait (à part que tu parles de la colonne Z et que tu analyses la cilonne C !!)

Bon courage et bonne soirée
 
Re
Je suis d'accord mais rien que pour analyser 700 lignes il me faut près de 5 min.

Parce que je dois faire une autre analyse en plus de celle la.

Code:
Application.ScreenUpdating = False

'efface toutes les lignes qui ont un code 122
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('Z' & I) = '122' Then Rows(I).Delete
Next I
End With

'efface toutes les lignes qui ne finissent pas par #N/A
Dim J As Integer
J = 1
With Sheets('Tableau de synthèse')
For J = .Range('C65536').End(xlUp).Row To 2 Step -1
If Not IsError(.Range('AF' & J)) Then
If .Range('AF' & J) = 'E' Or .Range('AF' & J) = '' Then Rows(J).Delete
End If
Next J
End With
Application.ScreenUpdating = True


Y a t'il un moyen pour cumuler les deux.
L'histoire de diminuer un peu le temps d'analyse.

David
 
Bonjour david, jacques

Tu pourrais essayer de passer par des tableaux dynamiques.

par exemple :

Sub Bouton5_QuandClic()
Dim tablo As Variant
Dim tablores()
Dim i As Long
Dim x As Integer
Dim j As Byte

tablo = Range('c2').CurrentRegion

For i = 1 To UBound(tablo)
If tablo(i, 2) Different de 122 Then
x = x + 1
ReDim Preserve tablores(1 To UBound(tablo, 2), 1 To x)
For j = 1 To UBound(tablo, 2)
tablores(j, x) = tablo(i, j)
Next j
End If
Next i

Sheets('feuil2').Range('a1').Resize(UBound(tablores, 2), UBound(tablores, 1)) = Application.WorksheetFunction.Transpose(tablores)

End Sub

remplacer different de par les signes supérieur > et inferieur <

ce type de code crée un tableau (tablo), puis renvoi dans un autre tableau dynamique (tablores) les lignes ne contenant pas 122, renvoi en feuil2.

avantage de ce type de procédure : la rapidité d'exécution (32000 lignes en moins d'une seconde)

inconvénient : tu perd les mises en forme des cellules (gras, couleur...)

salut
 
Bonjur David, bonjour Jacques, bonjour à toutes et à tous 🙂

Peut-être une solution un peu plus rapide à l'aide de find :

Sub SupprimeLignes()
'
Dim Cell As Range
'
  Application.ScreenUpdating = False

  With Sheets('Tableau de synthèse').Range('Z:Z')
    Set Cell = .Find(what:=122, LookIn:=xlValues, lookat:=xlWhole)
    If Not Cell Is Nothing Then
      Do
        Cell.EntireRow.Delete
        Set Cell = .FindNext
      Loop Until Cell Is Nothing
    End If
  End With

  Application.ScreenUpdating = True

End Sub

Tiens nous au courant 😉

A+
 
Bonjour à tous et merci pour vos réponse.

Est t'il possible de faire un tableau dynamique mais a la place de le faire sur 1 critère en mettre 3.
Je m'explique, j'aimerai supprimer les lignes quand:
-il y a un '' ou un E dans la colonne AF
-il y a un 122 dans la colonne Z

Est ce possible, si oui comment l'intégrer dans le code.
Code:
Sub Bouton5_QuandClic()
Dim tablo As Variant
Dim tablores()
Dim i As Long
Dim x As Integer
Dim j As Byte

tablo = Range('c2').CurrentRegion

For i = 1 To UBound(tablo)
If tablo(i, 2) Different de 122 Then
x = x + 1
ReDim Preserve tablores(1 To UBound(tablo, 2), 1 To x)
For j = 1 To UBound(tablo, 2)
tablores(j, x) = tablo(i, j)
Next j
End If
Next i

Sheets(\\'feuil2\\').Range(\\'a1\\').Resize(UBound(tablores, 2), UBound(tablores, 1)) =
Application.WorksheetFunction.Transpose(tablores)

End Sub

Merci d'avance, je ne connais pas du tout les tableau dynamique.

David
 
Bonjour david, hervé, Charly2 🙂

David, tu es un xldien fervent ce temps-ci, et respectueuex de la charte 😉

Un point toutefois, dans tes fils, une fois résolus à première vue, tu n'en signales jamais l'issue, il ne s'agit pas de dire merci, tu le fais sans pb, il s'agit pour les contributeurs de savoir ce qui a débouché ou non, ce qui n'est pas évident, preuve en est le nombre de post qu'un fil peut engendrer.... Si il y avait certitude absolue, il n'y aurait que des one shot en réponse 🙂

Voir ici: pour ces 48 heures

Lien supprimé

Lien supprimé

Lien supprimé

Lien supprimé


De plus avec la conotation prestigieuse du pseudo que tu portes ici 🙂 on est plus sensibles :lol:

Bonne journée,

Brico
 
re tout le monde, salut charly, brico

david 🙂

Quand tu auras répondu aux doléances justifiées de l'ami brico, je pourrais te répondre qu'il faut que tu nous addresse un fichier afin que l'on puisse voir la stucture de ta feuille.

salut
 
Bonjour à tous

juste un lien sur une solution utilisant le filtre auto et qui me parait parfaitement adapté à ce cas. Voir message de Thierry 22-07-04 11:36 (jamais vu plus rapide) mais il y a plein d'autres soluces dans ce fil.
Lien supprimé

Cordialement, A+

Ps: pour David, les variables integer n'allant que jusqu'à 32767, tu ferais mieux, en travaillant sur cette échelle de grandeur, de définir I en long. Je le fais systématiquement dés que je travaille sur des lignes car le nombre de lignes utilisées d'une feuille peut aller jusqu'à 65536.

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

Tout d'abord pour répondre à Bricofire.
Ce que tu as marqué est vrai je le ferais par la suite.
Mais dans certain post quand je marque 'Merci ca répond à ma demande et qu'il y a qu'une personne qui m'a répondu, je pensais que ce n'était pas necessaire.

Sinon, pour revenir a mon problème j'ai modifié mon code pour qu'au lieu de supprimer les lignes qui me me fasse un tri élaboré et qui m'envoi donc cette sélection dans un autre onglet, ce qui a prioris me fais gagner pas mal de temps.
Temps pour analyser 700 lignes moins de 10 s contre 5/6 minutes auparavant.
Mais par contre pour analyser les 32000 ca met 12 minutes.

Mais bon je crois que je pourrais pas faire mieux.

Voila

David
 
Bonjour David, Jacques, Hervé, Bricofire, Marc et Yeahou 🙂

David, pour reprendre ce que t'a dit Hervé, je pense effectivement qu'un fichier exemple serait le bienvenu.

Personnellement, je trouve que 12 mn pour traiter un fichier, c'est très long. Tu peux utiliser l'exemple d'Hervé et l'adapter ou, si tu t'en sens capable, aller voir la façon de procéder de notre ami @+Thierry dans le fil que Yeahou a mis en lien.

Douze minutes, on peut certainement faire mieux, mais il ne faut pas que tu baisses les bras 😉

A+
 
- 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
907
Retour