Boucle For qui s'arrête à x+1

Bonjour,

J'ai besoin d'un petit coup de main sur un soucis stupide qui me fait enrager.

Sub noms()
Dim Y As Integer, X As Integer, Z As Integer
Dim Cell(5) As Range, oCell(5) As Range

Dates_Arr

For X = 1 To 13

    For Y = 0 To 5
        Debug.Print Y

        If Not ABCD(X, Y, 1) Is Nothing Then Set Cell(Y) = ABCD(X, Y, 1)

        For Z = 1 To 5
            If Not ABCD(X, Y, Z) Is Nothing Then Set oCell(Y) = ABCD(X, Y, Z)
        Next Z

    Next Y
        Debug.Print Y
ActiveWorkbook.Names.Add Name:="Date" & Mois(Cell(Y)) & Year(Cell(Y)), RefersTo:="='" & F(13).Name & "'!" & Cell(Y).Address & ":" & oCell(Y).Address
Next X

On ne va pas s'attarder sur le but du code ; simplement sur ce F*utu Y.

Tout va bien, il boucle bien de 0 à 5, mais à la dernière itération, il se fait un kiff et en refait une dernière pour arriver à "6", qui est de fait hors dimension, et qui vient m'ennuyer énormément pour la suite.

Je n'ai jamais vu quelque chose de similaire, donc j'me suis fait des tests bidons avec d'autres boucles, sur la même structure, et l'itération s'arrête bien à la valeur spécifiée.

J'ai pas vraiment envie d'insérer un tout-moche "Y = Y -1" après la dernière itération, donc si quelqu'un pouvait éclairer ma lanterne...

EDIT : Bon ben si apparemment, ça le fait à chaque fois. Marrant que je n'ai jamais eu de soucis, ni même remarqué avant. Bref, je vais trouver quelque chose

Salut !

On ne voit rien de particulier dans ton code... c'est sans doute autour (surtout si elle s'arrête sans erreur d'exécution).

Par contre que Y soit à 6 en fin de boucle, c'est normal, c'est le passage à 6 qui fait arrêter la boucle. Je m'en sers souvent dans les boucles où je sors de la boucle une fois trouvé pour tester si trouvé ou pas (variable supérieure au max de la boucle).

Bonne nuit

Ferrand

Bonjour Ferrand

En fait, pour te situer grosso modo le contexte, y'a une grosse gestion calendaire dans l'OAD (puisque G de prod/distri), et je me sers d'un array 3D pour identifier et borner les mois/semaines/jours (ben oui, con comme je suis, je me suis dit que "des totaux par semaine et par mois, c'est classe !", donc adieu la simple différence de date...bref).

Pas forcément le moyen le plus aisé - j'ai toujours entendu dire que "si votre solution est un tableau 3D, vous avez choisi compliqué" -, mais ça tourne bien.

Bref, j'ai voulu insérer une instruction entre mon itération X et Y - alors que d'habitude, je re-boucle - et forcément, arrivé à la dernière itération (donc le passage à 6 qui arrête la boucle), ben l'instruction est hors dimension.

Je suis loin d'être un cador en VB(A), mais c'est toujours marrant de découvrir des basiques à la fin de plusieurs mois de développement

Et quand on pense qu'on peut faire des tableaux à 60 dimensions !

En pareil cas, je fais un tour complet de boucle en simulation manuelle (sur papier) : soit mes calculs suivent la trajectoire du programme et de bonnes chances de trouver le point où ça dérive (ou les points !), soit j'arrive au résultat attendu et c'est que j'ai loupé la bifurcation (ça peut durer parfois longtemps).

Les tableaux multi-dimensions tournent très bien ! C'est la capacité d'imaginer ce qui'ls font qui n'arrivent pas toujours à suivre... Mais là où tu as choisi compliqué, c'est si tu fais semaine et mois simultanément, ça ne se recoupe jamais, même sur l'année.

Bonne journées

Ferrand

Les tableaux à 60 dimensions, je pense que nous, simples mortels, n'en avons pas besoin Mais effectivement, quelle galère ça doit être...

C'est vrai que le papier reste très pratique pour visualiser ; je l'utilise parfois mais dans ce cas présent, un simple debug.print et je vois où ça (peut) déconne(r).

Pour le tableau 3D , j'avoue ne pas avoir compris ta dernière phrase ^^

Concrètement, X = 1 to 12, Y = 0 to 5, Z = 1 to 5

Jamais plus de 12 mois dans l'année, jamais plus de 5 semaines dans le mois, jamais plus de 5 jours ouvrés dans la semaine.

Du coup, pour janvier 2015 on aura :

ABCD(1, 0, 1) = 01/01/15

(1, 0, 2) = 02/01/15

(1, 1, 1) = 05/01/2015

(1, 4, 5) = 30/01/2015

Puis pour Février, on remet Y et Z à zero (la semaine zero permet entre autres choses de gérer les semaines à cheval sur deux mois)

Je cloisonne bien mes semaines et mes mois ; le seul problème qui se pose parfois c'est que ma dernière semaine du mois n'est pas forcément égale à la borne supérieure de Y (s'il y a 4 semaines dans le mois, par exemple), idem pour les semaines à jours fériés supprimés du calendaire. Du coup, il faut moduler un peu le code car (X, 5, 5) n'est pas forcément le dernier jour du mois...

Mais c'est un détail mineur

C'est que justement les semaines d'extrémités à cheval c'est le cas général... Je ne me serais pas engagé dans cette voie. En général on n'en a pas besoin : la gestion se fait le plus souvent sur le mois et l'année, le suivi hebdomadaire étant préféré pour les projets, campagnes, etc., système d'évaluation distincts et sur des échelles différentes.

Bon courage. Tu retomberas bien sur tes pieds !

C'est effectivement le cas. Le "truc", c'est que le prog sert au contrôle de gestion, à la distri, à la prod, aux méthodes et au directeur de site.

Du coup, autant de mailles de suivi - et de rq - que d'acteurs.. Certains le veulent à la journée, d'autres à la semaine, au mois, à l'année, etc..

Mais tu me rends curieux, du coup Tu te serais tourné vers quelle solution ?

Merci pour l'encouragement

Ah ! Difficile de choisir une option quand on n'est pas dedans !!

Peut-être j'aurais dédoublé, les uns et les autres n'ayant pas besoin des même chiffres.

Mais je dis ça de l'extérieur ! J'avoue que, me connaissant, j'aurais sans doute été tenté de produire un "machin" répondant à tout et à tout le monde !!

A+

EDIT : Ooops...Moche de se tromper de sujet.

Rechercher des sujets similaires à "boucle for qui arrete"