XL 2016 Identifier la première fois qu'une condition est vraie dans une boucle for

alnilam

XLDnaute Nouveau
Bonjour,

Pour un projet (malheureusement confidentiel, du coup je vais essayer de faire au mieux pour être clair), j'ai deux tableaux avec des données prises à des heures précises (début et fin) mais qui ne coïncident pas, et il faut que je fasse des calculs qui dépendent du temps à partir de ces données, en utilisant des formules différentes suivant si les temps coïncident, se chevauchent en partie ou sont disjoints (à l'aide de plusieurs if / elseif dans une macro).

Pour ça, je pars d'un de ces 2 tableaux en prenant une ligne après l'autre, et je regarde quelles lignes de l'autre tableau correspondent à ces heures pour pouvoir faire mon calcul (il peut y avoir plusieurs lignes du deuxième tableau qui sont concernées, et qui ne se suivent pas forcément même si un tri est fait sur l'heure de départ puisque la durée est variable). Comme j'ai plusieurs milliers de lignes par tableaux, je souhaitais faire mes comparaisons de temps pour distinguer les cas sur des plages plus restreintes (grâce au tri par heure de début), plutôt que de passer en revue toutes les lignes du second tableau à chaque fois.

A l'aide d'un While, j'ai trouvé une condition pour ne pas passer la fin du tableau en revue une fois que je suis sur que les lignes restantes sont inutiles. Par contre, pour éviter de repasser le début du tableau en revue, il faudrait que je puisse savoir à quelle ligne mon premier if est vrai pour la première fois. S'il est faux pour une ligne de mon premier tableau, il sera en effet forcément faux pour les lignes suivantes. Voici la structure de ma macro :

For (boucle sur les lignes du premier tableau)
Initialisation de la correction = 0
While (la condition pour ne pas passer en revue la fin du tableau)
If (c'est là que je dois identifier la première fois que la condition est respectée => lignes où les temps coïncident ou se chevauchent)
If (coïncident)
formule de correction 1 cumulative
ElseIf (chevauchent à droite)
formule de correction 2 cumulative
ElseIf (chevauchent à gauche)
formule de correction 3 cumulative
Else (chevauchement à droite et à gauche)
formule de correction 4 cumulative
End If
End If
Wend
calcul si les temps étaient disjoints sur toute la durée de la ligne du premier tableau + correction éventuelle
Next

Ma question est donc de savoir si c'est possible, et si oui, comment identifier simplement cette première fois où je rentre dans le if, en sachant que je peux peut-être y re-rentrer par la suite (je ne peux donc pas utiliser un compteur), que si j'y rentre 3 fois, ça ne veut pas dire que c'est mon compteur - 3 puisque rien ne m'assure que les lignes où je suis rentré dans le if se suivent...
Je vois bien une solution consistant à créer un tableau dans lequel j'inscrirais le numéro des lignes où je suis entré en changeant de colonne grâce à une boucle for incluse dans le if, et après j'aurai juste à aller chercher la valeur que je veux dans la première colonne, mais je suis persuadé (peut-être à tort) qu'il existe une solution plus simple ne nécessitant qu'un entier, pas de tableau.

Merci d'avance pour vos suggestions.

Cordialement,

Alnilam
 

alnilam

XLDnaute Nouveau
Bonjour pierrejean,

Finalement une bonne nuit de sommeil et j'ai trouvé la solution par moi-même. J'ai initialisé un compteur c1 = 1 entre la boucle for et la boucle while et rajouté au début de mon premier if:

if c1=1 then
ligneinitialesuivante = ligneactuelle
c1 =2
end if

C'est évident après coup, mais j'étais parti sur un mauvais raisonnement hier et je n'arrivais pas à en sortir. Du coup tout marche bien. Merci

Alnilam
 

Discussions similaires

Réponses
3
Affichages
254