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 :

Sortie de boucle For each cell in Range


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut Sortie de boucle For each cell in Range
    Bonjour...

    Quelqu'un a-t-il une idée de pourquoi l’exécution sort de ma boucle sur ce code :

    cible est initialisée correctement avec Application.Selection (visuel sur l'espion)
    cell prend bien les cellules consécutivement (si je substitue la ligne de code par un msgbox, ca marche)
    Quand j’exécute ceci, il y a interruption du traitement suite à la première modif d'indentation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Application.EnableEvents = False
        Dim cell As Range
        For Each cell In cible
            If (cell.IndentLevel > 0) Then
                cell.IndentLevel = cell.IndentLevel - 1
            End If
        Next cell
        Application.EnableEvents = True

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,

    non car il n'y a aucune instruction de sortie de boucle dans ce code !

    Cela nécessite certainement une explication claire & exhaustive …

    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Et c'est bien la le problème...

    Excel me fait bien le premier décalage et puis plus rien, comme si le traitement avait été correctement effectué sauf que :
    • cible contient bien plusieurs cellules (propriété Cells.Count correct)
    • à l’exécution pas à pas, il n'y a même pas de sortie de boucle. IndentLevel est la dernière instruction parcourue

    Certainement une raison bête... mais laquelle?

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Oui certainement !

    Comme une malheureuse conception en amont dans le code et un manque de vérification de la part de son auteur …

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Et a part des sarcasmes, une réponse constructive?

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Merci de ne pas citer l'intégralité du post juste précédent, aucun intérêt à part nuire à la lisibilité !

    Sinon n'ayant pas de temps à perdre en conjecture, c'était une p'tite piqure de rappel des règles du forum,
    à savoir une présentation initiale digne de ce nom, claire & exhaustive, accompagnée du code complet …

    Sans cela, n'ayant plus de boule de cristal, comment deviner ?‼
    La qualité des réponses dépendant de celle de la question …

  7. #7
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Hi,
    Je ne vois aucun sarcasmes, par contre à 1ère vu le code à l'air correct,
    mais ne connaissant pas la structure de tes données, il n'y que toi qui peut faire cette rectification.

    Bon je me suis fais devancé, par ta réponse Marc

    Donc oui, des explications claires et exhaustives sont important quand on vient exposer son problème.
    J'ai jamais utilisé indentlevel en vba, mais à tout hasard n'aurais tu pas de cellules fusionnées. Car en vba c'est pas l'idéal. Je ne sais si ça joue, donc à vérifier.

    Edit : Testé : Cellules fusionnées ça marche

    Donc il faudra en savoir plus …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Bonjour,

    Oui le code tel quel fonctionne sur une feuille Excel nouvelle... Ma question était la suivante : qu'est ce qui peut provoquer une sortie de la boucle (et meme pire, de la sub) dès la fin de l’exécution du premier IndentLevel sans erreur (j'ai ajouté un On error pour vérifier)
    Donner plus de code m'est impossible, il est sous le sceau de la confidentialité


    Cordialement

  9. #9
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ton code vient de réaliser du calcul quantique en itérant une récursion égale au double d'une pile d'appel standard ?

    non je ne pense pas ... donc il n'y a rien de confidentiel dans ton code

    en revanche, il peut contenir des parties hardcodées avec des "mots" qui pourraient trahir la confidentialité de tes données d'entreprises, et c'est ça qu'il faut simplement trafiquer pour mettre des autres valeurs.

  10. #10
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,
    C'est bien ce que l'on disait, sans aucun éléments supplémentaires, il nous est impossible de savoir le pourquoi du comment. Désolé mais on est pas devin, on s'appuie sur des données et des informations pour cerner un problème.
    Par analogies et en exagérant, c'est un peu comme si je te demandais ce qu'il y a au bout d'un trou noir??
    Et la idem impossible de répondre, tu n'as pas les informations.
    La seule chose à faire et que tu testes ton fichier quitte à le refaire sur un nouveau document.

    Edit : dans le cas où tu sors de ta boucle sans aucune raison, je suppose (peut-être) que le code est lu juste après ta boucle, dans ce cas mets un code supp après ta boucle permettant de récupérer la dernière valeur valide afin de situer le problème (n'hésite pas à le refaire plusieurs fois) et bien sûr utiliser aussi le pas à pas qui peut être d'une grande aide.
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  11. #11
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    J'ai en toute honnêteté un peu honte de proposer une solution pareille, car quand un problème survient rien n'est pire que de le contourner sans le comprendre...
    Mais la raison probable derrière votre problème est l'utilisation d'une boucle For Each. Pour une raison que j'ignore, Excel pense avoir fini dès qu'il a traité la première cellule.
    Le contournement le plus évident est d'écrire une boucle explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        For i = 1 To cible.Rows.Count
            For j = 1 To cible.Columns.Count
                If (cible(i,j).IndentLevel > 0) Then
                    cible(i,j).IndentLevel = cible(i,j).IndentLevel - 1
                End If
            Next j
        Next i
    Mais comme dit précédemment, mieux vaut comprendre ce qu'il se passe plutôt que de contourner le problème...

  12. #12
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    si au moins nous avions en visu la construction de la variable cible ?

    en dépit, je ne peux que proposer d'ajouter la propriété .Cells sur ta ligne For Each Cell in Cible.Cells

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    cible est initialisée correctement avec Application.Selection (visuel sur l'espion)
    La seule chose à faire et que tu testes ton fichier quitte à le refaire sur un nouveau document.
    Oui c'est fait, d'ou ma remarque précédente sur le fait que le code en lui même marche.

    dans le cas où tu sors de ta boucle sans aucune raison, je suppose (peut-être) que le code est lu juste après ta boucle, dans ce ca mets un code supp après ta boucle permettant de récupérer la dernière valeur valide afin de situer le problème (n'hésite pas à le refaire plusieurs fois) et bien sûr utiliser aussi le pas à pas qui peut être d'une grande aide.
    Le pas à pas s’exécute jusqu'au premier passage sur cell.IndentLevel = cell.IndentLevel - 1 puis plus rien comme si l’exécution était terminée.

    Je recherche ce qui dans le nombre de lignes de code présent inhibe la continuation de ce petit bout de code insignifiant...

    @joe.levrai pas quantique mais nucléaire...

  14. #14
    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
    Aux seuls intervenants autres que le demandeur et en particulier à joe.levrai, qui a écrit de manière fort justifiée :
    Quand j’exécute ceci, il y a interruption du traitement suite à la première modif d'indentation.
    Ajoutez-y ceci :
    Si au moins le demandeur, qui a écrit :
    Quand j’exécute ceci, il y a interruption du traitement suite à la première modif d'indentation.
    avait eu la sagesse d'exposer (conformément aux règles de ce forum) comment se manifestait cette interruption .. (message d'erreur ? autre ? et quoi ?)
    Je ne pense pas que la construction de la plage cible soit de nature à provoquer une "interruption", dès lors que les cellules sont toutes vues, puisque :
    si je substitue la ligne de code par un msgbox, ca marche)
    Il faut donc conclure que le problème est ailleurs. Où ? nul ne peut le deviner sans connaître tous les tenants (que le demandeur ne veut pas communiquer) et les aboutissants.

    EDIT : et voilà que nous lisons maintenant :
    Le pas à pas s’exécute jusqu'au premier passage sur cell.IndentLevel = cell.IndentLevel - 1 puis plus rien comme si l’exécution était terminée.
    ce qui n'est pas une "interruption".
    Rappelons que la propriété IndentLevel ne "bronche" pas si on la diminue de 1 alors qu'elle est à 0. Elle reste tout simplement à 0, sans erreur.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Merci de cette intervention fort claire... Mais mon indent de depart est de 5 donc 5-1 = 4 ce qui est fait...
    au moment de passer à la cellule du dessous, plus rien ne se passe puisqu'en pas à pas, plus aucune instruction n'est surlignée.

  16. #16
    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
    Testé chez moi avec plusieurs constructions d'une plage cible (de cellules contigües ou non). -->> pas de problème
    La cause de l'erreur est donc à chercher ailleurs (où ? Le demandeur est le seul à connaître les "imbrications", "autres interventions", etc ... éventuelles.)

  17. #17
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    La solution proposée dans le lien ci-dessous vous permet-elle de résoudre le problème ?
    http://stackoverflow.com/questions/2...as-been-halted

  18. #18
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Le problème provient certainement du code en amont et même si nous nous doutons fort bien de la source
    (en tout cas joe, Ryu, unparia et moi / déjà en lisant le post #8 !) nous en restons au niveau de la présentation
    tant que le minima pourtant indiqué dans les règles du forum n'est pas respecté !

    Présentation médiocre, réponse du même acabit ou même pas de réponse du tout …
    Explication correcte accompagnée du code complet, bien plus de chances d'obtenir une solution !
    Sinon il faut plutôt parcourir les forums de devins, magiciens, tireurs de cartes, etc …

  19. #19
    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
    Remarques matinales :
    - le demandeur nous montre un bout de code qu'il "exécute", mais sans nous dire dans quelle procédure figure ce code.
    - il y inhibe les évènements.
    Pourquoi ?

    On pourra comprendre mon étonnement, dès lors que le fait de modifier le retrait ne déclenche en soi aucun évènement de la feuille.
    Nonobstant, le demandeur a jugé utile d'inhiber ces évènements et je veux croire qu'il ne l'a pas fait "juste pour le plaisir de le faire". Il aurait donc des raisons qu'il est seul à connaître de penser qu'un évènement (lequel ?) pourrait se déclencher pendant sa boucle et contrecarrer ses actions ? Quel est alors cet évèvement et quel est le code de la procédure évènementielle qui le concerne ?

Discussions similaires

  1. Boucle For each cell in Range(.)
    Par FTMFB dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/11/2015, 15h02
  2. [XL-2010] Boucle For each cell in Range(.)
    Par hunk72 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/10/2015, 17h59
  3. [XL-2013] Décrémenter une boucle For Each Cell in Range ?
    Par ldubs dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/12/2014, 17h41
  4. test avant d'entrer dans une boucle For each cell in selection
    Par totoro02 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/01/2009, 09h27
  5. aide vba boucle for each paramétrée en range
    Par gotlieb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2006, 08h55

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