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 :

Choisir la bonne boucle [XL-2002]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Par défaut Choisir la bonne boucle
    Bonjour,
    tout d'abord je voudrais remercier l'ensemble de la communaute car je me gave de tous pleins de tutos ou autre =D

    sinon passons aux choses serieuses :

    j'avais besoin de tester une condition dans une boucle donc j'ecris mon bout de 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
                Dim i, totalhours_outSLA, lresult As Integer
     
                i = kstart
                totalhours_outSLA = 0
                Do
     
     
                    If Not Right(CStr(.Cells(i, 3).Value), 1) = ")" Then
     
                        totalhours_outSLA = totalhours_outSLA + .Cells(i, 3).Value
     
                    End If
                    i = i + 1
     
     
                Loop While i - 1 < ksheet
    et ca marche pas il me fait simplement la somme de la colonne tout betement ( bon le test parait tres bizarre mais j'ai besoin de separer des valeurs numeriques et d'autres valeures qui finissent par (SLA) et donc par ")" et ca c'est mon code final apres pleins de modification sur le IF )
    et donc je change juste la boucle attention :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                totalhours_outSLA = 0
                For i = kstart To ksheet + 1
     
     
                    If Not Right(CStr(.Cells(i, 3).Value), 1) = ")" Then
     
                        totalhours_outSLA = totalhours_outSLA + .Cells(i, 3).Value
     
                    End If
                    i = i + 1
     
     
                Next i
    Et ca marche o.O ma somme aui valait 30 devint 16.5 comme je souhaitais a la base : The FOC ?!!! La condition IF etait toujours vrai avec DO et est lue et testee par FOR ?!!

    Pourquoi certaines boucles comprennent les IF et d'autres non ??

    J'espere avoir ete assez clair
    Merci beaucoup de m'eclairer sur le sujet
    Best Regards

    Pifton

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Pas de lien du If avec le type de boucle.
    Je revois la condition de sortie de la première boucle Do <= à la place de <
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Loop While i <= kSheet + 2
    Enfin, si tu connais le début et la fin de la boucle, mieux utiliser une boucle PS2: Pour ta somme, j'utiliserai la fonction SOMME offerte par Excel (car je suis sur excel). Je ferai sans boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Feuil1
        totalHours_outSLA = Application.Sum(.Range(.Cells(kStart, 3), .Cells(kSheet, 3)))
    End With
    MsgBox totalHours_outSLA

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Par défaut
    Jesus ! oui effectivement

    la ligne i = i + 1 etait de trop

    Donc j'en suis revenu au point de depart ca fonctionne pas que ce soit avec do ou for :/
    pourquoi la condition IF est malgre tout realisee alors que la cellule possede un ")" a la fin de la chaine de caractere ???

    la meme condition fonctionne comme desiree si elle est hors de la boucle btw i.e ne renvoit pas la valeure de la cellule si finit par ")"

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 168
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si tu dois faire une somme suivant une condition, tu peux utiliser SUMIF
    Voici une exemple en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Application.WorksheetFunction.SumIf(Range("A2:A5"), "SLA", Range("B2:B5"))
    Son équivalent en Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME.SI(A2:A5;"SLA";B2:B5)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Essaies manuellement sur Excel
    En A1: 500 en A2 600 (CA) et en A3: 34

    En A4 mets Qu'est ce que tu trouves?

    Pour les boucles, celles ci sont équivalentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = a To b
        'traitement
    Next i
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    i = a
    Do
        'traitement
        i = i + 1
    Loop While i <= b + 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    i = a
    Do While i <= b
        'traitement
        i = i + 1
    Loop
    J'insiste, si on connait les bornes de la boucle, mieux est d'utiliser la boucle For ci dessus

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Par défaut
    Oue
    la vba est vraiment trop obscure pour moi je vais me contenter du sumif et pas taper trop de codes ;D

    Merci les gars pour vos reponses !!

    je mets resolu des que j'ai fini avec le sumif



    edit : pour info dans .cells( i,3) c'est des valeurs qui sont recopies depuis une autre feuille donc aucun calcul
    soit elles valent x.x soit elles valent x.x (SLA)

  7. #7
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Citation Envoyé par Pifton Voir le message
    pourquoi la condition IF est malgre tout realisee alors que la cellule possede un ")" a la fin de la chaine de caractere ???
    La meme condition fonctionne comme desiree si elle est hors de la boucle btw i.e ne renvoit pas la valeure de la cellule si finit par ")"
    J'ai une intuition mais il faut la vérifier : .Cells(i, 3).Value équivaut-il au résultat d'une fonction ? Alors que ta condition fait référence à la formule en elle-même et non à son résultat.

    Décris nous ce que tu as saisi dans les premières Cells(i, 3).

    Bertrand

    Si j'ai raison, il faudra remplacer (mais je n'ai pas testé) :

    par
    ! A ne pas remplacer dans l'addition bien-sûr (c'est juste pour la condition)

  8. #8
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonjour,

    Comme le dit Mercatog (qui est plus rapide que moi !), les conditions IF réagissent de la même manière, quelques soient les boucles dans lesquelles elles sont placées.

    Pour ma part, je n'ai pas cherché en profondeur dans ton code mais quelque chose me parait étrange dans ta boucle For

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = kstart To ksheet + 1
    équivaut en réalité à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = kstart To ksheet + 1 Step 1
    C'est une formule "raccourcie" mais comprend bien que i augmente de +1 à chaque début de boucle... Or dans ton code tu as aussi mis en ligne 10

    Donc i progresse de +1+1 donc de +2 à chaque boucle... Contrairement à la boucle DO qui progresse bien de +1.

    Pour tester, lances le mode "Pas à Pas". Tu verras la différence.

    Bertrand

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    +1 Bien vu Bertrand pour le i=i+1 à l'intérieur de la boucle For (je n'avais pas fais attention)

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

Discussions similaires

  1. Choisir la bonne SSII
    Par nincanals dans le forum SSII
    Réponses: 4
    Dernier message: 13/10/2009, 10h42
  2. Choisir une bonne configuration
    Par Hopesnim dans le forum Ordinateurs
    Réponses: 3
    Dernier message: 11/05/2009, 18h33
  3. Réponses: 3
    Dernier message: 05/09/2008, 15h23
  4. Choisir une bonne carte mère
    Par Lorponos dans le forum Composants
    Réponses: 27
    Dernier message: 05/05/2006, 16h49
  5. [FLASH 8] Choisir la bonne version du player
    Par dom_dev dans le forum Flash
    Réponses: 2
    Dernier message: 11/04/2006, 10h09

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