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 :

[VBA-E] erreur 1004 et depassement de capacité dans une boucle


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut [VBA-E] erreur 1004 et depassement de capacité dans une boucle
    bonjour,
    si "observations" existe sur la feuille il me met erreur 1004 la methode delete de la classe range a échoué
    et s'il ne trouve pas le mot il me met depassement de capacité et il s'arrête sur la ligne
    i = i + 1




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sheets("dotation").Activate
     
    i = 1
     
    'While cells(i, 1).Value <> "observations"
      While (Trim(LCase(cells(i, 1).Value)) <> "observations")
     ' While (InStr(1, (cells(i, 1).Value), "OBSERVATIONS", vbTextCompare) = 0)
        i = i + 1
    Wend
    Rows(i & ":" & i + 6).Delete'------->LIgne erreur
    A star is dead

  2. #2
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    Bonjour,
    Si tu n'as pas de cellule avec observations dedans, c'est normal qu'il y ait erreur vu qu'il va chercher dans chaque cellule jusque tout en bas du tableau (soit la ligne 65537), sauf que moi il s'arrête à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      While (Trim(LCase(Cells(i, 1).Value)) <> "observations")
    Chez moi, si il y a "observations" dans une cellule, ta macro marche bien
    Peut-être qu'il y a des cellules fusionnées verticalement dans les 7 lignes que tu effaces ? Peut-être que ton "observations" est dans les 6 dernières lignes du tableau (de 65532 à 65537 ?) auquel cas il n'arrive pas à effacer des lignes qui n'existent pas ?? mais bon je doute que tu utilise les 6 dernières lignes de ton tableau

  3. #3
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    oui les cellules en dessous d'OBSERVATIONS sont fusionnées
    A star is dead

  4. #4
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    C'est fusionné comment ? J'ai fait quelques tests, mais ça marche chez moi

  5. #5
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    avec ce code il me met une erreur 6 depassement de capacité lorsqu'il ne trouve pas le mot mais le mot observation n'y sera pas forcément (j'aurais peut etre du commencer par là désolé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    While (InStr(1, (cells(i, 1).Value), "OBSERVATIONS", vbTextCompare) = 0)
    Mes cellules sont fusionnées comme celà


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sheets("dotation").Activate
    '[a65536].End(xlUp).Select
     NbLigneTab1 = Range("A65536").End(xlUp).Row
    NbLigneTab2 = Range("f65536").End(xlUp).Row
    If NbLigneTab1 <= NbLigneTab2 Then
        Range("a" & NbLigneTab2 + 1).Value = "OBSERVATIONS"
    ElseIf NbLigneTab1 >= NbLigneTab2 Then
        Range("A" & NbLigneTab1 + 1).Value = "OBSERVATIONS"
    End If
     
     [a65536].End(xlUp).Select
     
       ActiveCell.EntireRow.Offset(2, 0).Range("a1:K3").Select
    With Selection
        .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            ShrinkToFit = False
            .MergeCells = True
        End With
         ActiveCell.Offset(0, 0).Value = TextBox1
     
        Sheets("dotation").Activate

    Merci Cwain a+
    A star is dead

  6. #6
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    Bon en fait pour l'erreur 1004, j'ai réussi à la reproduire si tu as des cellules protégées parmi les lignes que tu veux effacer.
    Pour les cellules fusionnées, chez moi ça pose pas de problème pourtant ya sûrement un p'tit quelque chose de ce côté là

    Pour le dépassement de capacité, peut-être tu simplifierais le code en nommant ta cellule "observations" pour pouvoir y faire appel par la suite ?

  7. #7
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    bonsoir,

    je n'ai pas de cellules protégées

    pour nommer la cellule je vois pas trop comment car parfois le mot obnservations ainsi que les cellules fusionnées ne seront pas sur la feuille car c'est une meme feuille qui est imprimée en fin de vacation et "remise a zéro" epour l'équipe montante.


    merci

    a+
    A star is dead

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Si tu as des cellules fusionnées verticalement, tu dois nommer la ligne de la première cellule.
    Mais je ne comprends pas pourquoi tu ne sors pas de la boucle.
    Essai de faire avancer ta macro au pas à pas etmets une borne supplémentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do While instr(LCase(cells(i, 1).Value),"observation") <> 0 and i < 65536
        i = i + 1
    loop
    Rows(i & ":" & i + 6).Delete
    (pas besoin du trim dans ce cas là.
    Déjà tu n'auras pas de problème de pile si tu as déclaré i as long.
    J'ai mis do while car while wend vient du basica et que j'ai jamais aimé le basica
    Tu dis

  9. #9
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    Bonjour Ouskel, avec ton code, qu'il y ait ou non le mot OBSERVATIONS, j'ai une erreur 1004 erreur definit par l'application ou par l'objet

    merci
    a+
    A star is dead

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon, on va le régler ce problème
    A la place de
    Rows(i & ":" & i + 6).Delete
    tu vas mettre tout ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub SupprimerLignesDontCellulesFusionnées() 
    'si tu passes le paramètre 1ère ligne à la macro
    'Sub SupprimerLignesDontCellulesFusionnées(i) 
    
    Dim j As Integer
    Dim i as integer '' à supprimer si tu le passes en paramètre à cette macro
    i = 10 ' à supprimer si tu le passes en paramètre à cette macro
    For j = i + 5 To i Step -1
        Range("A" & j).Select 'si la ligne ou la cellule est fusionnée -> (*) 
        Selection.MergeCells = False ' si la cellule est fusionnée 
        Rows(j).Select '(*) on est passé à la ligne du dessus, donc, on resélectionne
        Selection.MergeCells = False ' si la ligne est fusionnée
        Rows(j).Select '(*) on est passé à la ligne du dessus, donc, on resélectionne
        Selection.EntireRow.Delete
    Next
    End Sub
    Testé et tout
    Quite à faire un call sur le nom de la procédure avec i comme paramètre, Pour tester, et à part i, tu ne changes RIEN à ce que j'ai mis !
    Non mais !
    Tu dis
    A+

    Edit
    J'ai ajouté une ligne pour les mêmes raisons que plus haut, tu corriges. Comme tu parlais de cellules fusionnées, je n'avais pas testé pour une ligne... alors on ne sais jamais
    Quand j'aurai une minute, je supprimerai les sélections mais là... je vais souffler un peu

  11. #11
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    ah non je n'ai rien changé !! pas encore !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do While instr(LCase(cells(i, 1).Value),"observation") <> 0 and i < 65536
        i = i + 1
    loop
    Rows(i & ":" & i + 6).Delete
    tu m'a dis parce que j'ai pas tout compris le code
    à la place de la dernière ligne rows(i etc...)je remplace par ton nouveau code mai je rajoute aussi do while .... jusqu'a loop je comprends plus là

    Chut AH NON j'ai rien changé je pose une question MÖSIEUR !!

    merci pour tout a+ bonne soirée
    A star is dead

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ta macro, tu la termines ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    '.......
    '.......
    do While instr(LCase(cells(i, 1).Value),"observation") <> 0 and i < 65536
        i = i + 1
    loop
    Call SupprimerLignesDontCellulesFusionnées(i)
    'du code si tu as du code, mais ici, tu ne deletes rien ^^^ 
    End sub
    et tu mets i en paramètre dans la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub SupprimerLignesDontCellulesFusionnées(i)
    Tu dis
    a+

  13. #13
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    bonjour ouskel
    dis moi si je me suis planté stp

    car il me met une erreur 1004su la case do while etc erreur definit par l'application ou par l'objet .
    Je ne pense pas avoir modifié quoi que ce soit en tout cas je plaide non coupable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sheets("dotation2").Activate
    
    Do While InStr(LCase(cells(i, 1).Value), "observation") <> 0 And i < 65536    i = i + 1
    Loop
    'Rows(i & ":" & i + 6).Delete
    
    Call SupprimerLignesDontCellulesFusionnées(i)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub SupprimerLignesDontCellulesFusionnées(i)
     
    Dim j As Integer
    'Dim i As Integer '' à supprimer si tu le passes en paramètre à cette macro
    Sheets("dotation2").Select
    'i = 10 ' à supprimer si tu le passes en paramètre à cette macro
    For j = i + 5 To i Step -1
     
        Range("A" & j).Select 'si la ligne ou la cellule est fusionnée -> (*)
        Selection.MergeCells = False ' si la cellule est fusionnée
        Rows(j).Select '(*) on est passé à la ligne du dessus, donc, on resélectionne
        Selection.MergeCells = False ' si la ligne est fusionnée
        Rows(j).Select '(*) on est passé à la ligne du dessus, donc, on resélectionne
        Selection.EntireRow.Delete
     
     
     
    Next
    End Sub
    merci a+
    A star is dead

  14. #14
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonjour lio62..

    ou est l'initialisation de ta variable i avant le passage dans ta boucle do While... si aucune initialisation i à la valeur 0 au 1° tour de boucle, d'ou erreur 1004 sur cells(i....





  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    +1
    Je crois que tu as tout compris, bbil
    Lio, ta variable i peut aller de 1 à 65536, tu dois la déclarer en Long.
    Mets cette déclaration dans la macro appelante, avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Do While InStr(LCase(cells(i, 1).Value), "observation") <> 0 And i < 65536    i = i + 1
    Loop
    Je crois t'avoir donné une syntaxe qui fonctionne où tu évites de visiter 65536 ligne si tu n'as des données que jusqu'à la ligne 100
    Tu devrais l'utiliser. Comme elle n'a pas l'heur de te plaire, en voici une autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i as long
    DerniereLigne = Range("A65535").End(xlUp).Row
    For i = 1 to DerniereLigne 
         If InStr(LCase(cells(i, 1).Value), "observation") <> 0 then exit for
    Next
    Call SupprimerLignesDontCellulesFusionnées(i)
    A+

    Psst ! Tu est sûr qu'observation est bien dans la colonne 1 ?

    NB - Pense à déclarer DerniereLigne as long... on ne sait jamais

  16. #16
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    j'ai bien déclaré m variable I as long en première ligne de ma userf
    mais j'avais "mangé" ces deux lignes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DerniereLigne = Range("A65535").End(xlUp).Row
    For i = 1 to DerniereLigne

    désolé Ouskel j'ai pourtant essayé de faire attention j'ai donc plus d'erreur

    par contre il m'efface les trois quarts de la feulle heureusement que c'est une copie.

    et il n'y a pas de logique dans son effacement il termine sur la cellule ou il y a observation
    merci a+
    A star is dead

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu as supprimé cette ligne de code
    i = 10 ' à supprimer si tu le passes en paramètre à cette macro
    Tu dis
    A+

    et celle-ci ?
    Dim i as integer '' à supprimer si tu le passes en paramètre à cette macro

  18. #18
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    j'ai fait ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub SupprimerLignesDontCellulesFusionnées(i)
    et j'ai supprimer dim i as integer

    j'ai laissé dim i as long
    et j'ai également supprimer i=10

    merci a+
    A star is dead

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Dans la sub appelée, ici :
    Sub SupprimerLignesDontCellulesFusionnées(i)
    tu ne dois jamais déclaré de variable portant le nom du/des paramètre(s)
    Pas de
    Dim i as integer
    ni de
    Dim i as long
    et donc, pas de
    i = 10
    A+

    Dim i as long doit être déclaré dans la procédure "appelante"

  20. #20
    Membre régulier Avatar de lio62
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 472
    Points : 101
    Points
    101
    Par défaut
    j'ai ca


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    'si tu passes le paramètre 1ère ligne à la macro
    Sub SupprimerLignesDontCellulesFusionnées(i)
     
    Dim j As Integer
    'Dim i As Integer '' à supprimer si tu le passes en paramètre à cette macro
    Sheets("dotation2").Select
    'i = 10 ' à supprimer si tu le passes en paramètre à cette macro
    For j = i + 5 To i Step -1
     
        Range("A" & j).Select 'si la ligne ou la cellule est fusionnée -> (*)
        Selection.MergeCells = False ' si la cellule est fusionnée
        Rows(j).Select '(*) on est passé à la ligne du dessus, donc, on resélectionne
        Selection.MergeCells = False ' si la ligne est fusionnée
        Rows(j).Select '(*) on est passé à la ligne du dessus, donc, on resélectionne
        Selection.EntireRow.Delete
        'Do While InStr(LCase(cells(i, 1).Value), "observations") <> 0 And i < 65536
       ' i = i + 1
    'Loop
     
    Next
    End Sub
    et dans l'autre j'ai ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CommandButton1_Click()
    Dim i As Long
    Sheets("dotation2").Activate
     
    derniereligne = Range("A65535").End(xlUp).Row
    For i = 1 To derniereligne
     
    Do While InStr(LCase(Cells(i, 1).Value), "observation") <> 0 And i < 65536
        i = i + 1
    Loop
    'Rows(i & ":" & i + 6).Delete
    Call SupprimerLignesDontCellulesFusionnées(i)
    merci a+
    A star is dead

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA-E] erreur '1004' Range
    Par dev81 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 08/06/2007, 09h38
  2. [VBA-E] Erreur 1004
    Par Linio dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/06/2007, 13h25
  3. VBA-Word:Erreur 6 de dépassement de capacité
    Par zahui_eric dans le forum VBA Word
    Réponses: 3
    Dernier message: 04/04/2007, 15h17
  4. [vba][excel]Erreur '1004' lors d'un changement d'opérateur de comparaison.
    Par nicko5959 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/02/2007, 15h47
  5. [VBA][EXCEL]Erreur '1004' avec "Application.Run"
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2006, 10h50

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