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
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