Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 03/07/2009, 11h05   #1 (permalink)
Nouveau membre du Club
 
Date d'inscription: mai 2008
Âge: 24
Messages: 68
Par défaut Problème de boucles

Bonjour,

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

Code :
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.....
BOU59000 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/07/2009, 11h14   #2 (permalink)
Membre Expert
 
Avatar de laetitia
 
Date d'inscription: décembre 2002
Localisation: 38
Âge: 20
Messages: 1 160
Par défaut

bonjour BOU59000 le forum pour moi il manque un end if
code
Code :
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
__________________
SALUTATIONS
laetitia est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/07/2009, 11h28   #3 (permalink)
Membre émérite
 
Date d'inscription: juin 2009
Localisation: Lorraine
Messages: 826
Envoyer un message via MSN à fgiambelluco
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.

Code :
Cel.Offset(lig,col)

--------------
Frédéric
http://www.access-developpement.co
fgiambelluco est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/07/2009, 11h50   #4 (permalink)
Membre Expert
 
Avatar de laetitia
 
Date d'inscription: décembre 2002
Localisation: 38
Âge: 20
Messages: 1 160
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 :
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)
__________________
SALUTATIONS
laetitia est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/07/2009, 12h53   #5 (permalink)
Expert Confirmé
 
Date d'inscription: juillet 2007
Localisation: Loire Atlantique (44)
Âge: 54
Messages: 1 849
Par défaut

Salut BOU59000 et le forum
Il n'y a pas que la boucle qui a un problème
Code :
While Cel.Offset(Compteur) <> ""
Compteur = Compteur + 1
Wend
C'est quoi le but ? revient à
Code :
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 :
    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 :
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+
__________________
La qualité et la précision de la réponse sont proportionnelles à celles de la question.
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/07/2009, 13h37   #6 (permalink)
Nouveau membre du Club
 
Date d'inscription: mai 2008
Âge: 24
Messages: 68
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:
Citation:
-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?
BOU59000 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/07/2009, 13h54   #7 (permalink)
Inactif(ve)
 
Avatar de ouskel'n'or
 
Date d'inscription: février 2005
Localisation: 45,10 N 5,43 E
Messages: 12 494
Par défaut

Si tu avais indenté correctement ton code tu aurais tout de suite compris
Code :
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 :
     Select Case  Left(Cel.Offset(i), 1)
                   Case "1"
                   Case "2"
                   Case "3"
                   Case "4"
               'etc.
 
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/07/2009, 09h24   #8 (permalink)
Nouveau membre du Club
 
Date d'inscription: mai 2008
Âge: 24
Messages: 68
Par défaut

Oui Gorfael m'en aviat déjà touché un mot pour le select case en plus

Par contre, en utilisant le select case, j'ai devrait quand même rajouté des If a l'intérieur de mes case, cela ne risque t-il pas de faire bugger le programme?

Bref je vais testé de toute façon le select case, au plus je peux apprendre de façon de faire les choses, au mieux sa sera

Merci à tous pour vos réponses, et si je dis quelquechose de faux ou autre n'hésitez pas a me reprendre, je préfère avoir des retours et progresser plutot que de partir et de continuer sur de mauvaises bases.

Bref encore merci

PS: je cloture le sujet mais je posterai le programme avec les cases dès que je l'aurai fait
BOU59000 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/07/2009, 09h57   #9 (permalink)
Expert Confirmé
 
Avatar de Krovax
 
Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
Par défaut

Citation:
Envoyé par BOU59000 Voir le message
Par contre, en utilisant le select case, j'ai devrait quand même rajouté des If a l'intérieur de mes case, cela ne risque t-il pas de faire bugger le programme?
Ne t'inquiète pas excel est un malin tu peux imbriquer autant de boucle que tu veux de tous les type possible , if , for, do, while, select case,....
La seule chose importante est de toutes les fermer et dans le bon ordre
Krovax est déconnecté   Envoyer un message privé Réponse avec citation
NEWS EXCELF.A.Q EXCELTUTORIELS EXCELSOURCES EXCELOUTILS EXCELLIVRES EXCELOFFICE 2010

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 07h43.


Vos questions techniques : forum d'entraide Excel - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.