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