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 enchaînement boucles [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut Problème enchaînement boucles
    Bonjour,

    J'ai un problème avec une macro : celle-ci contient deux boucles for, mais elle ne sort jamais de la 1re pour passer à la 2e.

    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
    Sub Verifications()
     
        ''''Création variables
        Dim Nbenreg As Long
        Dim DernLignVide As Long
        Dim Plage As Range
        Dim Cel As Range
     
        With Worksheets("Fichier de travail")
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        For Each Cel In Plage
     
            If Cel.Value <> "?" And Application.CountIf(Plage, Cel.Value) > 1 Then
     
                DernLignVide = Sheets("CR").Range("A1").End(xlDown).Row + 1
                Ligne_Erreur Cel.Value, DernLignVide, "Code doublon sur la ligne " & Cel.Row
     
            End If
     
        Next Cel
     
        ''''Pour parcourir l'ensemble des lignes non vides
        Nbenreg = Range("A3").End(xlDown).Row
        For i = 3 To Nbenreg
     
            ''''Pour n'effectuer les contrôles que sur les lignes dont la "Validation" vaut "OK"
            If Sheets("Fichier de travail").Range("E" & i) = "OK" Then
    Une idée du pourquoi du comment ? Puis de comment résoudre ce problème ?

    Merci d'avance :-)

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    bonsoir
    voir la définition du plage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range(.Cells(1, 1), .Cells(DernLigne, DernColonne))
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Face à ce type de situation, je vous suggère:

    1. D'insérer des points d'arrêt dans votre code
    2. De regarder l'état de vos variables
    3. De rajouter des Debug.Print pour une sortie dans la fenêtre debug

    Autre suggestion: regarder les proprités speciallCells pour récupérer toutes les cellules non vides

    Ceci étant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        With Worksheets("Fichier de travail")
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
            Debug.Print Plage.Address
           Set Plage = Place.SpecialCells(xlCellTypeConstants)
           Debug.Print Plage.Address
        End With
     
        For Each Cel In Plage 'il ne manque rien?
             Debug.Print Cel.Address
    
    => ça donnerait quoi?
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    @BENNASR : Comment serait défini DernColonne ?

    @vinc_bilb : Ce code me donne un message d'erreur "Objet requis".

  5. #5
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
    c'est à partir de la cellule A2 jusqu'au dernière celule non vide de la colonne A ???
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Oui

  7. #7
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    essayez avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plage = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Idem, ça ne sort toujours pas de ce premier for.

  9. #9
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    essayez comme moi en tant que débutant avec le msgbox pour cerner l'erreur
    faire tourner la boucle avec simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For Each Cel In Plage
     
            If Cel.Value <> "?" And Application.CountIf(Plage, Cel.Value) > 1 Then
     
               msgbox cel.row
     
            End If
     
        Next Cel
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Quand je fais ça, il m'affiche les messages de la msgbox puis passe à la boucle suivante correctement.

    Le problème vient donc de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DernLignVide = Sheets("CR").Range("A1").End(xlDown).Row + 1
                Ligne_Erreur Cel.Value, DernLignVide, "Code doublon sur la ligne " & Cel.Row
    Sachant que la fonction Ligne_Erreur est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Ligne_Erreur(Code_K, DernLignVide, Message_Erreur)
     
        Range("CR!A" & DernLignVide).Value = Code_K
        Sheets("CR").Cells(DernLignVide, Columns.Count).End(xlToLeft).Offset(, 1).Value = Message_Erreur
     
    End Sub

  11. #11
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    Bonjour,

    As-tu essayé le mode pas à pas (touche F8) pour voir ce que fait ton code exactement ?

    edit: j'ai essayé ton code chez moi en modifiant juste les noms de feuille je n'ai eu aucun soucis
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Oui, bien sûr : il tourne en boucle dans ce For (il va de la 1re à la dernière ligne puis recommence à la 1re, etc...).

  13. #13
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    il tourne en boucle dans ce For (il va de la 1re à la dernière ligne puis recommence à la 1re, etc...).
    C'est étonnant, ce n'est pas le comportement normal d'un boucle for
    Si tu lui demandes msgbox plage.cells.count il te donne combien? c'est ce que tu attendais ?

    Si tu remplace par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = 2 to .Cells(.Rows.Count, 1).End(xlUp).row
    et tous les Cel par cells(i,1)
    As-tu le même souci ?

    As tu essayé de copier tes données dans un nouveau classeur et d'y lancer ta macro ? Ton classeur est peut être corrompu
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  14. #14
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Si je peux me permettre quelques remarques:
    Dans toute discussion, je pense, il faudrait retourner dans l'ordre
    1 - avec précision, l'ensemble des actions à effectuer (telle cellule de telle feuille vers telle plage de telle feuille de tel classeur....)
    2 - retourner le code dans son intégralité
    3 - préciser le problème (ce qui a été fait : boucle sans fin)

    Sur le code lui-même:
    - Les objets ne sont pas tous rattachés (Worksheets("tata").Range("A1"))
    - Je ne vois pas l'utilité de définir la dernière ligne dans la boucle

    A ce point de la discussion, Tigris, pourrais-tu reprendre les points 1 et 2 en tenant compte de ces 2 dernières remarques.

    A plus tard.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = 2 to .Cells(.Rows.Count, 1).End(xlUp).row
    J'ai testé mais il y a une erreur de compilation avec "Référence incorrecte ou non qualifiée" sur le .Rows

  16. #16
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    Citation Envoyé par Tigris Voir le message
    J'ai testé mais il y a une erreur de compilation avec "Référence incorrecte ou non qualifiée" sur le .Rows
    Je l'ai pourtant copié collé de ton code au post 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Worksheets("Fichier de travail")
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
    si tu ne l'as pas mis dans le with rajoute la référence à la feuille devant les points
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  17. #17
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Citation Envoyé par Tigris Voir le message
    @BENNASR : Comment serait défini DernColonne ?

    @vinc_bilb : Ce code me donne un message d'erreur "Objet requis".
    Ben .... c'est peut-être une cause de vos soucis. Que donnent les sorties debug.Print?
    Regardez ce que je vous avais mis si vous voulez: For Each Cel In Plage 'il ne manque rien?

    Les cellules sont défines comme un range mais doivent se référer aux ..... cellules de ce range
    Par exemple, For Each Cl in Plage.Cells
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Je l'ai pourtant copié collé de ton code au post 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Worksheets("Fichier de travail")
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
    si tu ne l'as pas mis dans le with rajoute la référence à la feuille devant les points
    J'ai beau essayer, ça ne fonctionne pas.

    Citation Envoyé par vinc_bilb Voir le message
    Ben .... c'est peut-être une cause de vos soucis. Que donnent les sorties debug.Print?
    Regardez ce que je vous avais mis si vous voulez: For Each Cel In Plage 'il ne manque rien?

    Les cellules sont défines comme un range mais doivent se référer aux ..... cellules de ce range
    Par exemple, For Each Cl in Plage.Cells
    J'ai apporté cette modification, en vain.

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Restant toujours sans solution, je me permets de relancer le forum :-)

    Merci d'avance.

  20. #20
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    La plupart de mes questions du post 13 étant toujours sans réponses, je me permet d'attendre que tu y réponde.
    Pour rappel:
    -le nombre de cellule de ta plage
    -le résultat obtenu si tu transforme de ta boucle for each en for to
    -le résultat obtenu avec le même code lancé dans un nouveau classeur
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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