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 :

probleme de boucle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    technicien système et réseau
    Inscrit en
    Juillet 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien système et réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 13
    Par défaut probleme de boucle
    voila le 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
    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
     
    Public wbMyWb As Workbook, Nom_Fichier, Critère, VEN, PLOM, CFO, CFA, DI, CLIM, TREM, REST, mat_rouge_barre, mat_rouge, carreVert, triangleJaune, losangeBleu As Variant, rouge, Vert, Jaune, Bleu, rouge_barre, N, T, D, L As Long, A As Variant, H As Variant
    Sub Ouvre()
    'recherche du fichier a ouvrir
     
    Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xls), *.xls")
    If Nom_Fichier <> False Then
       Set wbMyWb = Workbooks.Open(Nom_Fichier)
      wbMyWb.Activate
    End If
     
    'declaration variable fixe
     
    VEN = ("VENTILATION"): PLOM = ("PLOMBERIE - SANITAIRE"): CFO = ("ELECTRICITE CFO"): CFA = ("ELECTRICITE CFA"): DI = ("SECURITE INCENDIE")
    CLIM = ("CLIMATISATION/CHAUFFAGE"): TREM = ("Terminé"): REST = ("Reste en cours")
    mat_rouge = ("*\mat_rouge.jpg"): carreVert = ("*\carreVert.png"): triangleJaune = ("*\triangleJaune.png")
    losangeBleu = ("*\losangeBleu.png"): mat_rouge_barre = ("*\mat_rouge_barre.png")
     
    'mise a 0 des variables
    rouge = 0: Vert = 0: Jaune = 0: Bleu = 0: rouge_barre = 0
    'V=VEN P=PLOM O=CFO  A=CFA  D=DI   C=CLIM T=TREM R=REST
    V = 0: P = 0: O = 0: FA = 0: D = 0: C = 0: T = 0: R = 0
     
     
     
    'debut
     
    With Worksheets("A")
        rouge = Application.CountIf(.Range("A:A"), mat_rouge)
        Vert = Application.CountIf(.Range("A:A"), carreVert)
        Jaune = Application.CountIf(.Range("A:A"), triangleJaune)
        Bleu = Application.CountIf(.Range("A:A"), losangeBleu)
        rouge_barre = Application.CountIf(.Range("A:A"), mat_rouge_barre)
     
     
    End With
    N = WorksheetFunction.CountA(Range("A:A"))
    L = 2
     
     
    For L = L To N
    If Application.CountIf(Cells(L, 1), mat_rouge) Then
    Else
    L = L + 1
    If Application.CountIf(Cells(L, 8), DI) Then
     
    T = T + 1: L = L + 1
    Else
    L = L + 1
    End If
    End If
    Next
     
    ActiveWorkbook.Close
    End Sub
    le programme n'ai pas fini
    mais la le probleme sais la boule FOR
    je ne comprend pas
    quand je contrôle la valeur de la boucle elle et bonne
    mais le résultat n'ai pas bon avec le IF
    je veux compte le nombre de foi écrie en colonne A et H les 2 critère que j'ai prés défini

    merci par avance pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2017
    Messages : 33
    Par défaut
    Bonjour.

    Alors déjà, mettons un peu d'ordre dans le 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
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Option Explicit
     
    Public wbMyWb As Workbook
    Public Nom_Fichier
    Public Critère
    Public VEN
    Public PLOM
    Public CFO
    Public CFA
    Public DI
    Public CLIM
    Public TREM
    Public REST
    Public mat_rouge_barre
    Public mat_rouge
    Public carreVert
    Public triangleJaune
    Public losangeBleu As Variant
    Public rouge
    Public Vert
    Public Jaune
    Public Bleu
    Public rouge_barre
    Public N
    Public T
    Public D
    Public L As Long
    Public A As Variant
    Public H As Variant
     
    Sub Ouvre()
     
        'recherche du fichier a ouvrir
        Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xls), *.xls")
     
        If Nom_Fichier <> False Then
            Set wbMyWb = Workbooks.Open(Nom_Fichier)
            wbMyWb.Activate
        End If
     
        'declaration variable fixe
     
        VEN = ("VENTILATION")
        PLOM = ("PLOMBERIE - SANITAIRE")
        CFO = ("ELECTRICITE CFO")
        CFA = ("ELECTRICITE CFA")
        DI = ("SECURITE INCENDIE")
        CLIM = ("CLIMATISATION/CHAUFFAGE")
        TREM = ("Terminé")
        REST = ("Reste en cours")
        mat_rouge = ("*\mat_rouge.jpg")
        carreVert = ("*\carreVert.png")
        triangleJaune = ("*\triangleJaune.png")
        losangeBleu = ("*\losangeBleu.png")
        mat_rouge_barre = ("*\mat_rouge_barre.png")
     
        'mise a 0 des variables
        rouge = 0
        Vert = 0
        Jaune = 0
        Bleu = 0
        rouge_barre = 0
     
        'V=VEN P=PLOM O=CFO  A=CFA  D=DI   C=CLIM T=TREM R=REST
        V = 0
        P = 0
        O = 0
        FA = 0
        D = 0
        C = 0
        T = 0
        R = 0
     
        'debut
        With Worksheets("A")
            rouge = Application.CountIf(.Range("A:A"), mat_rouge)
            Vert = Application.CountIf(.Range("A:A"), carreVert)
            Jaune = Application.CountIf(.Range("A:A"), triangleJaune)
            Bleu = Application.CountIf(.Range("A:A"), losangeBleu)
            rouge_barre = Application.CountIf(.Range("A:A"), mat_rouge_barre)
        End With
     
        N = WorksheetFunction.CountA(Range("A:A"))
        L = 2
     
        For L = L To N
            If Application.CountIf(Cells(L, 1), mat_rouge) Then
     
            Else
                L = L + 1
                If Application.CountIf(Cells(L, 8), DI) Then
                    T = T + 1
                    L = L + 1
                Else
                    L = L + 1
                End If
            End If
        Next
     
        ActiveWorkbook.Close
     
    End Sub
    Ensuite, la boucle commence a une variable qui s'initialise elle-même. C'est incorrect dans le cas d'une boucle for, il est préférable de passer par une valeur brute ou par une variable supplémentaire. Ce qui donne : ou encore Néanmoins les instructions introduites dans les IF ajoutent de la valeur a L qui risquent de faire sortir de la boucle prématurement, cela relève plus d'une logique de programmation qu'autre chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            If Application.CountIf(Cells(L, 1), mat_rouge) Then
     
            Else
                L = L + 1
                If Application.CountIf(Cells(L, 8), DI) Then
                    T = T + 1
                    L = L + 1
                Else
                    L = L + 1
                End If
            End If
    peut aussi s'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            If Application.CountIf(Cells(L, 1), mat_rouge) Then
     
            Else
                L = L + 1
                If Application.CountIf(Cells(L, 8), DI) Then
                    T = T + 1
                End If
                L = L + 1
            End If

    Rappel : si le nombre de "tours" dans la boucle est connu on utilise un "for" sinon on utilise un "while" voire un "do...while"

    Je ne peux pas aider plus vu l'état actuel du code. Cordialement.

  3. #3
    Membre averti
    Homme Profil pro
    technicien système et réseau
    Inscrit en
    Juillet 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien système et réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 13
    Par défaut
    je te remercie pour t'a réponse qui m’éclaire déjà sur le probleme

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    BGonjour
    tout est ici maladroit et justifierait également un apprentissage élémentaire :
    - de l'utilisation des expressions conditionnelles les plus rudimentaires .
    Exemple de lourdeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Application.CountIf(Cells(L, 1), mat_rouge) Then
     
     Else ...
    Qui n'est jamais rien d'autre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Application.CountIf(Cells(L, 1), mat_rouge) = 0 then
    ...
    - et en effet de l'utilisation d'une boucle for X = ... to ...next
    où X s'incrémente seul, par construction même de telles boucles ...

    Remarques faites entre autres (liste très longue) touchant TOUTES à une carence quasi-totale des connaissances les plus rudimentaires et indispensables.

    Je ne peux et ne veux dans de tels conditions que conseiller très vivement de commencer par l'apprentissage de ces notions de base. (on ne décide pas du choix d'un fusible sans avoir acquis la moindre connaissance de l'ampérage que peut supporter le circuit contrôlé par ce fusible ... et encore moins si l'on n'a jusqu'à aucune idée de ce qu'est une intensité ... ou on s'abstient alors, ou on apprend d'abord au moins ces bases... c'est très clair).

  5. #5
    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 178
    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 178
    Billets dans le blog
    53
    Par défaut
    Bonjour Unparia,
    Je pense que ta réponse comporte une coquille. If <Condition> Then est sauf erreur de ma part l'équivalent de If <Condition> <> 0 Then
    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

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Philippe
    Non, non, je ne me suis pas trompé ...
    Je vais ainsi directement à sa "condition else", que n'a plus d'utilité.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Application.CountIf(Cells(L, 1), mat_rouge) Then
     
     Else '----->> qui n'intervient que si = 0
       msgbox "coucou"
    end if
    qui affiche "coucou" uniquement (le else) si le compte = 0 et ne fait ... rien si <> 0

    n'est rien d'autre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Application.CountIf(Cells(L, 1), mat_rouge) = 0 Then
      msgbox "coucou"
    end if
    Amitiés

    EDIT : c'est comme dans la vraie vie --->> je n'alourdis pas inutilement ma phrase en disant par exemple :
    "s'il n'est pas en retard je ne fais rien, sinon je m'en vais", mais directement : "s'il est en retard, je m'en vais"

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

Discussions similaires

  1. Probleme de boucle a s arracher les cheuveux
    Par calimero642 dans le forum Langage
    Réponses: 6
    Dernier message: 16/03/2006, 14h44
  2. Probleme de boucle avec des processus sous UNIX
    Par sebastieng dans le forum POSIX
    Réponses: 6
    Dernier message: 15/10/2005, 18h57
  3. [Language]Problème de boucle
    Par marc_dd dans le forum Langage
    Réponses: 11
    Dernier message: 06/10/2005, 14h24
  4. Problem de boucle.....
    Par skad dans le forum C++
    Réponses: 6
    Dernier message: 29/09/2005, 16h28
  5. [C#] Probleme de boucle for et random
    Par Freeman166 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/01/2005, 14h34

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