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 :

[Excel - VBA] Problème de suppression de lignes...


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Excel - VBA] Problème de suppression de lignes...
    Voilà j'ai une fonction pour supprimer les lignes entières d'une feuille excel. Le critère de suppression est de rechercher dans une colonne indiquée les valeur des cellules nulles (rien dans la cellule quoi), et en réaction de supprimer la ligne entière.

    Le problème c'est que la boucle ne supprime pas toutes les cellules vides trouvées... Le pire c'est qu'en relançant la fonction plusieurs fois d'affilé, au bout d'un moment on arrive au résultat escompté : il n'y a plus de ligne avec une cellule vide. Mais bon je ne vais pas m'amuser a relancer l'algorythme X fois, sachant que c'est relativement long tout de même...

    alors si qqun connait la cause de cette "erreur"...

    Voilà le code de la fonction de suppression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub SupprimerVide(limit As Integer)
     
    Dim j As Integer
     
    For j = 1 To limit
            If Cells(j, 2).Value = "" Then
            Cells(j, 2).EntireRow.Delete
            End If
        Next j
    End Sub
    Merci d'avance

    [Balises de code rajoutées par Thierry AIM, Merci d'y penser la prochaine fois]

  2. #2
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Ton algorithme n'est pas bon

    si les lignes 3 et 4 sont vides, dans ta boucle, tu supprimes la ligne 3 ET tu incrémentes le compteur
    Or la ligne 3 ayant été supprimée, la ligne 4 va la remplacer (et devenir ligne 3) mais ne sera pas supprimée puisque tu as incrémenté le compteur

    Ce qui explique qu'après plusieurs passages, tu arrives à ce que tu veux

    Revois ta copie

    Me suis-je bien fait comprendre
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    oui oui et avant ta réponse c'est justement à la conclusion à laquelle je suis arrivée.

    Mais je n'arrive toujours pas à résoudre ce problème.

    J'ai essayé de décrémenté j dans le boucle if (j = j-1), mais là ça donne une boucle infinie (oui quand il arrive aux dernieres lignes, sachant qu'il doit allez juste limite, il trouve toujours des cellules vides et donc tourne à l'inifni).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub SupprimerVide(limit As Integer, k As Integer)
     
    Dim j As Integer
     
    For j = 1 To limit
            If Cells(j, 1).Value = "" Then
            Cells(j, 1).EntireRow.Delete
    j = j-1
            End If
        Next j
        'MsgBox h
    End Sub
    Alors j'ai tenté de mettre une boucle juste avant le if, et un goto cette boucle juste après avoir supprimé la ligne correspondante, mais j'avais également une boucle infinie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub SupprimerVide(limit As Integer, k As Integer)
     
    Dim j As Integer
     
    For j = 1 To limit
    boucle:
            If Cells(j, 1).Value = "" Then
            Cells(j, 1).EntireRow.Delete
    goto boucle
            End If
        Next j
        'MsgBox h
    End Sub
    Enfin derniere solution que j'ai envisagé, c'est d'incrémenter un nouvel entier z, et d'arréter la boucle quand le z serait égal à limite, mais là encore j'ai des trous... (et même beaucoup).
    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
    Private Sub SupprimerVide(limit As Integer, k As Integer)
     
    Dim j As Integer
    Dim z As Integer
    z = 0
    For j = 1 To limit
    z = z + 1
            If Cells(j, 1).Value = "" Then
            Cells(j, 1).EntireRow.Delete
            ElseIf z = limit Then
            Exit Sub
            End If
        Next j
        'MsgBox h
    End Sub
    Donc je sèche toujours dessus

    [ Balise code ajoutée par ridan ]
    [ Pensez-y à l’avenir. Merci ]

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    bon c'est résolu, c'etait juste une combinaison de l'ensemble des solutions trouvées précédemment ^_^

    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
    Private Sub SupprimerVide(limit As Integer, k As Integer)
     
    Dim j As Integer
    Dim z As Integer
    z = 1
    boucle1:
    For j = z To limit
            If Cells(j, k).Value = "" Then
            Cells(j, k).EntireRow.Delete
            limit = limit - 1
            z = j
            GoTo boucle1
            End If
        Next j
        'MsgBox h
    End Sub

  5. #5
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Salut,

    J'ai pensé à une boucle While ce qui permet d'être plus indépendant sur la définition de j :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub SupprimerVide(limit As Integer) 
     
    Dim j As Integer 
     
       j = 1
       While j <= limit
            If Cells(j, 2).Value = "" Then 
                 Cells(j, 2).EntireRow.Delete
                 j = j - 1
            End If
            j = j + 1
       Wend
    End Sub
    Voilà

    Bon courage

    Théo
    Forums VB : lire la notice
    La touche existe pour être utilisée
    Pensez au tag
    Pour ceux n'ayant pas l'aide installée :
    - Aide MSDN pour VB6
    - Aide MSDN pour VBA
    Je ne réponds pas aux questions techniques par MP. Merci d'utiliser le forum fait pour çà.

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    je pense que ta solution engendrera une boucle infinie également, tout simplement parsque j n'atteindra jamais limite (en effet en bas de la page , de la ligne X à la ligne limite, il y aura des lignes vides. Donc j ne s'incrémentera plus jamais (la fonction va supprimer une ligne vide pour retomber inlassablement sur une ligne vide, et du coup ne bougera plus).

    Il faut à tout prix décrémenter limite, c'est semble t'il la seule solution.

  7. #7
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Très juste

    Pars sur ça alors

    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
     
    Private Sub SupprimerVide(limit As Integer) 
     
    Dim j As Integer 
     
       j = 1 
       While j <= limit 
            If Cells(j, 2).Value = "" Then 
                 Cells(j, 2).EntireRow.Delete 
                 j = j - 1
                 limit = limit - 1
            End If 
            j = j + 1 
       Wend 
    End Sub
    Bon courage

    Théo
    Forums VB : lire la notice
    La touche existe pour être utilisée
    Pensez au tag
    Pour ceux n'ayant pas l'aide installée :
    - Aide MSDN pour VB6
    - Aide MSDN pour VBA
    Je ne réponds pas aux questions techniques par MP. Merci d'utiliser le forum fait pour çà.

  8. #8
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For j = limit To 1 Step -1
        While Cells(j, 1).Value = ""
            Cells(j, 1).EntireRow.Delete
        Wend
    Next j
    et ca, c'est pas plus simple :
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  9. #9
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    en gros tu pars de la fin pour remonter jusqu'au début c'est bien ça ?
    Sinon je ne connaissais pas le "step -1" (je ne fais du VBa que depuis 3-4 jours ).

    Bon je testerai si j'ai le temps mais j'ai d'abord un projet à finir dans les temps haha, donc moi du moment que ça marche sans erreurs je laisse comme ça ^_^.

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

Discussions similaires

  1. Code vba pour la suppression des lignes d'un tableau excel
    Par yosra_jemai dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/04/2013, 09h11
  2. Réponses: 2
    Dernier message: 09/01/2007, 19h57
  3. [VBA-E] Problème de suppression de lignes
    Par coxi77 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/07/2006, 14h01
  4. [Excel & D7]Problème de suppression de lignes
    Par Isa31 dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 14/03/2006, 09h00
  5. Problème de suppression de ligne dans ma base !
    Par gregman dans le forum ASP
    Réponses: 2
    Dernier message: 21/05/2005, 08h14

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