Zurück zur Homepage

Sonnenaufgang und Sonnenuntergang berechnen

Sie haben einen Kalender erstellt und wollen dort diese Zeiten eintragen?
Zwei Formeln und zwei benutzerdefinierte Funktionen machen das.
Eine kurze Erläuterung:
Wenn die Sonne am höchsten steht, ist Mittag! Und zwar 12:00 mittlere Ortszeit.
Leider stimmt diese Aussage nicht so ganz. Aus verschiedenen Grunden weicht die wahre Ortszeit von der mittleren Ortszeit ab. Die Abweichung liegt in der Größenordnung von +- 15 Minuten. Um das zu kompensieren, könnte man eine Liste mit den Abweichungen für jeden Tag benutzen. Das ist aber relativ aufwendig, also muss eine Zeitgleichung her. Im Internet findet man einige Algorithmen.
Weiterhin braucht man die Deklination der Sonne für den Stichtag. Im Prinzip ist die Deklination der Breitengrad, über dem die Sonne an diesem Tag zur Mittagszeit senkrecht steht.
Mit dem Länge- und Breitengrad des aktuellen Standorts, der Deklination und der Zeitabweichung kann man nun die Zeiten berechnen. Zu beachten ist, dass alle Winkel im Bogenmaß gebraucht werden.
Bei den benutzerdefinierten Funktionen, bei dem man übrigens die Funktion besser als bei den Formeln erkennen kann, kommt erschwerdend hinzu, dass VBA kein Arccos kennt. Das muss etwas mühsam nachgebildet werden.

Beispielmappe sonnenaufgang.zip 12 KB)
 

'Hier die Formeln zum Berechnen
'Sonnenaufgang (alles in eine Zeile)
=ToSommerWinterzeit($B$3+(12-(12*ARCCOS((SIN(-0,0145)-SIN($B$2*PI()/180)*
SIN(0,40954*SIN(0,0172*(($B$3-DATUM(JAHR($B$3);1;0))-79,35))))/
(COS($B$2*PI()/180)*COS(0,40954*SIN(0,0172*(($B$3-DATUM(JAHR($B$3);1;0))-79,35)))))/
PI())-(-0,1752*SIN(0,03343*($B$3-DATUM(JAHR($B$3);1;0))+0,5474)-
0,134*SIN(0,018234*($B$3-DATUM(JAHR($B$3);1;0))-0,1939))+(15-$B$1)*4/60)/24)

'Sonnenuntergang (alles in eine Zeile)
=ToSommerWinterzeit($B$3+(12+(12*ARCCOS((SIN(-0,0145)-SIN($B$2*PI()/180)*
SIN(0,40954*SIN(0,0172*(($B$3-DATUM(JAHR($B$3);1;0))-79,35))))/
(COS($B$2*PI()/180)*COS(0,40954*SIN(0,0172*(($B$3-DATUM(JAHR($B$3);1;0))-79,35)))))/
PI())-(-0,1752*SIN(0,03343*($B$3-DATUM(JAHR($B$3);1;0))+0,5474)
-0,134*SIN(0,018234*($B$3-DATUM(JAHR($B$3);1;0))-0,1939))+(15-$B$1)*4/60)/24)

'In B1 der Längengrad, In B2 der Breitengrad, in B3 das Datum.
'Die Zelle mit den Formeln wird als Datum/Zeit  formatiert
'Zum berücksichtigen der Sommerzeit dient folgende benutzerdefinierte Funktion:

Public Function ToSommerWinterzeit(DatumZeit As Date) As Date
  Dim Beginn As Date, Ende As Date, Jahr&
  Jahr = Year(DatumZeit)
  Beginn = DateSerial(Jahr, 4, 0) - (WeekDay( _
    DateSerial(Jahr, 4, 0), 2) Mod 7) + TimeSerial(1, 0, 0)
  Ende = DateSerial(Jahr, 11, 0) - (WeekDay( _
    DateSerial(Jahr, 11, 0), 2) Mod 7) + TimeSerial(1, 0, 0)
  If DatumZeit > Beginn And DatumZeit < Ende Then
    ToSommerWinterzeit = DatumZeit + TimeSerial(1, 0, 0)
  Else
    ToSommerWinterzeit = DatumZeit
  End If
End Function 

'Und hier nun als benutzerdefinierte Funktionen.

Public Function Sonnenaufgang( _
    Längengrad As Double, _
    Breitengrad As Double, _
    Datum As Date) As Date

Dim Deklination As Double, DiffWozMoz As Double
Dim Jahrestag As Double, H_aufgang As Double
Dim DiffMittag As Double, dummy As Double
Const Pi = 3.141592653
'Sonnenaufgang bei -50 Bogenminuten
H_aufgang = (-50 / 60) * Pi / 180
'Tag des Jahres
Jahrestag = Datum - DateSerial(Year(Datum), 1, 0)
Breitengrad = Breitengrad * Pi / 180
Längengrad = Längengrad * Pi / 180
'Breitengrad, über dem die Sonne Mittags senkrecht steht
Deklination = 0.40954 * Sin(0.0172 * (Jahrestag - 79.35))
'Differenz zum Mittag in Stunden berechnen
dummy = (Sin(H_aufgang) - Sin(Breitengrad) * Sin(Deklination)) _
    / (Cos(Breitengrad) * Cos(Deklination))
DiffMittag = 12 * (Atn((dummy * -1) / _
    Sqr(dummy * -1 * dummy + 1)) _
    + 2 * Atn(1)) / Pi
DiffWozMoz = -0.1752 * Sin(0.03343 * Jahrestag + 0.5474) _
    - 0.134 * Sin(0.018234 * Jahrestag - 0.1939)
Sonnenaufgang = (12 - DiffMittag - DiffWozMoz + _
    (15 - Längengrad * 180 / Pi) * 4 / 60) / 24
End Function


Public Function Sonnenuntergang( _
    Längengrad As Double, _
    Breitengrad As Double, _
    Datum As Date) As Date

Dim Deklination As Double, DiffWozMoz As Double
Dim Jahrestag As Double, H_aufgang As Double
Dim DiffMittag As Double, dummy As Double
Const Pi = 3.141592653
'Sonnenuntergang bei -50 Bogenminuten
H_aufgang = (-50 / 60) * Pi / 180
'Tag des Jahres
Jahrestag = Datum - DateSerial(Year(Datum), 1, 0)
Breitengrad = Breitengrad * Pi / 180
Längengrad = Längengrad * Pi / 180
'Breitengrad, über dem die Sonne Mittags senkrecht steht
Deklination = 0.40954 * Sin(0.0172 * (Jahrestag - 79.35))
'Differenz zum Mittag in Stunden berechnen
dummy = (Sin(H_aufgang) - Sin(Breitengrad) * Sin(Deklination)) _
    / (Cos(Breitengrad) * Cos(Deklination))
DiffMittag = 12 * (Atn((dummy * -1) / _
    Sqr(dummy * -1 * dummy + 1)) _
    + 2 * Atn(1)) / Pi
DiffWozMoz = -0.1752 * Sin(0.03343 * Jahrestag + 0.5474) _
    - 0.134 * Sin(0.018234 * Jahrestag - 0.1939)
Sonnenuntergang = (12 + DiffMittag - DiffWozMoz + _
    (15 - Längengrad * 180 / Pi) * 4 / 60) / 24
End Function