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 :

Problème de boucles


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut Problème de boucles
    Bonjour,

    j'ai un petit problème de boucles et je n'arrive pas à savoir pourquoi...

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Sub Graphique()
     
    Dim Compteur As Integer
    Dim Cel As Range
    Dim i As Integer
     
    Set Cel = Worksheets("Vue_generale").Range("K1")
    Compteur = 1
     
    While Cel.Offset(Compteur) <> ""
    Compteur = Compteur + 1
    Wend
     
    DestructionUn = 0
    DestructionDeux = 0
    DestructionTrois = 0
    DestructionQuatre = 0
     
    ValorisationUn = 0
    ValorisationDeux = 0
    ValorisationTrois = 0
    ValorisationQuatre = 0
     
    For i = 1 To Compteur
        If Cel.Offset(i) = "1" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionUn = DestructionUn + Cel.Offset(i, -2)
            Else
            ValorisationUn = ValorisationUn + Cel.Offset(i, -2)
            End If
        If Cel.Offset(i) = "2" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionDeux = DestructionDeux + Cel.Offset(i, -2)
            Else
            ValorisationDeux = ValorisationDeux + Cel.Offset(i, -2)
            End If
        If Cel.Offset(i) = "3" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionTrois = DestructionTrois + Cel.Offset(i, -2)
            Else
            ValorisationTrois = ValorisationTrois + Cel.Offset(i, -2)
            End If
        If Cel.Offset(i) = "4" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionQuatre = DestructionQuatre + Cel.Offset(i, -2)
            Else
            ValorisationQuatre = ValorisationQuatre + Cel.Offset(i, -2)
            End If
        End If
    Next i
     
    Worksheets("Graphique").Select
    Range("B8") = DestructionUn
    '....
     
     
     
    End Sub
    J'ai toujours droit à Pas de Next sans For (alors que mon For est bien la) et si j'enlève le Next, j'ai le droit a il faut un blonc end if.....

  2. #2
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour BOU59000 le forum pour moi il manque un end if
    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
    19
    20
    21
    22
    23
    24
    25
    26
    For i = 1 To Compteur
        If Cel.Offset(i) = "1" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionUn = DestructionUn + Cel.Offset(i, -2)
            Else
            ValorisationUn = ValorisationUn + Cel.Offset(i, -2)
            End If: End If
        If Cel.Offset(i) = "2" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionDeux = DestructionDeux + Cel.Offset(i, -2)
            Else
            ValorisationDeux = ValorisationDeux + Cel.Offset(i, -2)
            End If: End If
        If Cel.Offset(i) = "3" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionTrois = DestructionTrois + Cel.Offset(i, -2)
            Else
            ValorisationTrois = ValorisationTrois + Cel.Offset(i, -2)
            End If: End If
        If Cel.Offset(i) = "4" Then
            If Left(Cel.Offset(i), 1) = "D" Then
            DestructionQuatre = DestructionQuatre + Cel.Offset(i, -2)
            Else
            ValorisationQuatre = ValorisationQuatre + Cel.Offset(i, -2)
            End If: End If
      Next i

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Par défaut
    Bonjour
    Effectivement il manque quelques End If sur presque tous les If de premiers niveau.

    Ce que je trouve bizzare, c'est qu'il n'y a pas d' erreur sur le Offset(i), car quand je l'utilise, je fais référence à la ligne et à la colonne.


    --------------
    Frédéric
    http://www.access-developpement.co

  4. #4
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    re bonjour fgiambelluco

    a mon avis i est interprete en tant que colonne
    par contre il doit pas mettre option explicit en debut de son module
    les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DestructionUn = 0
    DestructionDeux = 0
    DestructionTrois = 0
    DestructionQuatre = 0
     
    ValorisationUn = 0
    ValorisationDeux = 0
    ValorisationTrois = 0
    ValorisationQuatre = 0
    sont pas declarées

    de plus j ai pas bien compris son code je sais ce qu'il cherche a faire??lui il doit le savoir (lol)

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut BOU59000 et le forum
    Il n'y a pas que la boucle qui a un problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While Cel.Offset(Compteur) <> ""
    Compteur = Compteur + 1
    Wend
    C'est quoi le but ? revient à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Compteur = cel.end(xldown).row+1
    La première ligne vide en partant de K1 et en allant vers le bas. Mais il n'y a pas de boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        If Cel.Offset(i) = "1" Then
            If Left(Cel.Offset(i), 1) = "D" Then
                DestructionUn = DestructionUn + Cel.Offset(i, -2)
            Else
                ValorisationUn = ValorisationUn + Cel.Offset(i, -2)
            End If
        End If
        If Cel.Offset(i) = "2" Then
    'etc... en mettant les "End If"
    je lis :
    -si cel.offset(i) = le chiffre 1 offset(ligne,colonne), pas offset(ligne,[colonne])
    -si la première lettre de Cel.offset(i) = "D" => elle sera toujours Faux, puisque tu viens de vérifier qu'elle ne contient que "1"
    donc tu peux simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    For Each cel In Range([K1], [K1].End(xlDown))
        Select Case cel
            Case 1
                ValorisationUn = ValorisationUn + cel.Offset(0, -2)
            Case 2
                ValorisationDeux = ValorisationDeux + cel.Offset(0, -2)
                End If
            Case 3
                ValorisationTrois = ValorisationTrois + cel.Offset(0, -2)
                End If
            Case 4
                ValorisationQuatre = ValorisationQuatre + cel.Offset(0, -2)
        End Select
    Next cel
    Mais si ce n'est pas ça que tu veux faire, revois ton algo
    A+

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    @ laetitia: Oui le problème venait bien des End if (j'ai honte ). Du coup sa marche nikel désormais.

    Le code me sert à alimenter des graphes sinon.

    @fgiambelluco: Je ne vois pas de quoi tu veux parler? En fait j'ai mis Cel.offset(i, colonne) avec i ma boucle qui va me faire passer d'une ligne à une autre. Ce que tu as mis en code est bon, donc je pense que je ne réponds pas a ta question la! lol. Si tu pouvais préciser que je puisse te donner une reponse correcte, merci

    @Gorfael:Oui le compteur n'est pas indispensable mais je le mets toujours (a force de tapper sur un clou il rentre! lol), cette méthode me permet d'apprendre par coeur les différents type de programme.

    Sinon tu as mal lu mon programme:
    -si cel.offset(i) = le chiffre 1
    -si la première lettre de Cel.offset(i, -x) = "D" => elle sera toujours Faux, puisque tu viens de vérifier qu'elle ne contient que "1. Oui je vérifie que que ma cellule contient 1 (colonne B par exemple)et si elle contient 1, alors je vérifie que ma cellule 1 (en colonne A par exmple) contient D
    Si oui j'enregistre dans une première variable, sinon j'enregistre dans une seconde
    "
    Par contre, je ne suis pas encore très fort en boucle, mais ton Select Case aura pour finalité que
    DestructionUn = DestrucionDeux =.... ValorisationUn = ValorisationDeux... Que toutes les variables soient identique en finalité, non?

    Merci pour vos réponses en tout cas.

    @ Admin: je ne cloture pas tout de suite la discussion afin de pouvoir continuer ce débat (qui me permettra d'apprendre plus sur le vba).
    Je cloturerai la discussion peu après, merci de votre compréhension.

    PS: A moins que ce soit hors charte de faire cela?

  7. #7
    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
    Par défaut
    Si tu avais indenté correctement ton code tu aurais tout de suite compris
    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
    26
    27
    28
    29
    30
    For i = 1 To Compteur
        If Cel.Offset(i) = "1" Then
            If Left(Cel.Offset(i), 1) = "D" Then
                DestructionUn = DestructionUn + Cel.Offset(i, -2)
               Else
                ValorisationUn = ValorisationUn + Cel.Offset(i, -2)
            End If
        'Manque un Endif ***
        If Cel.Offset(i) = "2" Then
            If Left(Cel.Offset(i), 1) = "D" Then
                DestructionDeux = DestructionDeux + Cel.Offset(i, -2)
               Else
                ValorisationDeux = ValorisationDeux + Cel.Offset(i, -2)
            End If
        'Manque un Endif ***
        If Cel.Offset(i) = "3" Then
            If Left(Cel.Offset(i), 1) = "D" Then
                DestructionTrois = DestructionTrois + Cel.Offset(i, -2)
               Else
                ValorisationTrois = ValorisationTrois + Cel.Offset(i, -2)
            End If
        'Manque un Endif ***
        If Cel.Offset(i) = "4" Then
            If Left(Cel.Offset(i), 1) = "D" Then
                DestructionQuatre = DestructionQuatre + Cel.Offset(i, -2)
               Else
                ValorisationQuatre = ValorisationQuatre + Cel.Offset(i, -2)
            End If
        End If 'manque pas de Endif
    Next i
    Edit
    Ceci dit, j'utiliserais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         Select Case  Left(Cel.Offset(i), 1)
                       Case "1"
                       Case "2"
                       Case "3"
                       Case "4"
                   'etc.

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

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

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