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] PRobleme avec une boucle DO..LOOP WHILE


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Points : 38
    Points
    38
    Par défaut [VBA-E] PRobleme avec une boucle DO..LOOP WHILE
    Salut, je debute severement en VBA et j'ai un souci maintenant avec une boucle DO....LOOP WHILE. J'ai fait des recherches, j'ai essayé differentes structures de boucles (IF..Then ; WHILE...Wend....), mais rien ne marche.

    Objectif de la boucle :
    En gros la boucle doit étudier la somme de deux cellules de chaque ligne,
    supprimer la ligne entière si resultat =0
    et passer à la ligne suivante si resultat différent de 0
    Elle doit continuer jusqu'à ce que la premiere cellule de la ligne soit vide
    Quand il rencontre cette cellule, il doit charger le N° de la ligne

    Mon code :
    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
    [Private Sub CommandButton1_Click()
     
    Dim ligne As Integer
    Dim ligneVar As Integer
     
    ligne = 7
     
    Do
        If Cells(ligne, 3) + Cells(ligne, 4) = 0 Then
        Rows(ligne).Delete
        ligne = ligne - 1
        Else
        ligne = ligne + 1
    Loop While Cells(ligne, 1) <> ""
     
    ligne = ligneVar
     
    End Sub
    Le message d'erreur à l'execution m'etonne, car la syntaxe me parait ok ; il me dit : "Erreur de compilation : boucle sans DO"....

    Quelqu'un pourrait m'aider à comprendre mon erreur?

    MErci , merci

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Salut,

    Il te manque le ENDIF du IF... THEN... ELSE... ENDIF

    Fais gaffe en déclarant ligne en INTEGER, ça va te planter une erreur dès la ligne 256...

    Et pour finir, la ligne
    n'est pas dans le bon sens

    de plus, je ne sais pas trop ce que tu vas faire de lignevar ensuite, mais j'espère que tu en feras quelque chose...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut
    Déjà un premier truc il te manque un endif :
    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
    Private Sub CommandButton1_Click()
    
    Dim ligne As Integer
    Dim ligneVar As Integer
    
    ligne = 7
    
    Do
        If Cells(ligne, 3) + Cells(ligne, 4) = 0 Then
           Rows(ligne).Delete
           ligne = ligne - 1
        Else
           ligne = ligne + 1
        endif
    Loop While Cells(ligne, 1) <> ""
    
    ligne = ligneVar
    
    End Sub

  4. #4
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut
    Ton lignevar à la fin tu lui as pas donné de valeur, à quoi il sert??

  5. #5
    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 038
    Points
    20 038
    Par défaut
    Citation Envoyé par plegat
    ...
    Fais gaffe en déclarant ligne en INTEGER, ça va te planter une erreur dès la ligne 256......
    ne pas confondre integer et byte

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Arggh mais bien sur, le End If.... je vous jure je me suis relu avant de poster

    Ca marche nickel maintenant

    Bon si mon LigneVar as Integer risque de poser probleme, je vais le déclarer en Variant alors.
    Oui je vais en faire quelque chose de ce LigneVar ; c'est justement pour recuperer cette valeur que j'ai du changer ma boucle initialement en IF.END IF (si si il y était parce que je ne voyais pas comment rajouter une une condition alternative avec IF.End If.

    Encore merci pour votre aide ; c'est gentil de pas laisser tomber les pov' newbies qui ont découvert sur le tard le VBA.

  7. #7
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par bbil
    ne pas confondre integer et byte
    Argh!
    Non, j'ai confondu lignes et colonnes!
    32767 pour la limitation. En tous cas, avec un integer, ça plante avant la fin de la feuille. Donc faire attention (et passer en Long plutôt qu'en Integer)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    J'ai un probleme avec cette boucle rencontré avec une deuxieme serie de données :la différence je crois est que dès les premières lignes, la condition 1 est remplie et du coup la commande ligne-1 enlève des lignes qui ne font pas partie du bloc données, mais comment dire du cadre.

    Est ce que quelqu'un pourrait me confirmer que pour ce type de boucle il faut indiquer une limite basse, par exemple en rajoutant le 2eme IF ou est ce que je suis à côté de la plaque?



    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
    'Supprime les lignes dont les carriage et ancillary costs sont à 0
    
    Sheets("ImportFOURN").Activate
    
    Dim ligne As Integer
    Dim ligneVar As Long
    
    ligne = 7
    
    Do
        If Cells(ligne, 3) + Cells(ligne, 4) = 0 Then
        Rows(ligne).Delete
            If ligne > 7 Then
            ligne = ligne - 1
            Else: ligne = 7
            End If
        Else
        ligne = ligne + 1
        End If
    Loop While Cells(ligne, 1) <> ""
    
    End Sub

  9. #9
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Ce genre de gymnatique, qui aboutit finalement à gérer des lignes qui ont changé de numéro du fait de la suppression d'une ou de plusieurs lignes, conduit souvent à des gestions acrobatiques.

    Pour éviter de telles situations, on fait en général l'inverse : on part de la dernière ligne à traiter et on remonte vers la première. De cette façon, aucune des lignes à traiter ne change de numéro en cours de route.

    Bonne journée.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Erf, oui, je comprends la logique. Merci pour la réponse.

    Dans mon cas, ca va être plus dur, car ma selection est variable ; autant ma premiere ligne est toujours au meme endroit, autant la derniere est localisée de maniere différente à chaque occurence.

    J'ai vu un truc avec xlendup qui pourra peut etre m'aider à démarrer la boucle par la denriere ligne.

    Je vais voir ca, merci encore.

  11. #11
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut
    tu peux utiliser ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Feuille").range(worksheets(Feuille).range("Debut").address & ":" & worksheets("Feuille").range("Debut").end(xldown).address).select
    Feuille est le nom de ta page et Debut le nom de ta première cellule.

    Si tu veux te déplacer entre les cellules tu peux également utiliser la syntaxe où i est le nombre de lignes de décalage et j le nb de colonnes.

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Feuille").range("Debut").offset(1,0).select
    sélectionnera la case juste en dessous de Debut

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par conconbrr
    tu peux utiliser ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Feuille").range(worksheets(Feuille).range("Debut").address & ":" & worksheets("Feuille").range("Debut").end(xldown).address).select
    Feuille est le nom de ta page et Debut le nom de ta première cellule.
    Hey, merci Conconbrr, je testerai ca demain soir Ton code m'a donné sinon une autre idée pour commencer la boucle par les dernieres lignes.

    Je pourrai définir le nombre de lignes à traiter grace au code permettant de stocker dans une variable le nombre de lignes de la selection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Selection des données à examiner
    ActiveSheet.Range("A5:G5").Select
    ActiveSheet.Range(Selection, Selection.End(xlDown)).Select
    nlignes = Selection.Rows.Count
    Cette variable indiquerai alors dans ma boucle la ligne de fin à partir de laquelle démarrer, pour remonter vers la premiere.

    Ca donnerait alors ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Boucle de suppression des lignes dont C+D=0
    Do
        If Cells(nlignes, 3) + Cells(nlignes, 4) = 0 Then
        Rows(nlignes).Delete
        Else: nlignes = nlignes-1
        End If
    Loop While nlignes > 6
    Enfin je vais tester les différentes methodes, merci encore

Discussions similaires

  1. VBA ACCESS probleme avec une boucle for
    Par maldini dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/04/2010, 09h52
  2. Problème avec une boucle Do.. Loop Until
    Par gta126 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 29/12/2007, 11h27
  3. probleme avec une boucle infinie
    Par hunter99 dans le forum C++
    Réponses: 3
    Dernier message: 26/12/2007, 23h37
  4. Probleme avec une boucle
    Par virtuadrack dans le forum C
    Réponses: 2
    Dernier message: 29/11/2007, 15h32
  5. Probleme avec une boucle
    Par restesouple dans le forum Windows Forms
    Réponses: 14
    Dernier message: 04/10/2007, 10h47

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