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épartarrivéepar calculsunflight.net
LFPOKJFK55%53%
KJFKLFPO29%30%
KLAXRJOO31%19%
RJOOKLAX22%23%
SCELNZWN63%67%
NZWNSCEL59%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 Function

Bonjour,

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 If

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

2è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 !! et une saine occupation de loisir. si si !

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é).

15calculnuit.zip (1.77 Ko)

En R6, mets cette formule :

=vol_de_nuit(B6;D6;A6;C6;N6/24)*24

sachant 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 (Cf les screens)

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.

capture d ecran 2019 08 10 a 17 21 04 capture d ecran 2019 08 10 a 17 21 15

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

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

capture d ecran 2 capture d ecran 1

Et on le voyait ici aussi

https://forum.excel-pratique.com/viewtopic.php?p=786846#p786846

avec sunflight.

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;"");"")
Je regarde ...

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 = 0 dans cette ligne, mets i = 1

    For i = 1 To nb Step pas  ' calcul par [pas] minutes

Mais 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))*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.

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

capture d ecran 2019 08 11 a 14 34 51

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

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

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

Peux-tu me donner les lignes concernées ?

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 = 0 dans cette ligne, mets i = 1

    For i = 1 To nb Step pas  ' calcul par [pas] minutes

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

capture d ecran 2019 08 12 a 11 12 07 capture d ecran 2019 08 12 a 10 59 32

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

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

10calculnuit.zip (1.83 Ko)

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.

Rechercher des sujets similaires à "calculer temps trajet nuit tenant compte times zones"