Calculer temps de trajet de nuit en tenant compte des times zones
Hi,
Bon, j'y suis quand même arrivé ==>
Un vrai casse tête !! Et il n'y a pas seulement le fait de passer d'un jour à l'autre ! La période nocturne peut être simple dans une "journée GMT" c'est à dire entre 0h et 24h GMT ou double et bien sûr varier selon la longitude atteinte pendant le vol. Et puis il y a aussi le calcul du sens de déplacement (vers Est ou vers Ouest) qui fera que l'on remontera le temps ou que l'on sera poursuivi par la nuit ... ce calcul est d'autant plus pointu que la longitude, une fois arrivée à 180, repart à -180 ... pfft. J'ai trouvé une formule pour cela :
si V2 = écart de longitude
=SI(V2>0;1;-1)*SI(ABS(V2)>180;-1;1)avec +1 = vol vers l'Ouest, -1 vol vers l'Est
J'ai comparé le résultat obtenu avec le site sunflight, je suis assez proche, sauf dans des cas de grandes diagonales (Helsinki <-> Santiago du Chili par exemple, cas tout théorique) qui est sans doute lié au fait que je linéarise l'évolution de la période nocturne.
| départ | arrivée | par calcul | sunflight.net |
| LFPO | KJFK | 55% | 53% |
| KJFK | LFPO | 29% | 30% |
| KLAX | RJOO | 31% | 19% |
| RJOO | KLAX | 22% | 23% |
| SCEL | NZWN | 63% | 67% |
| NZWN | SCEL | 59% | 41% |
J'ai repris la même idée que sunflight, à savoir que je calcule par simulation du vol, minute par minute (et c'est moins chronophage que je ne le pensais).
Option Explicit
Function NuitSimul(depart As Double, duree As Double, dCoucher As Double, dLever As Double, aCoucher As Double, aLever As Double, sens As Integer) As Variant
Application.Volatile
Dim maintenant As Double, heure As Double, pas%, nb%, i%
Dim hcoucher As Double, hlever As Double
Dim coucher1 As Double, lever1 As Double, coucher2 As Double, lever2 As Double
Dim dCoucherCorrige As Double, dLeverCorrige As Double, aCoucherCorrige As Double, aLeverCorrige As Double
NuitSimul = 0
dCoucherCorrige = dCoucher
dLeverCorrige = dLever
aCoucherCorrige = aCoucher
aLeverCorrige = aLever
If sens = 1 Then ' vers l'Ouest, donc les heures GMT de coucher et lever doivent augmenter au fur et a mesure
If aCoucher < dCoucher Then
aCoucherCorrige = aCoucher + 1
End If
If aLever < dLever Then
aLeverCorrige = aLever + 1
End If
Else ' vers l'Est, donc les heures GMT de coucher et lever doivent diminuer au fur et a mesure
If dCoucher < aCoucher Then
dCoucherCorrige = dCoucher + 1
End If
If dLever < aLever Then
dLeverCorrige = dLever + 1
End If
End If
nb = Int(duree * 24 * 60) ' nombre de minutes
pas = 1 ' en minutes
For i = 0 To nb Step pas ' calcul par [pas] minutes
maintenant = depart + i / 24 / 60
heure = maintenant - Int(maintenant)
hcoucher = dCoucherCorrige + (aCoucherCorrige - dCoucherCorrige) / nb * i
hcoucher = hcoucher - Int(hcoucher) ' on se recale dans la période 0-24h
hlever = dLeverCorrige + (aLeverCorrige - dLeverCorrige) / nb * i
hlever = hlever - Int(hlever) ' on se recale dans la période 0-24h
If hlever <= hcoucher Then ' 2 périodes de nuit pendant la période 0-24h GMT i.e. Paris
coucher1 = 0
lever1 = hlever
coucher2 = hcoucher
lever2 = 1
Else ' une seule période de nuit pendant la durée 0-24h GMT i.e. Osaka
coucher1 = hcoucher
lever1 = hlever
coucher2 = hcoucher
lever2 = hlever
End If
If (heure >= coucher1 And heure <= lever1) Or (heure >= coucher2 And heure <= lever2) Then NuitSimul = NuitSimul + 1
'Debug.Print Format(heure, "hh:mm "); Format(coucher1, "hh:mm "); Format(lever1, "hh:mm "); Format(coucher2, "hh:mm "); Format(lever2, "hh:mm ")
Next
NuitSimul = NuitSimul * pas
NuitSimul = NuitSimul / 60 / 24 ' transformation pour affichage hh:mm
'Debug.Print "============"
End Function
Function nuit(de As String, vers As String, jour As Date, heure As Double, duree As Double)
Application.Volatile
Dim quand As Date
Dim lat As Double, lon As Double, soleil As String, deltaLon As Double
Dim cel As Range, ligne%
Dim dCoucher As Double, dLever As Double, aCoucher As Double, aLever As Double, sens As Integer
For ligne = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Set cel = Sheets("Liste AD").Columns("A").Find(de)
quand = jour
lat = fctLatToDouble(cel.Offset(0, 2))
lon = fctLonToDouble(cel.Offset(0, 3))
soleil = fctSoleil(Int(quand), lat, lon, False)
dCoucher = CDate(Mid(soleil, 7, 2) & ":" & Mid(soleil, 9, 2))
dLever = CDate(Mid(soleil, 1, 2) & ":" & Mid(soleil, 3, 2))
deltaLon = -lon
Set cel = Sheets("Liste AD").Columns("A").Find(vers)
quand = Int(jour + heure + duree)
lat = fctLatToDouble(cel.Offset(0, 2))
lon = fctLonToDouble(cel.Offset(0, 3))
soleil = fctSoleil(Int(quand), lat, lon, False)
aCoucher = CDate(Mid(soleil, 7, 2) & ":" & Mid(soleil, 9, 2))
aLever = CDate(Mid(soleil, 1, 2) & ":" & Mid(soleil, 3, 2))
deltaLon = deltaLon + lon
sens = IIf(deltaLon > 0, 1, -1) * IIf(Abs(deltaLon) > 180, -1, 1)
nuit = NuitSimul(jour + heure, duree, dCoucher, dLever, aCoucher, aLever, sens)
Next
End FunctionBonjour,
J'ai pas ml simulé différentes routes pour tenter de trouver l'origine des quelques écarts, même si les résultats sont tout à fait vraisemblables.
L'intérêt de sunflight est triple :
- superbe mise en forme du site internet avec visualisations en glissant le curseur
- parcours orthodromique
- notions de sunset et sunrise (je ne sais pas à quoi cela correspond !!
Par contre, je ne comprends pas du tout les heures de lever et coucher de soleil. Par ailleurs, ce qu'on peut récupérer par lecture du json, je ne comprends pas les heures GMT car à Paris, en juin à midi il est 11h GMT !!!
Même en passant en déc ou en corrigeant, je ne trouve pas de valeurs de lever/coucher cohérentes (que l'on peut aussi déterminer en lisant le json qui est assez complet, pas à pas.
Dans mon cas, avec les formules que tu m'as données, les heures calculées sont exactes; on a aussi les heures de lever et coucher au sol et "aéro"
If parCivil Then
Z1 = 90.833 ' distance au zénith : civil
Else
Z1 = 96 ' aeronautique
End IfLe calcul ne prends pas autant de temps que je le craignais. Difficile d'optimiser par dichotomie, mais on peut faire des pas de 5mn au lieu de 1mn.
1ère Amélioration : tenir compte dans les phases montée et descente de l'horaire dit "civil", au sol avec des montées de l'ordre de 20mn et des descente de l'ordre de 10mn. Cela peut jouer car en effet la différence est de l'ordre de la demi-heure.
C'est la version v2 :
Option Explicit
Function vol_de_nuit(de As String, vers As String, jour As Date, heure As Double, duree As Double)
'Application.Volatile
Dim quand As Date
Dim lat As Double, lon As Double, soleil As String, deltaLon As Double
Dim cel As Range, ligne%
Dim dCoucher As Double, dLever As Double, aCoucher As Double, aLever As Double
Dim dCoucherSol As Double, dLeverSol As Double, aCoucherSol As Double, aLeverSol As Double
Dim sens As Integer
For ligne = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Set cel = Sheets("Liste AD").Columns("A").Find(de)
quand = jour
lat = fctLatToDouble(cel.Offset(0, 2))
lon = fctLonToDouble(cel.Offset(0, 3))
soleil = fctSoleil(Int(quand), lat, lon, False)
dCoucher = CDate(Mid(soleil, 7, 2) & ":" & Mid(soleil, 9, 2))
dLever = CDate(Mid(soleil, 1, 2) & ":" & Mid(soleil, 3, 2))
soleil = fctSoleil(Int(quand), lat, lon, True)
dCoucherSol = CDate(Mid(soleil, 7, 2) & ":" & Mid(soleil, 9, 2))
dLeverSol = CDate(Mid(soleil, 1, 2) & ":" & Mid(soleil, 3, 2))
deltaLon = -lon
Set cel = Sheets("Liste AD").Columns("A").Find(vers)
quand = Int(jour + heure + duree)
lat = fctLatToDouble(cel.Offset(0, 2))
lon = fctLonToDouble(cel.Offset(0, 3))
soleil = fctSoleil(Int(quand), lat, lon, False)
aCoucher = CDate(Mid(soleil, 7, 2) & ":" & Mid(soleil, 9, 2))
aLever = CDate(Mid(soleil, 1, 2) & ":" & Mid(soleil, 3, 2))
soleil = fctSoleil(Int(quand), lat, lon, True)
aCoucherSol = CDate(Mid(soleil, 7, 2) & ":" & Mid(soleil, 9, 2))
aLeverSol = CDate(Mid(soleil, 1, 2) & ":" & Mid(soleil, 3, 2))
deltaLon = deltaLon + lon
sens = IIf(deltaLon > 0, 1, -1) * IIf(Abs(deltaLon) > 180, -1, 1)
vol_de_nuit = NuitSimul(jour + heure, duree, dCoucher, dLever, aCoucher, aLever, dCoucherSol, dLeverSol, aCoucherSol, aLeverSol, sens)
Next
End Function
Function NuitSimul(depart As Double, duree As Double, dCoucher As Double, dLever As Double, aCoucher As Double, aLever As Double, dCoucherSol As Double, dLeverSol As Double, aCoucherSol As Double, aLeverSol As Double, sens As Integer) As Variant
Dim maintenant As Double, heure As Double, pas%, nb%, i%
Dim hcoucher As Double, hlever As Double
Dim coucher1 As Double, lever1 As Double, coucher2 As Double, lever2 As Double
Dim dCoucherCorrige As Double, dLeverCorrige As Double, aCoucherCorrige As Double, aLeverCorrige As Double
Dim tMontee%, tDescente%
tMontee = 20 ' minutes
tDescente = 10 ' minutes
NuitSimul = 0
dCoucherCorrige = dCoucher
dLeverCorrige = dLever
aCoucherCorrige = aCoucher
aLeverCorrige = aLever
If sens = 1 Then ' vers l'Ouest, donc les heures GMT de coucher et lever doivent augmenter au fur et a mesure
If aCoucher < dCoucher Then
aCoucherCorrige = aCoucher + 1
End If
If aLever < dLever Then
aLeverCorrige = aLever + 1
End If
Else ' vers l'Est, donc les heures GMT de coucher et lever doivent diminuer au fur et a mesure
If dCoucher < aCoucher Then
dCoucherCorrige = dCoucher + 1
End If
If dLever < aLever Then
dLeverCorrige = dLever + 1
End If
End If
nb = Int(duree * 24 * 60) ' nombre de minutes
pas = 1 ' en minutes
For i = 0 To nb Step pas ' calcul par [pas] minutes
maintenant = depart + i / 24 / 60
heure = maintenant - Int(maintenant)
hcoucher = dCoucherCorrige + (aCoucherCorrige - dCoucherCorrige) / nb * i
hcoucher = hcoucher - (tDescente - Application.Min(nb - i, tDescente)) * (((aCoucher - aCoucherSol) * 24 * 60 Mod 60) / tDescente / 24 / 60) ' descente
hcoucher = hcoucher + Application.Max(tMontee - i, 0) * (((dCoucher - dCoucherSol) * 24 * 60 Mod 60) / tMontee / 24 / 60) ' montée
hcoucher = hcoucher - Int(hcoucher) ' on se recale dans la période 0-24h
hlever = dLeverCorrige + (aLeverCorrige - dLeverCorrige) / nb * i
hlever = hlever - (tDescente - Application.Min(nb - i, tDescente)) * (((aLever - aLeverSol) * 24 * 60 Mod 60) / tDescente / 24 / 60) ' descente
hlever = hlever + Application.Max(tMontee - i, 0) * (((dLever - dLeverSol) * 24 * 60 Mod 60) / tMontee / 24 / 60) ' montée
hlever = hlever - Int(hlever) ' on se recale dans la période 0-24h
If hlever <= hcoucher Then ' 2 périodes de nuit pendant la période 0-24h GMT i.e. Paris
coucher1 = 0
lever1 = hlever
coucher2 = hcoucher
lever2 = 1
Else ' une seule période de nuit pendant la durée 0-24h GMT i.e. Osaka
coucher1 = hcoucher
lever1 = hlever
coucher2 = hcoucher
lever2 = hlever
End If
If (heure >= coucher1 And heure <= lever1) Or (heure >= coucher2 And heure <= lever2) Then NuitSimul = NuitSimul + 1
'Debug.Print Format(heure, "hh:mm "); Format(coucher1, "hh:mm "); Format(lever1, "hh:mm "); Format(coucher2, "hh:mm "); Format(lever2, "hh:mm ")
Next
NuitSimul = NuitSimul * pas
NuitSimul = NuitSimul / 60 / 24 ' transformation pour affichage hh:mm
'Debug.Print "============"
End Function2ème amélioration : prendre une route orthodromique. Pour le moment, je ne sais pas quelle route je prends, je linéarise les heures de lever et coucher entre le point de départ et d'arrivée. Or on peut avoir une "journée-soleil" en diabolo ou en tonneau selon qu'on se trouve en hiver ou en été (hémisphère nord). J'y travaille ... il faut "juste" que je trouve les formules pour établir cette "route".
Voilà voilou, avec cette fois-ci une première version descriptive sur un parcours orthodromique.
J'ai limité à quelques aéroport de façon à alléger le fichier et le diffuser directement sur le forum (il suffit ensuite de compléter cette liste). Cela permet de "jouer" et valider.
Je me suis astreint pour le moment à masquer les macros car la trajectoire vient d'ici :
https://www.nauticalalmanac.it/fr/pd-fra-navigation/file/47-loxodromie-orthodromie-waypoints.html
et son auteur ne souhaite pas diffuser le code.
Je n'ai pas repris le calcul plus précis lors des phases de montée et descente car in fine il est du second ordre.
Je vais maintenant créer une fonction qui encapsulera le tout et pourra être greffée sur ton fichier.
Salut,
Désolé pour le retard, j'ai eu pas mal de boulot.
Je suis bluffé par le boulot, les recherches que tu as faite et les compétences.
Chapo, c'est génial.
Pas de soucis ... j'espère que ce travail te servira. En tous cas j'y ai trouvé un excellent exercice neuronal !!
Pour la dernière étape, je vais voir maintenant comment greffer cela sur ton fichier.
Clap de fin ?
Ajoute ce module de calcul à ton fichier (ouvrir l'éditeur de macro et importe ce fichier après l'avoir décompressé).
En R6, mets cette formule :
=vol_de_nuit(B6;D6;A6;C6;N6/24)*24sachant qu'en N6 tu as des heures et centièmes, et que tu récupère aussi des heures et centièmes de nuit.
En cas de difficultés ou pour vérification, n'hésite pas ... et puis si tu peux comparer avec sunflight ce serait parfait !
Salut,
Je ne sais pas quoi dire, c'est parfait, J'ai juste une question.
Quand ma cellule est vide et que je la remplie ou la change, j'ai l'erreur suivante:
>< n'est pas une latitude/longitude valide ?
Autre truc, j'ai parfois un temps de vol de nuit supérieur a mon temps de vol total
Aurais tu une idée pour simplifier le calcul des atterrissages/ décollages de nuit/jour comme celui que j'utilise:
=SIERREUR(SI(ET(MOD(C6;1)>=(((STXT((STXT(AW6;1;4));1;2))*60+STXT((STXT(AW6;1;4));3;4))/(60*24));MOD(C6;1)<(((STXT((STXT(AW6;7;4));1;2))*60+STXT((STXT(AW6;7;4));3;4))/(60*24)));1;"");"")
En tout cas, merci, c'est vraiment génial.
ok je regarde les cas où le vol de nuit est supérieur.
Je crois savoir pourquoi, une affaire de clôture entre les intervalles et les poteaux ! je m'explique : en fait je calcule à chaque point, depuis le point d'origine 0 et le point d'arrivée N. J'ai N intervalles, mais je calcule N+1 fois car je calcule aussi le point d'origine. Et donc eneffet, quand tout est dans la phase nuit, j'ai un chouia de plus. C'est pareil avec sun flight, mais ils ont limité les % à 100%. C'est ce qu'il faut faire.
Pour ce qui est de "n'est pas une latitude/longitude valide", c'est plus embêtant ... regarde quand même la base de données car pour certains aéroports/aérodromes il n'y a pas la valeur de la latitude et de la longitude. Quel est le cas ?
C'est bien cela.
Dans ce cas, change cette instruction, au lieu de i = 0 dans cette ligne, mets i = 1
For i = 1 To nb Step pas ' calcul par [pas] minutesMais on n'aura pas le point pile poil de début de vol... hé oui c'est une question d’intervalle et de points de repère.
Et on le voyait ici aussi
https://forum.excel-pratique.com/viewtopic.php?p=786846#p786846
avec sunflight.
Je regarde ...Aurais tu une idée pour simplifier le calcul des atterrissages/ décollages de nuit/jour comme celui que j'utilise:
=SIERREUR(SI(ET(MOD(C6;1)>=(((STXT((STXT(AW6;1;4));1;2))*60+STXT((STXT(AW6;1;4));3;4))/(60*24));MOD(C6;1)<(((STXT((STXT(AW6;7;4));1;2))*60+STXT((STXT(AW6;7;4));3;4))/(60*24)));1;"");"")
En fait j'utilise dans un des fichiers postés précédemment une fonction un poil différente, mais l'essentiel est le même.
Je calcule l'heure du lever du soleil =(STXT(AW6;7;2)&":"&STXT(AW6;9;2))*1 et l'heure du coucher =(STXT(AW9;1;2)&":"&STXT(AW9;3;2))*1 que je compare donc directement à C6.
MAIS ...
dans ta fonction, es-tu sûr de bien prendre en compte des villes comme RJOO (Osaka) ou KLAX (Los Angeles) où en heure GMT la nuit se trouve non pas en dehors des bornes mais à l'intérieur ? Exemple le 21 juin à Los Angeles il fait nuit entre 03:04 et 12:44 GMT.
C'est bien cela.
Dans ce cas, change cette instruction, au lieu de
i = 0dans cette ligne, metsi = 1For i = 1 To nb Step pas ' calcul par [pas] minutesMais on n'aura pas le point pile poil de début de vol... hé oui c'est une question d’intervalle et de points de repère.
Salut, mmmh je viens de le faire, et j'ai toujours la petite erreur de 0,1 sur certaines lignes.
En fait j'utilise dans un des fichiers postés précédemment une fonction un poil différente, mais l'essentiel est le même.
Je calcule l'heure du lever du soleil
=(STXT(AW6;7;2)&":"&STXT(AW6;9;2))*1et l'heure du coucher=(STXT(AW9;1;2)&":"&STXT(AW9;3;2))*1que je compare donc directement à C6.MAIS ...
dans ta fonction, es-tu sûr de bien prendre en compte des villes comme RJOO (Osaka) ou KLAX (Los Angeles) où en heure GMT la nuit se trouve non pas en dehors des bornes mais à l'intérieur ? Exemple le 21 juin à Los Angeles il fait nuit entre 03:04 et 12:44 GMT.
Je viens de regarder et il y a d'après moi un truc bizarre:
Les heures sont inversées pour LAX, lever a 1245 et coucher a 0305
Mon calcul était le suivant pour avec des heures fixes:
Décollage
jour:
=SIERREUR(SI(ET(MOD(C6;1)>=(((STXT((STXT(AW6;1;4));1;2))*60+STXT((STXT(AW6;1;4));3;4))/(60*24));MOD(C6;1)<(((STXT((STXT(AW6;7;4));1;2))*60+STXT((STXT(AW6;7;4));3;4))/(60*24)));1;"");"")
nuit:
=SIERREUR(SI(OU(MOD(C6;1)<(((STXT((STXT(AW6;1;4));1;2))*60+STXT((STXT(AW6;1;4));3;4))/(60*24));MOD(C6;1)>=(((STXT((STXT(AW6;7;4));1;2))*60+STXT((STXT(AW6;7;4));3;4))/(60*24)));1;"");"")
Atterrissage:
jour:
=SIERREUR(SI(ET(MOD(E6;1)>=(((STXT((STXT(AX6;1;4));1;2))*60+STXT((STXT(AX6;1;4));3;4))/(60*24));MOD(E6;1)<(((STXT((STXT(AX6;7;4));1;2))*60+STXT((STXT(AX6;7;4));3;4))/(60*24)));1;" ");"")
nuit:
=SIERREUR(SI(OU(MOD(E6;1)<(((STXT((STXT(AX6;1;4));1;2))*60+STXT((STXT(AX6;1;4));3;4))/(60*24));MOD(E6;1)>=(((STXT((STXT(AX6;7;4));1;2))*60+STXT((STXT(AX6;7;4));3;4))/(60*24)));1;" ");"")
Mais du coup avec ce truc qui s'inverse ca me perturbe
Peux-tu me donner les lignes concernées ?C'est bien cela.
Dans ce cas, change cette instruction, au lieu de
i = 0dans cette ligne, metsi = 1For i = 1 To nb Step pas ' calcul par [pas] minutesMais on n'aura pas le point pile poil de début de vol... hé oui c'est une question d’intervalle et de points de repère.
Salut, mmmh je viens de le faire, et j'ai toujours la petite erreur de 0,1 sur certaines lignes.
MAIS ...
dans ta fonction, es-tu sûr de bien prendre en compte des villes comme RJOO (Osaka) ou KLAX (Los Angeles) où en heure GMT la nuit se trouve non pas en dehors des bornes mais à l'intérieur ? Exemple le 21 juin à Los Angeles il fait nuit entre 03:04 et 12:44 GMT.
Je viens de regarder et il y a d'après moi un truc bizarre:
Les heures sont inversées pour LAX, lever a 1245 et coucher a 0305
En GMT, pour Los Angeles, vu sa longitude W de 118°, il fait nuit à compter de 3h33 jusque 12h15 le 21 juin en heure "aéro". Hé oui ! et donc il faut compter la nuit entre ces bornes et pas en dehors.
Une formule plus "simple" serait de retrancher aux heures (heure courante, lever, coucher) la longitude divisée par 360. Ainsi on revient toujours à un cas où le lever du soleil se fait avant 12h et le coucher après 12h.
Je vais te proposer une correction de la formule.
Day / Take-off
=SIERREUR(SI(ET(
MOD(C6-fctlontodouble(RECHERCHEV(B6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1)>=MOD((((STXT((STXT(AW6;1;4));1;2))*60+STXT((STXT(AW6;1;4));3;4))/(60*24))-fctlontodouble(RECHERCHEV(B6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1);
MOD(C6-fctlontodouble(RECHERCHEV(B6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1)<MOD((((STXT((STXT(AW6;7;4));1;2))*60+STXT((STXT(AW6;7;4));3;4))/(60*24))-fctlontodouble(RECHERCHEV(B6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1)
);1;"");"")Night / Take-off
=SI(J6=1;"";1)Day / Landing
=SIERREUR(SI(ET(
MOD(E6-fctlontodouble(RECHERCHEV(D6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1)>=MOD((((STXT((STXT(AX6;1;4));1;2))*60+STXT((STXT(AX6;1;4));3;4))/(60*24))-fctlontodouble(RECHERCHEV(D6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1);
MOD(E6-fctlontodouble(RECHERCHEV(D6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1)<MOD((((STXT((STXT(AX6;7;4));1;2))*60+STXT((STXT(AX6;7;4));3;4))/(60*24))-fctlontodouble(RECHERCHEV(D6;'Liste AD'!A$1:D$65537;4;FAUX))/360;1)
);1;" ");"")Night / Landing
=SI(L6=1;"";1)Ce qui est beaucoup plus simple !
C'est bien cela.
Dans ce cas, change cette instruction, au lieu de
i = 0dans cette ligne, metsi = 1For i = 1 To nb Step pas ' calcul par [pas] minutesMais on n'aura pas le point pile poil de début de vol... hé oui c'est une question d’intervalle et de points de repère.
Salut, mmmh je viens de le faire, et j'ai toujours la petite erreur de 0,1 sur certaines lignes.
C'est peut-être aussi lié au pas de calcul
Change alors pas = 5 en pas = 1
Si cela ne résoud pas, evoie moi les cas rencontrés.
Je vais aussi ré-introduire les corrections en phase montée et descente car les heures lever et coucher ne sont pas les mêmes.
Salut.
Mon précédent message ne s'est pas envoyé...
Je disais donc:
J'ai essayé de changer le pas, 4-5-6 etc et pour le moment ca ne marche pas.
Voila un screen de mon carnet:
Pour les heures de T/O et L/D ca a l'air de bien marcher, le top. Je vais continuer à faire mes petits tests
Par contre comme tu le dis, il y a un moment ou le truc bug quand on est dans les plots ou en dehors.
En GMT, pour Los Angeles, vu sa longitude W de 118°, il fait nuit à compter de 3h33 jusque 12h15 le 21 juin en heure "aéro". Hé oui ! et donc il faut compter la nuit entre ces bornes et pas en dehors.
Une formule plus "simple" serait de retrancher aux heures (heure courante, lever, coucher) la longitude divisée par 360. Ainsi on revient toujours à un cas où le lever du soleil se fait avant 12h et le coucher après 12h.
Je vais te proposer une correction de la formule.
Ce n'est plus dans mes compétences pour le coup.
Bonjour,
il me semble bien pourtant qu'avec ceci
nb = Int(duree * 24 * 60) ' nombre de minutes
pas = 1 ' en minutes
For i = 1 To nb Step pas ' calcul par [pas] minuteson corrige ce dépassement.
J'ai toutefois blindé un peu plus le code. Et j'ai surtout ré-introduit la notion de décollage et atterrissage.
J'ai essayé de changer le pas, 4-5-6 etc et pour le moment ca ne marche pas.
J'ajoute que lorsqu'on change la macro, il faut réactiver au moins un premier calcul, par exemple effacer la formule et la remettre.
J'avis mis une instruction application.volatile mais qui est trop chronophage.