Erreur 6 dépassement de capacite

chris6999

XLDnaute Impliqué
Bonsoir

J'ai depuis peu une erreur de type "dépassement de capacité" sur le code ci-après.
j'avais cru comprendre qu'il s'agissait d'un pb de calcul mais il n'y a aucun calcul dans ma mcro.

Quelqu'un aurait-il une idée?

Merci

Sub SupprimeLignesInutiles() 'celles ou figurent TI43


Dim Cellule As Range
'supprime les lignes lorsque la valeur TI43 est présente sur la ligne
For Each Cel In Range("A1:M500")

If Cel.Value Like "*TI43*" Then

Cel.EntireRow.delete
End If

Next Cel


End Sub
 

Papou-net

XLDnaute Barbatruc
Re : Erreur 6 dépassement de capacite

Bonsoir chris6999,

Ce phénomène est courant dans les boucles de suppression de lignes, car les lignes étant renumérotées à chaque action de suppression, on n'atteint jamais la limite visée. Pour pallier ce genre de problème, il faut remonter de la dernière ligne à la première.

Par exemple :

For i = 500 To 1 Step - 1
For Each Cel In Range("A" & i & ":M" & i)
If Cel.Value Like "*TI43*" Then
Cel.EntireRow.delete
Exit For
End If
Next Cel
Next i

Cordialement.
 

Papou-net

XLDnaute Barbatruc
Re : Erreur 6 dépassement de capacite

Bonjour Chris,
Hello shezi,

Une autre solution plus simple, avec une seule boucle, qui analyse une plage de cellules selon le contenu et non selon le n° de ligne. La plage est donc fixe et n'est plus influencée par la renumérotation automatique.

Code:
Sub SupprimeLignesInutiles() 'celles ou figurent TI43
Dim Cel As Range
'supprime les lignes lorsque la valeur TI43 est présente sur la ligne
For Each Cel In Range("A1:M500").SpecialCells(xlCellTypeConstants)
  If Cel.Value Like "*TI43*" Then Cel.EntireRow.Delete
Next Cel
End Sub
Outre sa simplicité, ce code autorise une plus grande rapidité d"exécution.

Cordialement.
 

chris6999

XLDnaute Impliqué
Re : Erreur 6 dépassement de capacite

Me revoila avec mon erreur 6 dépassement de capacité;
J'ai utilisé ton code qui au début fonctionnait bien et là rebelote j'ai le code 6 qui revient.
Du coup j'ai essayé avec ta première proposition et c'est pareil.
C'est à s'arracher les cheveux.

Je ne sais plus quoi penser.

Si tu as une idée.....
Merci
 

Papou-net

XLDnaute Barbatruc
Re : Erreur 6 dépassement de capacite

Bonsoir Chris,

J'ai fait moult essais sur un fichier que j'ai crée pour la circonstance, et ils ont tous donné satisfaction.

Je ne saurais donc quoi te dire d'autre et, comme je tiens aux quelques cheveux qui me restent sur le caillou, je ne pourrais que te conseiller de joindre une copie de ton fichier. En n'oubliant pas de supprimer ou remplacer les données confidentielles s'il y a lieu, mais sans toucher à la structure.

A bientôt.

Cordialement.
 

Papou-net

XLDnaute Barbatruc
Re : Erreur 6 dépassement de capacite

RE :

Réflexion faite, essaie le code suivant :

Code:
Sub SupprimeLignesInutiles()
Dim i As Integer
Set dicLignes = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
With Feuil1
  For Each cel In Range("A1:M500")
    ' cette boucle balaie la plage définie et stocke dans le tabeau dicLignes _
    les n° trouvés
    If cel.Value Like "*TI43*" Then
      If Not dicLignes.exists(cel.Row) Then dicLignes.Add cel.Row, cel.Row
    End If
  Next
  l = dicLignes.items
  For i = 0 To dicLignes.Count - 1
    ' cette boucle sélectionne toutes les lignes du tableau dicLignes
    If i = 0 Then
      ' sélectionne la première ligne trouvée
      .Rows(l(i)).EntireRow.Select
      Else
      ' ajoute à la sélection les lignes suivantes
      Application.Union(Selection, .Rows(l(i)).EntireRow).Select
    End If
  Next
  ' Efface les ligne sélectionnées en une seule opération
  Selection.Delete
End With
Application.ScreenUpdating = True
Selection.Range("A1").Select
dicLignes = "" ' Efface le tableau
End Sub
Il utilise un tableau qui enregistre les n° des lignes concernées et les efface après sélection, en une seule opération. J'ai testé, ça fonctionne également mais la méthode est peut-être plus sûre que les précédentes.

Cordialement.
 

Herdet

Nous a quitté
Repose en paix
Re : Erreur 6 dépassement de capacite

Bonsoir

J'ai depuis peu une erreur de type "dépassement de capacité" sur le code ci-après.
j'avais cru comprendre qu'il s'agissait d'un pb de calcul mais il n'y a aucun calcul dans ma mcro.

Quelqu'un aurait-il une idée?

Merci

... et pour accélérer grandement le processus tu peux bloquer l'écran pendant la suppression avec Application.ScreenUpdating = False


Sub SupprimeLignesInutiles() 'celles ou figurent TI43
Dim Cellule As Range
'supprime les lignes lorsque la valeur TI43 est présente sur la ligne
Application.ScreenUpdating = False
For Each Cel In Range("A1:M500")
If Cel.Value Like "*TI43*" Then
Rows(Cel.Row).EntireRow.Delete
End If
Next Cel
Application.ScreenUpdating = True
End Sub

Robert
 

Papou-net

XLDnaute Barbatruc
Re : Erreur 6 dépassement de capacite

Bonjour,
Remplacer Cel.EntireRow.delete par Rows(Cel.Row).EntireRow.Delete
Cordialement
Robert

Bonjour Robert,

Les deux écritures sont équivalentes.

Cel désignant une cellule, c'est comme si on écrivait : Range("A" & Cel.Row).EntireRow.Delete mais en bien plus court.

Et on pourrait aussi simplifier ta formule (j"aime retarder l'usure des touches de mon clavier) : Rows(Cel.Row).Delete

Cordialement.
 

Papou-net

XLDnaute Barbatruc
Re : Erreur 6 dépassement de capacite

... et pour accélérer grandement le processus tu peux bloquer l'écran pendant la suppression avec Application.ScreenUpdating = False

RE : Robert,

As-tu remarqué que c'est ce que j'ai écrit dans mon dernier code ?

Mais peu importe, et quoiqu'il en soit, une boucle descendante pour supprimer des lignes ne fonctionnera jamais correctement.

Cordialement.
 

chris6999

XLDnaute Impliqué
Re : Erreur 6 dépassement de capacite

Merci pour toutes ces précisions Papounet

Ton message m'a mis la puce à l'oreille. J'ai donc testé la macro sur un autre PC et là miracle plus d'erreur number 6.
Je vais quand même utiliser ta dernière proposition par sécurité.

Merci encore à tous ceux qui m'ont apportée leur aide

Cordialement
 

Discussions similaires

Réponses
3
Affichages
603

Statistiques des forums

Discussions
312 871
Messages
2 093 102
Membres
105 627
dernier inscrit
jean-marc.brillant