IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Probleme Out of Memory Run time error 7 sur macro [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    Janvier 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Par défaut Probleme Out of Memory Run time error 7 sur macro
    Hello,

    je viens vers vous car je ne comprends pas d'où vient le souci sur cette macro tout simple, je souhaite delete toutes les lignes qui ont une valeur égale à VMOB sur un certain range d'une colonne.

    Le fichier est conséquent avec environ 20 à 30 mille lignes.

    Ci dessous le code, qui me semble bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub TEST()
        For Each Cell In Worksheets(1).Range("I2:I30000")
            If Cells.Value = "VMOB" Then Cells.Rows.Delete
        Next
     
    End Sub
    Mais dés que je tourne ma macro et que j'arrive sur la ligne pour delete les lignes, Excel s'arrête et me met : Run Time Error 7 / Out of memory, ça me semble bizarre, ce n'est pourtant pas une macro qui demande énormément de ressources et mon range est défini.

    Je fais sûrement une erreur que je ne vois pas mais je ne vois pas. Si vous avez des idées je suis preneur

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TEST()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    With Worksheets(1).Range("I1:I30000")
        For i = .Rows.Count To 2 Step -1
            If .Cells(i, 1).Value = "VMOB" Then .Cells(i, 1).EntireRow.Delete
        Next
    End With
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    MsgBox "Fin"
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    Janvier 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Par défaut Merci
    Hello,

    ça marche top, merci beaucoup, juste pour pousser et pour apprendre, quelle a été mon erreur ?

    On est obligé de passer par un For i pour ce genre de macros ? J'aimerais juste comprendre cette ligne qui me fait défaut, si jamais tu as le temps, merci pour l'aide en tout cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For i = .Rows.Count To 2 Step -1

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Pourquoi la boucle a l'envers?
    C'est très simple.
    Admettons que tes lignes 3 et 4 contiennent "VMOB"
    si tu boucles normalement, tu supprime la ligne 3, puis la ligne 4, sauf que entre tes deux suppression la ligne 4 a été déplacé, ce que ta boucle ne voit pas, donc elle l'ignore.
    Si je ne suis pas assez clair test sur un exemple en mode pas à pas (f8)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells.Value = "VMOB"Then Cells.Rows.Delete
    Cells c'est toute la feuille! tu évalues If ToutesLesCellules = "VMOB"Then ToutesLesCellules.ToutesLesLignes.Delete

    il faut déboiser arbre par arbre pas la forêt à l’expulsif!

    Peux être es tu Cors ça expliquerait!

  6. #6
    Membre averti
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    Janvier 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Par défaut Thanks
    Je vous fais une réponse globale c'est plus simple,

    je comprends ce que tu as voulu dire Halaster, c'est justement avec le pas à pas que j'ai vu cette erreur, et je comprends du coup la logique.
    Par contre ça ne m'explique pas l'utilité du For i

    @ Dysortographie, je n'ai pas compris la dernière phrase mais ayant délimité mon scope avec un range sur cette même worksheet, je pensais que mon code allait seulement vérifier dans ce range ("I2:I30000") l'existence ou non de ma valeur et delete la ligne le cas échéant si elle était présente. Mais mon raisonnement n'était pas le bon à ce que je vois.

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par Aiyolia Voir le message
    Par contre ça ne m'explique pas l'utilité du For i
    Il n'y a pas de step dans un for each, et c'est le step qui permet de boucler a l'envers
    @ Dysortographie, je n'ai pas compris la dernière phrase mais ayant délimité mon scope avec un range sur cette même worksheet, je pensais que mon code allait seulement vérifier dans ce range ("I2:I30000") l'existence ou non de ma valeur et delete la ligne le cas échéant si elle était présente. Mais mon raisonnement n'était pas le bon à ce que je vois.
    ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells.Value = "VMOB" Then Cells.Rows.Delete
    cells représente TOUTES les cellules de la feuilles
    Que tu test et supprime toutes en même temps.
    Le sien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(i, 1).Value = "VMOB" Then .Cells(i, 1).EntireRow.Delete
    Cells(i, 1) représente LA cellule (i,1)
    donc la le travail se fait bien cellule par celullue (donc supression ligne par ligne)

  8. #8
    Membre averti
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    Janvier 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Par défaut
    D'accord, merci beaucoup, j'ai compris mon erreur et vos réponses respectives !

    Merci pour votre temps et vos explications.

  9. #9
    Invité
    Invité(e)
    Par défaut
    ne confonds pas Cell (ForEach Cell) qui correspond à une cellule de la plage .Range("I1:I30000") et Cells qui correspond à toutes les cellules de ta feuille!

    note également que si tu supprime la ligne 1, la ligne deux passe en ligne 1 ; donc si tu débuté en ligne 1 que tu la supprime ton
    ForEach saute la ligne 2 puisqu'elle est remonté d'un cran!

    il faut commencer à la dernière ligne de ta feuille! (.Range("I1:I30000").Rows.Count ) For i = .Rows.Count To2Step-1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème run time error '3001' sur un Update
    Par petit rabot dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 18/02/2015, 18h53
  2. [XL-2013] Run-time error '9': Subscript out of range
    Par francoisem dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 16/12/2014, 09h06
  3. Error lancement dll dans VBA: Run-time error '28' - Out of stack space
    Par cfrelet dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/05/2010, 10h30
  4. [debutant] Run-time error '9': Subscript out of range
    Par NikoBe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/12/2008, 08h26
  5. [VBA] Run-time error : '35600' Index out of bound
    Par neo2k2 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/03/2008, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo