XL 2021 calcul de l'heure quand le soleil est au Zénith

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,

Avec chatGPT, j'ai fait une approche sur le calcul de l'heure quand le soleil est au Zénith, mais pas bon, mon format reçu n'est pas celui souhaité.

Le résultat est en cellule "B20"

Capture d’écran 2024-08-12 120606.jpg


Je ne sais pas si c'est juste une histoire de format ou de conversion, je devrais avoir 14h18m à une ou deux minutes prêt.

VB:
Function ZenithTime(ByVal Date_ As Date, ByVal Longitude As Double) As Double

            A = Year(Range("B1"))
            M = Month(Range("B1"))
            J = ActiveCell.Value
            vdate = DateSerial(A, M, J)

    ' Variables
    Dim n As Double ' Nombre de jours depuis le 1er janvier de l'année
    Dim B As Double ' Correction pour l'équation du temps
    Dim EoT As Double ' Équation du temps en minutes
    Dim SolarNoon As Double ' Midi solaire en heures

    ' Nombre de jours depuis le début de l'année
    n = DateSerial(Year(A), Month(M), Day(J)) - DateSerial(Year(A), 1, 1) + 1
  
    ' Calcul de l'équation du temps (EoT)
    B = (n - 81) * (360 / 365)
    EoT = 9.87 * Sin(2 * Application.WorksheetFunction.Radians(B)) - 7.53 * Cos(Application.WorksheetFunction.Radians(B)) - 1.5 * Sin(Application.WorksheetFunction.Radians(B))
  
    ' Calcul de l'heure du zénith solaire (en heures)
    SolarNoon = 12 + (4 * Longitude - EoT) / 60
  
    ' Retourner l'heure du zénith en heures décimales
    ZenithTime = SolarNoon
End Function

Sub testzenith()

Cells(20, 2) = ZenithTime(vdate, -3.36667)

End Sub

J'ai pris ma position sur Lorient.

Merci à tous
Nicolas
 

Pièces jointes

  • New Calendrier v2 (1).xlsm
    134.4 KB · Affichages: 7
Solution
ca donnerait ceci:
VB:
'***********************************************
Function ZenithTime(ByVal vdate As Date, ByVal Longitude As Double) As Date
    ' Variables
    Dim n As Double ' Nombre de jours depuis le 1er janvier de l'année
    Dim B As Double ' Correction pour l'équation du temps
    Dim EoT As Double ' Équation du temps en minutes
    Dim SolarNoon As Double ' Midi solaire en heures
    Dim DateHe As Date 'date du passage à l'heure d'été
    Dim DateHh As Date 'date du passage à l'heure d'hiver
  
    DateHe = DateSerial(2024, 3, 31)
    DateHh = DateSerial(2024, 10, 28)
    If vdate >= DateHe And vdate < DateHh Then
        He = TimeSerial(2, 0, 0)
    Else
        He = TimeSerial(1, 0, 0)
    End If
  
    A = Year(vdate)...

vgendron

XLDnaute Barbatruc
Bonjour

déjà, dans la fonction Zenith, il y a une erreur pour calculer le nombre de jour depuis le début d'année
VB:
' Nombre de jours depuis le début de l'année
    n = vdate - DateSerial(A, 1, 1) + 1

ensuite, il faut peut etre mettre le format de ta cellule au format hh:mm:ss
mais la, ca donne un zenith le soir... comme quoi.. le soleil et la Bretagne...:-D
ou c'est juste que la formule n'est pas bonne non plus..?
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
J'ai fait une correction, mais pas mieux

VB:
'***********************************************
Function ZenithTime(ByVal Date_ As Date, ByVal Longitude As Double) As Double

            A = Year(Range("B1"))
            M = Month(Range("B1"))
            J = ActiveCell.Value
            vdate = DateSerial(A, M, J)

    ' Variables
    Dim n As Double ' Nombre de jours depuis le 1er janvier de l'année
    Dim B As Double ' Correction pour l'équation du temps
    Dim EoT As Double ' Équation du temps en minutes
    Dim SolarNoon As Double ' Midi solaire en heures

    ' Nombre de jours depuis le début de l'année
    n = vdate - DateSerial(A, 1, 1) + 1
   
    ' Calcul de l'équation du temps (EoT)
    B = (n - 81) * (360 / 365)
    EoT = 9.87 * Sin(2 * Application.WorksheetFunction.Radians(B)) - 7.53 * Cos(Application.WorksheetFunction.Radians(B)) - 1.5 * Sin(Application.WorksheetFunction.Radians(B))
   
    ' Calcul de l'heure du zénith solaire (en heures)
    SolarNoon = 12 + (4 * Longitude - EoT) / 60
    Debug.Print SolarNoon
   
    ' Retourner l'heure du zénith en heures décimales
    ZenithTime = SolarNoon
End Function

Sub testzenith()

Cells(20, 2) = ZenithTime(vdate, -3.36667) 'Longitude Lorient = -3.36667

End Sub
 

vgendron

XLDnaute Barbatruc
Regarde ici
VB:
Function ZenithTime(ByVal Date_ As Date, ByVal Longitude As Double) As Date
            Pi = WorksheetFunction.Pi()
            A = Year(Range("B1"))
            M = Month(Range("B1"))
            J = ActiveCell.Value
            vdate = DateSerial(A, M, J)

    ' Variables
    Dim n As Double ' Nombre de jours depuis le 1er janvier de l'année
    Dim B As Double ' Correction pour l'équation du temps
    Dim EoT As Double ' Équation du temps en minutes
    Dim SolarNoon As Double ' Midi solaire en heures

    ' Nombre de jours depuis le début de l'année
    n = vdate - DateSerial(A, 1, 1) + 1
    
    ' Calcul de l'équation du temps (EoT)
    'Source du calcul: https://www.techno-science.net/definition/6567.html
    
    B = (2 * Pi * (n - 81) / 364)
    EoT = -9.87 * Sin(2 * B) + 7.53 * Cos(B) + 1.5 * Sin(B)
    
    ' Calcul de l'heure du zénith solaire (en heures) 'c'est ici que ca doit coincer
    SolarNoon = 12 + (4 * Longitude + EoT) * 60 '/60 ?
    
    ' Retourner l'heure du zénith en heures décimales
    ZenithTime = Format(SolarNoon, "h:mm:ss")
End Function

Sub testzenith()
    Cells(20, 2) = ZenithTime(vdate, -3.36667)
End Sub
la fonction EoT me semble correcte
maintenant, c'est le SolarNoon, et les unités à vérifier
 

vgendron

XLDnaute Barbatruc
alors, voici ce que j'ai trouvé
à mon avis, il y a bien un pb d'unité
la correction donnée par l'EoT est en minutes
tout comme la correction due à la longitude

VB:
'***********************************************
Function ZenithTime(ByVal Date_ As Date, ByVal Longitude As Double) As Date
            Pi = WorksheetFunction.Pi()
            A = Year(Range("B1"))
            M = Month(Range("B1"))
            J = ActiveCell.Value
            vdate = DateSerial(A, M, J)

    ' Variables
    Dim n As Double ' Nombre de jours depuis le 1er janvier de l'année
    Dim B As Double ' Correction pour l'équation du temps
    Dim EoT As Double ' Équation du temps en minutes
    Dim SolarNoon As Double ' Midi solaire en heures

    ' Nombre de jours depuis le début de l'année
    n = vdate - DateSerial(A, 1, 1) + 1
    
    ' Calcul de l'équation du temps (EoT)
    'Source du calcul: https://www.techno-science.net/definition/6567.html
    
    B = (2 * Pi * (n - 81) / 364) 'pi est en radian ==> B est déjà en radian
    EoT = -9.87 * Sin(2 * B) + 7.53 * Cos(B) + 1.5 * Sin(B)
    
    ' Calcul de l'heure du zénith solaire (en heures) 'c'est ici que ca doit coincer
    SolarNoon = 12 + 4 * Longitude + EoT ' * 60 + EoT '* 60 '/60 ?
    
    'https://webetab.ac-bordeaux.fr/Pedagogie/Physique/TPE/midi.htm
    'HEURE LEGALE = HEURE SOLAIRE + CORRECTION LONGITUDE + 1 h (ou 2 l'été) + CORRECTION "EQUATION DU TEMPS"
    HS = TimeSerial(12, 0, 0)
    CL = TimeSerial(0, 4 * Longitude, 0)
    He = TimeSerial(2, 0, 0)
    
    HL = HS + CL + He + TimeSerial(0, EoT, 0)
    
    ' Retourner l'heure du zénith en heures décimales
    'ZenithTime = Format(SolarNoon, "h:mm:ss")
    ZenithTime = Format(HL, "hh:mm:ss")
End Function

à vérifier et confirmer sur plusieurs dates, et plusieurs positions..
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
re, merci du retour et de l'intérêt,
j'ai une bonne 1/2 heure de décalage
avec le code comme ça:

VB:
Function ZenithTime(ByVal Date_ As Date, ByVal longitude As Double) As Date

            Pi = WorksheetFunction.Pi()
            A = Year(Range("B1"))
            M = Month(Range("B1"))
            J = ActiveCell.Value
            vdate = DateSerial(A, M, J)
            
longitude = -3.36667 'Lorient

    ' Variables
    Dim n As Double ' Nombre de jours depuis le 1er janvier de l'année
    Dim B As Double ' Correction pour l'équation du temps
    Dim EoT As Double ' Équation du temps en minutes
    Dim SolarNoon As Double ' Midi solaire en heures

    ' Nombre de jours depuis le début de l'année
    n = vdate - DateSerial(A, 1, 1) + 1
    
    ' Calcul de l'équation du temps (EoT)
    'Source du calcul: https://www.techno-science.net/definition/6567.html
    
    B = (2 * Pi * (n - 81) / 364) 'pi est en radian ==> B est déjà en radian
    EoT = -9.87 * Sin(2 * B) + 7.53 * Cos(B) + 1.5 * Sin(B)
    
    ' Calcul de l'heure du zénith solaire (en heures) 'c'est ici que ca doit coincer
    SolarNoon = 12 + 4 * longitude + EoT ' * 60 + EoT '* 60 '/60 ?
    
    'https://webetab.ac-bordeaux.fr/Pedagogie/Physique/TPE/midi.htm
    'HEURE LEGALE = HEURE SOLAIRE + CORRECTION LONGITUDE + 1 h (ou 2 l'été) + CORRECTION "EQUATION DU TEMPS"
    HS = TimeSerial(12, 0, 0)
    CL = TimeSerial(0, 4 * longitude, 0)
    He = TimeSerial(2, 0, 0)
    
    HL = HS + CL + He + TimeSerial(0, EoT, 0)
    
    ' Retourner l'heure du zénith en heures décimales
    'ZenithTime = Format(SolarNoon, "h:mm:ss")
    ZenithTime = Format(HL, "hh:mm:ss")
End Function

Sub testzenith()

longitude = -3.36667

    Cells(20, 2) = ZenithTime(vdate, longitude)
    
End Sub

Et ce sur plusieurs dates.
 

vgendron

XLDnaute Barbatruc
bon, on doit pas utiliser la meme chose

1) le code de la fonction purgée des commentaires ET des calculs de vdate qui sont inutiles puisque la fonction est appelée avec une date...
VB:
Function ZenithTime(ByVal vdate As Date, ByVal Longitude As Double) As Date
    ' Variables
    Dim n As Double ' Nombre de jours depuis le 1er janvier de l'année
    Dim B As Double ' Correction pour l'équation du temps
    Dim EoT As Double ' Équation du temps en minutes
    Dim SolarNoon As Double ' Midi solaire en heures

    A = Year(vdate)
    Pi = WorksheetFunction.Pi()
    ' Nombre de jours depuis le début de l'année
    n = vdate - DateSerial(A, 1, 1) + 1
   
    ' Calcul de l'équation du temps (EoT)
    'Source du calcul: https://www.techno-science.net/definition/6567.html
   
    B = (2 * Pi * (n - 81) / 364) 'pi est en radian ==> B est déjà en radian
    EoT = -9.87 * Sin(2 * B) + 7.53 * Cos(B) + 1.5 * Sin(B)
   
    ' Calcul de l'heure du zénith solaire (en heures) 'c'est ici que ca doit coincer
    SolarNoon = 12 + 4 * Longitude + EoT  ' * 60 + EoT '* 60 '/60 ?
   
    'https://webetab.ac-bordeaux.fr/Pedagogie/Physique/TPE/midi.htm
    'HEURE LEGALE = HEURE SOLAIRE + CORRECTION LONGITUDE + 1 h (ou 2 l'été) + CORRECTION "EQUATION DU TEMPS"
    HS = TimeSerial(12, 0, 0)
    CL = TimeSerial(0, 4 * Longitude, 0)
    He = TimeSerial(2, 0, 0)
   
    HL = HS + CL + He + TimeSerial(0, EoT, 0)
   
    ' Retourner l'heure du zénith en heures
    ZenithTime = Format(HL, "hh:mm:ss")
End Function

Sub testzenith()
    MsgBox ZenithTime(DateSerial(2024, 8, 31), 3.36667)
End Sub

avec ca, j'ai le meme résultat que sur ton site: https://meteogram.fr/soleil/france/lorient/
à UNE minute près
 
Dernière édition:

piga25

XLDnaute Barbatruc
Bonjour,
Avec le calcul du jour Julien pour le 12 août 2024 j'ai 13:55
VB:
Function ZenithSolaire(Latitude As Double, Longitude As Double, DateChoisie As Date) As String
    Dim JourJulien As Double
    Dim T As Double
    Dim Déclinaison As Double
    Dim EquationTemps As Double
    Dim HeureLocale As Double
  
    ' Calcul du jour Julien
    JourJulien = DateChoisie + 2415018.5 + (TimeValue("12:00:00") / 24)
  
    ' Calcul du temps en siècles depuis J2000.0
    T = (JourJulien - 2451545#) / 36525
  
    ' Calcul de la déclinaison solaire (en radians)
    Déclinaison = 0.006918 - 0.399912 * Cos(T) + 0.070257 * Sin(T) - 0.006758 * Cos(2 * T) + 0.000907 * Sin(2 * T) - 0.002697 * Cos(3 * T) + 0.00148 * Sin(3 * T)
  
    ' Calcul de l'équation du temps (en minutes)
    EquationTemps = 229.18 * (0.000075 + 0.001868 * Cos(T) - 0.032077 * Sin(T) - 0.014615 * Cos(2 * T) - 0.040849 * Sin(2 * T))
  
    ' Calcul de l'heure locale du zénith solaire
    HeureLocale = 12 + Range("B3").Value + (Longitude / 15) - (EquationTemps / 60)
  
    ' Conversion de l'heure locale en heures et minutes
    Dim Heure As Integer
    Dim Minute As Integer
    Heure = Int(HeureLocale)
    Minute = Round((HeureLocale - Heure) * 60)
  
    ' Formatage de l'heure du zénith solaire en chaîne de caractères
    ZenithSolaire = Format(Heure, "00") & ":" & Format(Minute, "00")
End Function

Sub CalculerZenith()
    Dim Latitude As Double
    Dim Longitude As Double
    Dim DateChoisie As Date
    Dim HeureZenith As String
  
    ' Exemple de latitude et de longitude (Lorient, France)
    Latitude = 47.482524
    Longitude = -3.3702449
  
    ' Date choisie
    DateChoisie = Range("A2").Value 'DateValue("12/08/2024")
  
    ' Appel de la fonction
    HeureZenith = ZenithSolaire(Latitude, Longitude, DateChoisie)
  
    ' Affichage de l'heure du zénith
    Range("D2") = HeureZenith
    MsgBox "L'heure du zénith solaire le " & DateChoisie & " est à " & HeureZenith
End Sub
 

Pièces jointes

  • Heure Zénith.xlsm
    24.3 KB · Affichages: 5

Statistiques des forums

Discussions
313 865
Messages
2 103 078
Membres
108 521
dernier inscrit
manouba