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 :

Ma boucle s'arrête avant la fin du tableau


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
    Développeur informatique
    Inscrit en
    Mai 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2018
    Messages : 28
    Par défaut Ma boucle s'arrête avant la fin du tableau
    Bonjour au forum,

    Je suis ici car j'ai un souci concernant une boucle qui s'arrête avant d'avoir atteint la fin de ma colonne.
    Ma colonne a environ 21 000 lignes à la base. Chaque ligne étant un article.
    (Donc ma boucle, au départ va de i=2 to FinFeuilleFinale. "FinFeuilleFinale" étant égale à la dernière ligne remplie)
    Un article peut être composé d'autres articles, ce sont ces articles là que je cherche à placer dans ma feuille, afin d'obtenir un résumé des nomenclatures.

    Je regarde un article, et si il est composé d'autres articles, alors je copie ces derniers et je les place dans ma colonne, ce qui RALLONGE ma colonne.
    Si je rajoute un article, je réaffecte la fin de mon tableau dans ma variable "FinFeuilleFinale" qui augmente en fonction du nombre de ligne rajoutées.

    Une illustration s'impose :

    Nom : capture_problemeboucle.PNG
Affichages : 1008
Taille : 29,7 Ko et j'obtiens Nom : capture_boucle2.PNG
Affichages : 993
Taille : 27,4 Ko

    En mode debug, ma variable "FinFeuilleFinale" s'incrémente bien.
    Cependant, le "i" de mon "For" s'arrête à la valeur qui a été attribuée au départ à "FinFeuilleFinale" , soit 21 000 environs.

    En soit ma boucle ne va pas au delà de 21 000 même en re-définissant cette variable et je me demande pourquoi.
    Je met le code associé.
    En espérant avoir été clair.

    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
    Sub Generer_Nomenclature()
    Application.ScreenUpdating = False
    '--------------------Déclarations des variables----------------------------
    Dim NumeroGamme As String
    Dim FeuilleArticle As Worksheet, FeuilleNomenclature As Worksheet, FeuilleFinale As Worksheet
    Dim i As Integer, FinTableauArticle As Integer, Niveau As Integer, Decalage As Integer
    Dim FinTableauNomenclature As Long, FinFeuilleFinale As Long, Ligne As Long
    Dim ZoneDeRecherche As Range, Trouver As Range
    Dim Adresse As String
     
    '-----------Attributions des feuilles Excel aux variables------------------
    Set FeuilleArticle = Worksheets("GPARTICL")
    Set FeuilleNomenclature = Worksheets("GPNOMENC")
    Set FeuilleFinale = Worksheets("Nomenclature")
    '--------------------------------------------------------------------------
     
    FinTableauArticle = FeuilleArticle.Cells(50000, 1).End(xlUp).Row
    FinTableauNomenclature = FeuilleNomenclature.Cells(50000, 6).End(xlUp).Row
     
    'On copie la première colonne de la feuille GPARTICL avant de commencer le traîtement
    'et on attribue le nombre de ligne de la feuille Nomenclature dans "FinFeuilleFinale"
    FeuilleFinale.Columns(1).Value = FeuilleArticle.Columns(1).Value
    FinFeuilleFinale = FeuilleFinale.Cells(50000, 1).End(xlUp).Row
    Niveau = 0
    Decalage = 1
    '---------------------------Début du traîtement----------------------------
    Niveau = Niveau + 1
    For i = 2 To FinFeuilleFinale
    NumeroGamme = FeuilleFinale.Cells(i, 1).Value
       If NumeroGamme <> "" Then
            Set ZoneDeRecherche = FeuilleNomenclature.Columns(32)
            Set Trouver = ZoneDeRecherche.Cells.Find(what:=NumeroGamme, LookAt:=xlWhole)
     
                If Trouver Is Nothing Then
     
                Else
            ' On repère sur quelle ligne se trouve le numéro du produit de la nomenclature en cours
                FeuilleNomenclature.Activate
                Adresse = Trouver.Address
                Range(Adresse).Select
                Ligne = ActiveCell.Row
     
            'Une fois repérée, on copie le numéro du produit dans notre feuille Nomenclature
     
                While FeuilleNomenclature.Cells(Ligne, 32).Value = NumeroGamme
     
                FeuilleFinale.Activate
                FeuilleFinale.Rows("" & i + Decalage & ":" & i + Decalage & "").Select
                Selection.Insert Shift:=xlDown
                FeuilleFinale.Cells(i + Decalage, 1 + Niveau).Value = FeuilleNomenclature.Cells(Ligne, 6).Value
                Ligne = Ligne + 1
                Decalage = Decalage + 1
     
                Wend
                Decalage = 1
                End If
                FinFeuilleFinale = FeuilleFinale.Cells(50000, 1).End(xlUp).Row
        End If
        FinFeuilleFinale = FeuilleFinale.Cells(50000, 1).End(xlUp).Row
    Next
    Application.ScreenUpdating = True
    End Sub
    Bonne journée à tous.
    Cordialement.

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    Le souci vien certainement du fait qu'il y a des cellules "vide" dans ta colonne À, donc ta variable de dernière ligne n est pas correcte.

    Tu aurais probablement plus de facilité en passant tes données actuelles en tableau structuré, ça permet de s affranchir de ce genre de problème.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, je travaillerais avec des tableaux structurés comme sources de mes données et je recréerais une "vue" de la nomenclature éclatée à la volée. Parce que si tu parcours les lignes de ta nomenclature puis que tu ajoutes des lignes en plein milieu pour introduire les articles qui en composent un autre, tu vas forcément devoir tout le temps redéfinir la fin de ta plage pour tenir compte des insertions. C'est à mon avis assez casse-gueule.

    [EDIT] Grillé par mfoxy pour le coup des tableaux structurés...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2018
    Messages : 28
    Par défaut
    Bonjour mfoxy, bonjour Pierre.

    Je vais de ce pas me pencher sur les tableaux structurés, et je reviendrais faire un retour de mon avancement.
    Merci pour vos réponses.
    Cordialement.

  5. #5
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    @ Pierre,
    Bonjour,

    Difficile de voir autrement lorsqu'on y a goûté 😍

    @ Georges, surtout n'hésite pas à revenir en cas de question,le forum se fera un plaisir de t'aider 😉

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Par défaut
    Bonjour,

    Ce n'est pas du tout une bonne idée de joueur avec la variable utilisée par la boucle FOR. On se retrouve souvent avec des situations inattendue, comme c'est ton cas ici.
    Sans regarder le code en détail, je pense que ta boucle s'arrête car tu atteint la valeur de FinFeuilleFinale avant que la macro ne puisse lui attribuer une nouvelle valeur.

    Pour moi il y a deux solutions qui me viennent à l'esprit (parmi d'autres certainement) :
    - Garder ta boucle For, et placer le résultat dans un autres onglet (ce qui serait le plus propre selon moi)
    - Utiliser une boucle Do Until/While avec pour condition "tant qu'il y a encore des données dans des cellules plus bas que celle dans laquelle tu es".

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    De toutes façons, pour pouvoir répondre à ta question, il faudrait voir la structure de tes données... Si tu as besoin de cela, je suspecte un problème de conception de ton classeur.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    LeGerorges,

    Si ce n'est pas trop demandé, pourrais-tu partager ton fichier, histoire de voir un peu ce qui ce passe dans les feuilles sources et peut-être t'aiguiller vers la solution adéquate.

    J'aime bien les TDC pour une vue hiérarchisée de Bd.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour le file,

    même si je suis totalement d'accord avec mfoxy et Pierre Fauconnier quand à l'utilisation des tableaux structurés je voudrais quand même répondre à ta question:

    dans une boucle for ou i est la variable de boucle il n'est pas possible de redéfinir le nombre de boucle de façon dynamique. je m'explique

    si je simplifie la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 2 To FinFeuilleFinale 'le nombre de boucle est définitivement determinée ici et ce jusqu'a la fin de la boucle
     
    FinFeuilleFinale = FeuilleFinale.Cells(50000, 1).End(xlUp).Row 'cette ligne même si elle est dans la boucle, n'aura aucun effet sur le nombre de boucle définit par la ligne précédente c'est mort !
     
    Next i
    pour créer une boucle a nombre de boucle variable il faut passer par do loop

    ce qui suit n'est qu'un exemple à adapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i=2
    Do
      'le traitement des nomenclatures ici
       FinFeuilleFinale = FeuilleFinale.Cells(50000, 1).End(xlUp).Row
       DoEvents 'redonne la main cela évite de se retrouver coincé dans une boucle qui serait infini
       i=i+1
    Loop Until i = FinFeuilleFinale + 1
    Mais oui avec un tableau structuré tu n'aurais plus ce problème

    edit : ah oui ! attention i est dimensionné à integer limité en valeur positive à 32767. si ton tableau augmente au delà et c'est possible vu que tu pars de la ligne 50000 tu auras des ennuis.
    la propriété row renvois un long et comme en générale il est préférable de dimensionner la variables sur la base de de la propriété utilisée pour alimenter la dite variable un dimensionnement a long serait plus robuste.

  10. #10
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    @Phil Free +1

    Après avoir "lu" un peu plus son code , je suis presque persuadé qu'il n'y a même pas lieu d'utiliser de code pour le rendu "hiérarchisé" que LeGeorges souhaite.

    Il suffirait, selon mon intuition, de créé un Tdc basé sur sa feuille "GPNOMENC".

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2018
    Messages : 28
    Par défaut
    Bonjour,

    @mfoxy , j'ai essayé de joindre le fichier, mais il est trop volumineux semblerait-il.

    @Phil Free, merci pour ta réponse. Pour le moment j'ai du mal avec les tableaux structurés. Je ne comprend pas trop comment régler mon problème via ceux-ci. Si mon incompréhension persiste, je me pencherais sur le Do Loop.

    Cordialement.

    LeGeorges.

  12. #12
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Re,

    Pour joindre le fichier, s' il est trop volumineux, tu peux le déposer dépourvu de ses macros et/ou en le compressant au format ". zip", rare sont les membres sachant ouvrir les ". rar"

    Bat

Discussions similaires

  1. Double boucle for, stoppez avant la fin du vecteur
    Par ju_cayenne dans le forum MATLAB
    Réponses: 3
    Dernier message: 21/12/2017, 12h05
  2. Exécution du programme s'arrête avant la fin
    Par salma1990 dans le forum Général Java
    Réponses: 3
    Dernier message: 28/11/2015, 01h10
  3. [XL-2010] Pas d'arrêt de procédure - fin de tableau
    Par LiseUEMPT dans le forum Excel
    Réponses: 1
    Dernier message: 24/02/2014, 23h07
  4. [MySQL] problème de script qui s'arrête avant la fin
    Par sorciervoyageur dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/05/2009, 10h19
  5. Réponses: 0
    Dernier message: 27/04/2009, 19h49

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