For next schleifen kombinieren und Summenbildung

Ich verzweifle
Gibt mir Min tatsächlich die Tagesminuten aus?
-12.00Uhr = 720 Tagesminuten
Gibt mir Tag, die Tage im Jahr aus?
-2.feb = 33.Tag im Jahr

-Ist meine dreifach-For-Next-schleife so daneben das man die Summe
aus C wirklich nicht herausbekommt?
Danke und Sorry

Hallo,

Ich kopier mal den bisherigen Syntax rein. Funktioniert für
einen
bestimmten Zeitpukt.

OK, sehen wir uns das mal an.

Option Explicit

Dim arMonat

Dim tmp As Double

bis hier her sieht das schon mal sehr kompliziert aus. Ob ich
da durchsteige? Ein wenig Ahnung von Astronomie wäre sicher
hilfreich, habe ich leider nicht. :frowning:

Private Sub Command2_Click()
If Ortsauswahl = „Konstanz“ Then
tbBreitengrad(1).Text = „47“
tbBreitenmin(5).Text = „40“
tbBreitensec(6).Text = „5“
tbLaengengrad(2).Text = „9“
tbLaengenmin(3).Text = „10“
tbLaengensec(4).Text = „11“
End If

If Ortsauswahl = „München“ Then
tbBreitengrad(1).Text = „48“
tbBreitenmin(5).Text = „8“
tbBreitensec(6).Text = „5“
tbLaengengrad(2).Text = „11“
tbLaengenmin(3).Text = „34“
tbLaengensec(4).Text = „11“
End If

If Ortsauswahl = „Stuttgart“ Then
tbBreitengrad(1).Text = „48“
tbBreitenmin(5).Text = „47“
tbBreitensec(6).Text = „12“
tbLaengengrad(2).Text = „9“
tbLaengenmin(3).Text = „11“
tbLaengensec(4).Text = „4“
End If

If Ortsauswahl = „New York“ Then
tbBreitengrad(1).Text = „40“
tbBreitenmin(5).Text = „43“
tbBreitensec(6).Text = „6“
tbLaengengrad(2).Text = „74“
tbLaengenmin(3).Text = „1“
tbLaengensec(4).Text = „15“
End If

If Ortsauswahl = „Berlin“ Then
tbBreitengrad(1).Text = „52“
tbBreitenmin(5).Text = „30“
tbBreitensec(6).Text = „0“
tbLaengengrad(2).Text = „13“
tbLaengenmin(3).Text = „20“
tbLaengensec(4).Text = „15“
End If
End Sub

Das sieht nicht gut aus. Das würde ich mit Arrays lösen.
ein Array ‚Ort()‘ könnte die Namen enthalten. Dann kannst Di
in ‚Form_Load‘ zuweisen:
Ort(0) = „Berlin“
und kannst dann den Index dem Namen zuordnen.
Damit kannst Du dann auch
Breitengrad(0)= 52 … oder … Breitengrad(0) = „52“
zuweisen.

Private Sub Form_Load()
'Ortsauswahl
Ortsauswahl.AddItem „Konstanz“
Ortsauswahl.AddItem „München“
Ortsauswahl.AddItem „Stuttgart“
Ortsauswahl.AddItem „New York“
Ortsauswahl.AddItem „Berlin“

in eine Liste? OK, dann …

For i = 0 to Ortsauswahl.ListCount -1
Ort(i) = Ortsauswahl.List(i)
Next

… und schon stehen die namen im Array. :smile:

'Zeit h
ZeitStd(0).AddItem „1“
ZeitStd(0).AddItem „2“
ZeitStd(0).AddItem „3“
ZeitStd(0).AddItem „4“
ZeitStd(0).AddItem „5“
ZeitStd(0).AddItem „6“
ZeitStd(0).AddItem „7“
ZeitStd(0).AddItem „8“
ZeitStd(0).AddItem „9“
ZeitStd(0).AddItem „10“
ZeitStd(0).AddItem „11“
ZeitStd(0).AddItem „12“
ZeitStd(0).AddItem „13“
ZeitStd(0).AddItem „14“
ZeitStd(0).AddItem „15“
ZeitStd(0).AddItem „16“
ZeitStd(0).AddItem „17“
ZeitStd(0).AddItem „18“
ZeitStd(0).AddItem „19“
ZeitStd(0).AddItem „20“
ZeitStd(0).AddItem „21“
ZeitStd(0).AddItem „22“
ZeitStd(0).AddItem „23“
ZeitStd(0).AddItem „24“

Oder …

For i = 1 to 24
ZeitStd(0).Additem i
Next

… das ist kürzer und übersichtlicher.

'Zeit min
ZeitMin(1).AddItem „0“
ZeitMin(1).AddItem „5“
ZeitMin(1).AddItem „10“
ZeitMin(1).AddItem „15“
ZeitMin(1).AddItem „20“
ZeitMin(1).AddItem „25“
ZeitMin(1).AddItem „30“
ZeitMin(1).AddItem „35“
ZeitMin(1).AddItem „40“
ZeitMin(1).AddItem „45“
ZeitMin(1).AddItem „50“
ZeitMin(1).AddItem „55“

Mit Step 5 ist das auch ein fall für eine Schleife.

'DatumTag
DatumTag.AddItem „1“
DatumTag.AddItem „2“
DatumTag.AddItem „3“
DatumTag.AddItem „4“
DatumTag.AddItem „5“
DatumTag.AddItem „6“
DatumTag.AddItem „7“
DatumTag.AddItem „8“
DatumTag.AddItem „9“
DatumTag.AddItem „10“
DatumTag.AddItem „11“
DatumTag.AddItem „12“
DatumTag.AddItem „13“
DatumTag.AddItem „14“
DatumTag.AddItem „15“
DatumTag.AddItem „16“
DatumTag.AddItem „17“
DatumTag.AddItem „18“
DatumTag.AddItem „19“
DatumTag.AddItem „20“
DatumTag.AddItem „21“
DatumTag.AddItem „22“
DatumTag.AddItem „23“
DatumTag.AddItem „24“
DatumTag.AddItem „25“
DatumTag.AddItem „26“
DatumTag.AddItem „27“
DatumTag.AddItem „28“
DatumTag.AddItem „29“
DatumTag.AddItem „30“
DatumTag.AddItem „31“
'DatumMonat
DatumMonat(3).AddItem „1“
DatumMonat(3).AddItem „2“
DatumMonat(3).AddItem „3“
DatumMonat(3).AddItem „4“
DatumMonat(3).AddItem „5“
DatumMonat(3).AddItem „6“
DatumMonat(3).AddItem „7“
DatumMonat(3).AddItem „8“
DatumMonat(3).AddItem „9“
DatumMonat(3).AddItem „10“
DatumMonat(3).AddItem „11“
DatumMonat(3).AddItem „12“

Und noch zwei Schleifen.

End Sub

Private Sub Command1_Click()

’ Einlesen der Textfelder
iDatumDay = DatumTag.Text
iBreitenGrad = tbBreitengrad(1).Text
iBreitenmin = tbBreitenmin(5).Text
iBreitensec = tbBreitensec(6).Text
iLaengenGrad = tbLaengengrad(2).Text
iLaengenmin = tbLaengenmin(3).Text
iLaengensec = tbLaengensec(4).Text
iDatumMonth = DatumMonat(3).Text
iUhrzeitStd = ZeitStd(0).Text
iUhrzeitMin = ZeitMin(1).Text
iNeigungswinkel = Neigung.Text
iAzimutwinkel = Azimut.Text
pi = 3.141592654

'Anpassung der Variablen
'Tag im Jahr
arMonat = Array(0, 31, 59, 90, 120, 151, 181, 212, 243,
273, 304,
334, 365)

Was ist das? Das kann so nicht stimmen! Einen so großen
Speicher hat Dein Computer nicht, daß er das verwalten kann.

Das bedeutet das der Monat Februar bei 31Tagen im Jahr anfängt, der
MOnat März bei 59 usw.
-es funktioniert aber!

Dim Array(10) as Byte

Verbraucht 10 Bytes Speicher.

Dim Array (10,10) As Byte verbraucht 10*10 = 100 Bytes
Speicher, das sind 100 Variablen in ein Array gepresst. Nun
sieh dir dein Array an, ich kann noch nicht mal schätzen, wie
viele Nullen die Zahl hat. :smile: Brauchst Du wirklich 1 * 10
hoch 99 Variablen oder noch mehr? Das kann nicht gut sein.

Den Rest verstehe ich nicht, kann ich nicht kommentieren.

Allgemein habe ich den Eindruck, daß du zu viel in den
Steuerelementen rechnst, statt in Variablen. Das macht das
Programm langsam. Schreib nur in Listen, was der Anwender
sehen soll. Zum rechnen sind Arrays besser, weil schneller.

Gruß, Rainer

Vielen Dank für die Tipps Rainer -Das hab ich wohl nicht so elegant
gelöst geb ich zu. Werde es auf jedenfall ändern.
Danke

Hallo Dominik,

Also die Function Minute gibt die den Minutenanteil aus einer Zeit zurueck. Schreibe mal Minute und druecke dann F1 in VB. da siehst du es :smile:
Auf deine Frage mit den 3 Schleifen. Warum willst du mit Kanonen auf Spatzen schiessen? Die Variante die ich dir gepostet habe, macht doch das was du möchtest. Obendrein ist sie sehr flexibel. Wenn du bei DateAdd anstatt n zum Bsp. „h“ schreibst, so macht er das nur für Stunden anstatt Minuten. Schaue dir dazu mal die Parameter an :smile:

So nun einmal zur Function :smile:

Wenn du in VB mit Datums Werten arbeitest, so verwaltet sie VB intern automatisch als Double. Ergo die Zahl vor dem Komma stellt das Datum dar und die Zahl nach dem Komma den Zeitanteil!
Dadurch ich das Datum einer Variablen D1 die als Double declariert ist zugewiesen haben, so steht der Wert nun Ordnungsgemaess da drinne. Nun beginne ich die Schleife ( Do Loop)
Du verarbeitest deine Daten. Der wert d1 wird wieder ins Datum geändert. Mit der Function Dateadd addiere ich nun 1 Minute dazu und wandle weise diesen Wert wieder der Variablen d1 zu. Das macht er nun solange bis das Enddatum erreicht ist :smile: Eigentlich ganz simple oder?
Das schoene an der Variante ist, das hierbei auch Schaltjahre etc. verwendet werden.
Auch ist diese Variante nicht Resourcen fressend wie deine :smile:

Doevents solltest du auf jeden Fall verwenden, damit du dem Rechner Pausenzeit gibst um so zum Bsp. Steuerelemente zu aktualisieren :smile:

Wenn du es jedoch mit den 3 Schleifen machen willst, so mache es wiefolgt

option explicit

Private xyz as Variant ' Typ und Variablennamen hier anpassen 

Private Sub Berechne()
dim i&
for i= .... ' 1 Schleife
 c=10 'Hier dein Wert C errechnen 
next i
xyz=c
for i=..... ' 2 Schleife
 c=10 ' Hier dein Wert C errechnen
next i
xyz=xyz+c
for i=..... ' 3 Schleife
 c=10 ' Hier dein Wert C errechnen
next i
xyz=xyz+c
end sub

Die Step Anweisung musst du nur hinschreiben wenn du einen Schritt >1 machen willst oder du willst rueckwaerts zaehlen. Gibst du nichts an so wird Step+1 verwendet.

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

arMonat = Array(0, 31, 59, 90, 120, 151, 181, 212, 243,
273, 304,
334, 365)

Was ist das? Das kann so nicht stimmen! Einen so großen
Speicher hat Dein Computer nicht, daß er das verwalten kann.

Das bedeutet das der Monat Februar bei 31Tagen im Jahr
anfängt, der
MOnat März bei 59 usw.
-es funktioniert aber!

komisch … na das ist dann wohl eien Funktion in VB, die ich noch nicht kenne. Ich arbeite seit Jahren damit und entdecke immer wieder Neues. :smile:

Das Problem würde ich aber entwerder so lösen …

Dim Tg(1 To 12) As Byte
Tg(1) = 0
Tg(2) = 31
'...
Tg(12) = 334

… was aber auch nicht so elegant aussieht. Oder eben mit Datediff ausrechnen, dann bekommt man auch kein Problem mit dem Schaltjahren. Laß VB doch mit dem Kalender rechnen, das kennt sich da aus.

Beispiel Oktober:

 Monat = "10"
 Tag = DateDiff("d", "01.01.2006", "01." & Monat & ".2006")

liefert die 273, die Du auflistetst. Für 2004 kommt aber 274 zurück, Schaltjahr. :smile:

Daß der Code in Deinem ersten Programm nicht elegant ist, ist doch normal, deshalb reden wir doch darüber, wie es besser geht.

Gruß, Rainer

Hallo Dominik,

welche Daten aus der Zeitzerlegung brauchst Du für Deine Berechnung?

Ich mach mal Pseudocode …

Private Sub Command1\_Click()
 Start = Text1.Text
 Ziel = Text2.Text
 For i = Start To Ziel
 'Werte berechner
 Berechnung 'Werte, die übergeben werden
 Next
End Sub

Private Sub Berechnung(Wert1 As Integer, Wert2 As String, Wert3 As Byte)
 'Deine Berechnung
End Sub

Was sollte da statt Wert1, Wert2 … Stehen? Beispielsweise Minuten seit Neujahr? Und in welchem Format? Die schleife hat Alex schon fertig und ruft Deine Berechnung für jede Minute zwischen Start und Ziel ein mal auf. Welche Werte an die Prozedur übergeben werden müssen, mußt Du uns sagen.

Gruß, Rainer

Hi Alex,
ich hab mich für die Kanonen entschieden.
Allerdings brauch ich nicht die Summe aus allen C sondern ich muß
jeden Wert von C fortlaufend in ein Array schreiben sonst fuktioniert
das mit der Summenbildung gar nich. -Ups!
Ich habe Dir den Syntax hier (damit Du die bisherigen Fehler auch
gleich siehst):

Option Explicit

Private Intensität As Variant

Private Sub Command1_Click()
Dim TagesminutenStart As Currency
Dim TagesminutenEnde As Currency
Dim TagImJahrStart As Currency
Dim TagImJahrEnde As Currency
Dim Tagesminuten&
Dim A As Currency
Dim B As Currency
Dim C As Currency
Dim D As Currency
Dim E As Currency
Dim TagImJahr&

’ Einlesen der Textfelder
TagesminutenStart = 550
TagesminutenEnde = 200
TagImJahrStart = 20
TagImJahrEnde = 120

'Schritt 1 (Erster Tag)
For Tagesminuten = TagesminutenStart To 1440 Step 1
A = Tagesminuten
B = TagImJahrStart
C = A + B
Next Tagesminuten
Intensität = C

'Schritt 2 (zweiter bis vorletzter Tag)
For TagImJahr = (TagImJahrStart + 1) To (TagImJahrEnde - 1) Step 1
For Tagesminuten = 1 To 1440 Step 1
A = Tagesminuten
B = TagImJahr
C = A + B
Next Tagesminuten
Next TagImJahr
Intensität = Intensität + C

'Schritt 3 (letzter Tag)
For Tagesminuten = 1 To TagesminutenEnde Step 1
A = Tagesminuten
B = TagImJahrEnde
C = A + B
Next Tagesminuten
Intensität = Intensität + C

'Schritt4 (Aufsummierte Sonnenenergie)
'Summe aller C aus Schritt 1-3
Text1.Text = Intensität

End Sub
Danke, Danke…

Hallo Rainer,
ich benötige für meine Rechnung Tagesminuten und Tage im Jar sprich
der Tag seit Anfang des Jahres. Aber ich verwende jetzt doch meinen
Kanonen-For-Next-dreifachschleifen-syntax
Danke
Dominik

Hallo Dominik,

du hattest aber gepostet das du die summe aller 3 Schleifen brauchst.

Nungut, dann ändere das mal wiefolgt

Private Intensität(2) as Currency

Nach der ersten Schleife dann
Intensität(0)=ccur©
Nach der zweiten Schleife
Intensität(1) =ccur©
Nach der 3 Schleife
Intensität(2)=ccur©

Um nun die Summe zu Bilden und text1 zuzuweisen mache das wiefolgt
Text1.text=Intensität(0)+Intensität(1)+Intensität(2)

Ich weiss ja nicht was du alles rechnest. Aber du weisst schon das Daten vom Typ Currency 64 Bit Zahlen und 8 Byte im Speicher belegen?

Ich hoffe das ich das nun richtig verstanden habe

MfG Alex

Hallo Dominik,

ich benötige für meine Rechnung Tagesminuten und Tage im Jar
sprich der Tag seit Anfang des Jahres.

OK, die Stelle habe ich gefunden.

Aber ich verwende jetzt doch meinen
Kanonen-For-Next-dreifachschleifen-syntax

*g* Und fertig geworden?
Ich habe mal die Berechnung der Zeitdifferenzen neu gemacht und Deine Prozedur für die Energieberechnung eingefügt.
Als Startzeitpunkt für die Berechnung habe ich zum Test den Startzeitpunkt des programms und als Ende der Schleife den Zeitpunkt des Klicks in die Liste mit den Städtenamen genommen. Das sieht dann so aus:

Option Explicit
Dim start As String
Dim jetzt As String
Dim idx As Integer
Dim Summe\_Strahlungsenergie As Double

Dim arMonat
Dim iBreitengr As Integer
Dim iBreitenGrad As Integer
Dim iBreitenmin As Integer
Dim iBreitensec As Integer
Dim iLaengengr As Integer
Dim iLaengenGrad As Integer
Dim iLaengenmin As Integer
Dim iLaengensec As Integer
Dim iDatumDay As Integer
Dim iDatumMonth As Integer
Dim iTagNr As Integer
Dim iUhrzeitStd As Integer
Dim iUhrzeitMin As Integer
Dim iTagesMin As Integer
Dim iNeigungswinkel As Integer
Dim iAzimutwinkel As Integer

Dim iDeklination As Double
Dim iZeitgleichung As Double
Dim iEinstrahlwinkel As Double
Dim PHI As Double
Dim iStrahlungsenergie As Integer
Dim iSonnenzeit As Double
Dim iStundenWinkel As Double
Dim iZeitdifferenz As Double
Dim iAufgangMez As Double
Dim iUntergangMez As Double
Dim arTageseinstrahlung(1, 24) As Integer 'Tageseinstrahlung Diagramm
Dim pi As Currency


Dim tmp As Double

Dim Breitengrad() As Integer
Dim Breitenmin() As Integer
Dim Breitensec() As Integer
Dim Laengengrad() As Integer
Dim Laengenmin() As Integer
Dim Laengensec() As Integer

Private Sub Form\_Load()
 start = Now

 Ortsauswahl.AddItem "Konstanz"
 Ortsauswahl.AddItem "München"
 Ortsauswahl.AddItem "Stuttgart"
 Ortsauswahl.AddItem "New York"
 Ortsauswahl.AddItem "Berlin"

 ReDim Breitengrad(0 To Ortsauswahl.ListCount - 1)
 ReDim Breitenmin(0 To Ortsauswahl.ListCount - 1)
 ReDim Breitensec(0 To Ortsauswahl.ListCount - 1)
 ReDim Laengengrad(0 To Ortsauswahl.ListCount - 1)
 ReDim Laengenmin(0 To Ortsauswahl.ListCount - 1)
 ReDim Laengensec(0 To Ortsauswahl.ListCount - 1)

 Breitengrad(0) = 47
 Breitenmin(0) = 40
 Breitensec(0) = 5
 Laengengrad(0) = 9
 Laengenmin(0) = 10
 Laengensec(0) = 11

 Breitengrad(0) = 48
 Breitenmin(0) = 8
 Breitensec(0) = 5
 Laengengrad(0) = 11
 Laengenmin(0) = 34
 Laengensec(0) = 11

 Breitengrad(0) = 48
 Breitenmin(0) = 47
 Breitensec(0) = 12
 Laengengrad(0) = 9
 Laengenmin(0) = 11
 Laengensec(0) = 4

 Breitengrad(0) = 40
 Breitenmin(0) = 43
 Breitensec(0) = 6
 Laengengrad(0) = 74
 Laengenmin(0) = 1
 Laengensec(0) = 15

 Breitengrad(0) = 52
 Breitenmin(0) = 30
 Breitensec(0) = 0
 Laengengrad(0) = 13
 Laengenmin(0) = 20
 Laengensec(0) = 15

 pi = 3.141592654

End Sub

Private Sub Ortsauswahl\_Click()
 Dim i As Integer
 Dim TageImJahr As Integer
 Dim MinutenAmTag As Long
 Dim tmp As String
 Dim Jahresanfang As String
 Dim Tagesanfang As String
 Summe\_Strahlungsenergie = 0
 idx = Ortsauswahl.ListIndex
 jetzt = Now
 For i = 0 To DateDiff("n", start, jetzt)
 tmp = DateAdd("n", i, start)
 Jahresanfang = tmp
 Tagesanfang = tmp
 Mid(Jahresanfang, 1, 5) = "01.01"
 Mid(Jahresanfang, 12, 8) = "00:00:00"
 Mid(Tagesanfang, 12, 8) = "00:00:00"
 TageImJahr = DateDiff("d", Jahresanfang, tmp)
 MinutenAmTag = DateDiff("n", Tagesanfang, tmp)
 Berechnung TageImJahr, MinutenAmTag
 Next
 Label1.Caption = Summe\_Strahlungsenergie
End Sub

Private Sub Berechnung(ByVal iTagNr As Integer, ByVal iSonnenzeit As Integer)
 'Deine Berechnung
 'Breitengrad
iBreitengr = Breitengrad(idx) + ((Breitenmin(idx) + (Breitensec(idx) / 60)) / 60)

'Laengengrad
iLaengengr = Laengengrad(idx) + ((Laengenmin(idx) + (Laengensec(idx) / 60)) / 60)

'Formeln - Deklination
tmp = 360 \* (pi / 180) \* ((284 + iTagNr) / 365)
iDeklination = ((23.45 \* (pi / 180)) \* Sin((tmp))) \* (180 / pi)

'Sonnenaufgang h = -50 Bogenminuten = -0.0145
'Zeitdifferenz
iZeitdifferenz = 12 \* ((Cos((Sin(-0.0145)) ^ -1) - Sin(0.9163) \* Sin(iDeklination)) / (Cos(0.9163) \* Cos(iDeklination))) / pi

'Zeitgleichung
tmp = ((iTagNr - 81) \* 0.989 \* (pi / 180))
iZeitgleichung = 9.87 \* Sin(2 \* tmp) - 7.53 \* Cos(tmp) - 1.5 \* Sin(tmp)

'MEZ in dezimal
iAufgangMez = (12 - iZeitdifferenz) + (15 - iLaengenGrad) \* 4 / 60

'Untergang MEZ in dezimal
iUntergangMez = (12 + iZeitdifferenz) - (15 - iLaengenGrad) \* 4 / 60

'Stundenwinkel
iStundenWinkel = 0.25 \* (720 - iSonnenzeit)

'Einstrahlwinkel
tmp = (pi / 180)

PHI = (Cos(iNeigungswinkel \* (tmp)) \* Sin(iBreitengr \* (tmp)) - \_
Cos(iBreitengr \* (tmp)) \* Cos(iAzimutwinkel \* (tmp)) \* \_
Sin(iNeigungswinkel \* (tmp))) \* Sin(iDeklination \* (tmp)) + \_
(Sin(iBreitengr \* (tmp)) \* Cos(iAzimutwinkel \* (tmp)) \* \_
Sin(iNeigungswinkel \* (tmp)) + Cos(iNeigungswinkel \* (tmp)) \* \_
Cos(iBreitengr \* (tmp))) \* Cos(iDeklination \* (tmp)) \* \_
Cos(iStundenWinkel \* (tmp)) + Sin(iAzimutwinkel \* (tmp)) \* \_
Sin(iNeigungswinkel \* (tmp)) \* Cos(iDeklination \* (tmp)) \* \_
Sin(iStundenWinkel \* (tmp))

iEinstrahlwinkel = ((PHI))

'Strahlungsenergie
iStrahlungsenergie = iEinstrahlwinkel \* 1357

'Ergebnis
'If (iStrahlungsenergie \> 0) Then
'tbErg.Text = iStrahlungsenergie
'Else
'tbErg.Text = iStrahlungsenergie

 'Das Ergebnis der einen Minute in ein Textfeld zu schreiben macht keinen Sinn,
 'deshalb ...
 
 Summe\_Strahlungsenergie = iStrahlungsenergie

End Sub

Wenn Du Probleme mit Deinem Code hast, kannst Du Dir den Vorschlag ja noch mal ansehen, bei mir rechnet das Programm. :smile: Keine Ahnung ob die Ergebnisse sinnvoll sind, das kann ich nicht beurteilen.

Gruß, Rainer

*g* Und fertig geworden?
Ich habe mal die Berechnung der Zeitdifferenzen neu gemacht
und Deine Prozedur für die Energieberechnung eingefügt.
Als Startzeitpunkt für die Berechnung habe ich zum Test den
Startzeitpunkt des programms und als Ende der Schleife den
Zeitpunkt des Klicks in die Liste mit den Städtenamen
genommen. Das sieht dann so aus:

Option Explicit
Dim start As String
Dim jetzt As String
Dim idx As Integer
Dim Summe_Strahlungsenergie As Double

Dim arMonat
Dim iBreitengr As Integer
Dim iBreitenGrad As Integer
Dim iBreitenmin As Integer
Dim iBreitensec As Integer
Dim iLaengengr As Integer
Dim iLaengenGrad As Integer
Dim iLaengenmin As Integer
Dim iLaengensec As Integer
Dim iDatumDay As Integer
Dim iDatumMonth As Integer
Dim iTagNr As Integer
Dim iUhrzeitStd As Integer
Dim iUhrzeitMin As Integer
Dim iTagesMin As Integer
Dim iNeigungswinkel As Integer
Dim iAzimutwinkel As Integer

Dim iDeklination As Double
Dim iZeitgleichung As Double
Dim iEinstrahlwinkel As Double
Dim PHI As Double
Dim iStrahlungsenergie As Integer
Dim iSonnenzeit As Double
Dim iStundenWinkel As Double
Dim iZeitdifferenz As Double
Dim iAufgangMez As Double
Dim iUntergangMez As Double
Dim arTageseinstrahlung(1, 24) As Integer 'Tageseinstrahlung
Diagramm
Dim pi As Currency

Dim tmp As Double

Dim Breitengrad() As Integer
Dim Breitenmin() As Integer
Dim Breitensec() As Integer
Dim Laengengrad() As Integer
Dim Laengenmin() As Integer
Dim Laengensec() As Integer

Private Sub Form_Load()
start = Now

Ortsauswahl.AddItem „Konstanz“
Ortsauswahl.AddItem „München“
Ortsauswahl.AddItem „Stuttgart“
Ortsauswahl.AddItem „New York“
Ortsauswahl.AddItem „Berlin“

ReDim Breitengrad(0 To Ortsauswahl.ListCount - 1)
ReDim Breitenmin(0 To Ortsauswahl.ListCount - 1)
ReDim Breitensec(0 To Ortsauswahl.ListCount - 1)
ReDim Laengengrad(0 To Ortsauswahl.ListCount - 1)
ReDim Laengenmin(0 To Ortsauswahl.ListCount - 1)
ReDim Laengensec(0 To Ortsauswahl.ListCount - 1)

Breitengrad(0) = 47
Breitenmin(0) = 40
Breitensec(0) = 5
Laengengrad(0) = 9
Laengenmin(0) = 10
Laengensec(0) = 11

Breitengrad(0) = 48
Breitenmin(0) = 8
Breitensec(0) = 5
Laengengrad(0) = 11
Laengenmin(0) = 34
Laengensec(0) = 11

Breitengrad(0) = 48
Breitenmin(0) = 47
Breitensec(0) = 12
Laengengrad(0) = 9
Laengenmin(0) = 11
Laengensec(0) = 4

Breitengrad(0) = 40
Breitenmin(0) = 43
Breitensec(0) = 6
Laengengrad(0) = 74
Laengenmin(0) = 1
Laengensec(0) = 15

Breitengrad(0) = 52
Breitenmin(0) = 30
Breitensec(0) = 0
Laengengrad(0) = 13
Laengenmin(0) = 20
Laengensec(0) = 15

pi = 3.141592654

End Sub

Private Sub Ortsauswahl_Click()
Dim i As Integer
Dim TageImJahr As Integer
Dim MinutenAmTag As Long
Dim tmp As String
Dim Jahresanfang As String
Dim Tagesanfang As String
Summe_Strahlungsenergie = 0
idx = Ortsauswahl.ListIndex
jetzt = Now
For i = 0 To DateDiff(„n“, start, jetzt)
tmp = DateAdd(„n“, i, start)
Jahresanfang = tmp
Tagesanfang = tmp
Mid(Jahresanfang, 1, 5) = „01.01“
Mid(Jahresanfang, 12, 8) = „00:00:00“
Mid(Tagesanfang, 12, 8) = „00:00:00“
TageImJahr = DateDiff(„d“, Jahresanfang, tmp)
MinutenAmTag = DateDiff(„n“, Tagesanfang, tmp)
Berechnung TageImJahr, MinutenAmTag
Next
Label1.Caption = Summe_Strahlungsenergie
End Sub

Private Sub Berechnung(ByVal iTagNr As Integer, ByVal
iSonnenzeit As Integer)
'Deine Berechnung
'Breitengrad
iBreitengr = Breitengrad(idx) + ((Breitenmin(idx) +
(Breitensec(idx) / 60)) / 60)

'Laengengrad
iLaengengr = Laengengrad(idx) + ((Laengenmin(idx) +
(Laengensec(idx) / 60)) / 60)

'Formeln - Deklination
tmp = 360 * (pi / 180) * ((284 + iTagNr) / 365)
iDeklination = ((23.45 * (pi / 180)) * Sin((tmp))) * (180 /
pi)

'Sonnenaufgang h = -50 Bogenminuten = -0.0145
'Zeitdifferenz
iZeitdifferenz = 12 * ((Cos((Sin(-0.0145)) ^ -1) - Sin(0.9163)
* Sin(iDeklination)) / (Cos(0.9163) * Cos(iDeklination))) / pi

'Zeitgleichung
tmp = ((iTagNr - 81) * 0.989 * (pi / 180))
iZeitgleichung = 9.87 * Sin(2 * tmp) - 7.53 * Cos(tmp) - 1.5 *
Sin(tmp)

'MEZ in dezimal
iAufgangMez = (12 - iZeitdifferenz) + (15 - iLaengenGrad) * 4
/ 60

'Untergang MEZ in dezimal
iUntergangMez = (12 + iZeitdifferenz) - (15 - iLaengenGrad) *
4 / 60

'Stundenwinkel
iStundenWinkel = 0.25 * (720 - iSonnenzeit)

'Einstrahlwinkel
tmp = (pi / 180)

PHI = (Cos(iNeigungswinkel * (tmp)) * Sin(iBreitengr * (tmp))

  • _
    Cos(iBreitengr * (tmp)) * Cos(iAzimutwinkel * (tmp)) * _
    Sin(iNeigungswinkel * (tmp))) * Sin(iDeklination * (tmp)) + _
    (Sin(iBreitengr * (tmp)) * Cos(iAzimutwinkel * (tmp)) * _
    Sin(iNeigungswinkel * (tmp)) + Cos(iNeigungswinkel * (tmp)) *
    _
    Cos(iBreitengr * (tmp))) * Cos(iDeklination * (tmp)) * _
    Cos(iStundenWinkel * (tmp)) + Sin(iAzimutwinkel * (tmp)) * _
    Sin(iNeigungswinkel * (tmp)) * Cos(iDeklination * (tmp)) * _
    Sin(iStundenWinkel * (tmp))

iEinstrahlwinkel = ((PHI))

'Strahlungsenergie
iStrahlungsenergie = iEinstrahlwinkel * 1357

'Ergebnis
'If (iStrahlungsenergie > 0) Then
'tbErg.Text = iStrahlungsenergie
'Else
'tbErg.Text = iStrahlungsenergie

'Das Ergebnis der einen Minute in ein Textfeld zu schreiben
macht keinen Sinn,
'deshalb …

Summe_Strahlungsenergie = iStrahlungsenergie

End Sub

Wenn Du Probleme mit Deinem Code hast, kannst Du Dir den
Vorschlag ja noch mal ansehen, bei mir rechnet das Programm.

-) Keine Ahnung ob die Ergebnisse sinnvoll sind, das kann ich

nicht beurteilen.

Gruß, Rainer

OK, setze mich jetzt gleich wieder dran. -Ich versuche gleich erstmal
die Daten aus meinen Schleifen der Reihe nach auszulesen. Mit Hilfe
des von Alex vorgeschlagenen Syntax. Falls es Dich interessiert, ich
versuche mit Hilfe der ausgelesenen Einzelpunkte und dem Abstand
(step) ein Trapez zu bilden und den Flächeninhalt der positiven
Trapeze aufzusummieren. -So bekomme ich dann die gesamte
Strahlungsenergie über die Zeit.
Vielen Dank für Deinen Vorschlag. Sobald ich wieder Luft habe oder
die erste Variante nicht funktioniert werde ich ihn mir genauer
anschauen.
-Also falls DU einen besseren (einfacheren) Vorschlag hast wie man
Daten fortlaufen aus FOR-NEXTSchlaufen liest -bitte posten.
Danke Rainer
Servus

Hi Dominik,

ich bin mir nicht sicher, ob Du mich richtig verstanden hast.

  • Mach ein neues Projekt.
  • Füge eine Listbox Für deine Städtenamen ein
  • Füge ein Label ein
  • Füge den Code ein

Sorge dann noch dafür, daß Du Start- und Endzeitpunkt angeben kannst und starte das Programm. Wenn ich Dich richtig verstanden habe, berechnet es Dir die Summe der Energieeinstrahlung. Die anderen Schleifen und Listen mit Stunden u.ä. sind überflüssig, das Programm könnte, wenn ich Dich richtig verstanden und keine Fehler gemacht habe schon fertig sein!

Das ist kein Codeschnipsel mehr, der Dir hilft, sondern schon fast Dein fertiges Programm!

Gruß, Rainer

OK Rainer, ich hab´s ausprobiert und das Programm läuft bei mir nicht
-Ich habe leider auch nicht verstanden was Du gemacht hast.
Ich muss jeden einzelnen Schritt begreifen damit meine Berechnung am
Ende passt. Deswegen kannst Du mir nicht bei meinem Totschläger-
Syntax helfen? Die Stückelung muss sein! Es fehlen nur noch wenige
Schritte!
—Also ich muss jedes einzelne Ergebnis (im untenstehenden Syntax C)
von jedem Step (in Schritt 1-3) fortlaufend weiterverarbeiten können!
Nämlich jedes positive C muß mit dem Step multipliziert werden.
(Stell Dir das so vor jedes C (Ergebnis einer Schlaufe pro step) ist
die momentane Strahlungsenergie und damit ein Punkt in einem XY-
Diagramm. Beim nächsten Step bekommt man den nächstenPunkt im
Diagramm (x-Wert=step, y-Wert=C). Verbindet man nun diese Punkte
ergibt sich eine Kurve im Diagramm. Um die Gesamtstrahlung
herauszubekommen braucht man die Fläche unter der Kurve. Und die
bekomme ich näherungsweise damit heraus das ich x und y multipliziere
-also step1*C1 + step2*C2 + step3*C3…)
Danke Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Dominik,

OK dann. :smile: Wenn’s denn sein muß … also Dein Code:

'Schritt 1 (Erster Tag)
For Tagesminuten = TagesminutenStart To 1440 Step 1
A = Tagesminuten
B = TagImJahrStart
C = A + B
Next Tagesminuten
Intensität = C

'Schritt 2 (zweiter bis vorletzter Tag)
For TagImJahr = (TagImJahrStart + 1) To (TagImJahrEnde - 1) Step 1
For Tagesminuten = 1 To 1440 Step 1
A = Tagesminuten
B = TagImJahr
C = A + B
Next Tagesminuten
Next TagImJahr
Intensität = Intensität + C

'Schritt 3 (letzter Tag)
For Tagesminuten = 1 To TagesminutenEnde Step 1
A = Tagesminuten
B = TagImJahrEnde
C = A + B
Next Tagesminuten
Intensität = Intensität + C

nun hast Du das Problem, daß Du immer wieder neu ‚C‘ berechnest, und den alten Wert überschreibst.
Warum heißen die dann alle ‚C‘ und nicht C1, C2 und C3? Dann kannst Du damit rechnen was Du willst und kannst am Ende
C = C1 + C2 + C3 rechnen.

'Schritt 1 (Erster Tag)
For Tagesminuten = TagesminutenStart To 1440 Step 1
A = Tagesminuten
B = TagImJahrStart
C1 = A + B
Next Tagesminuten


'Schritt 2 (zweiter bis vorletzter Tag)
For TagImJahr = (TagImJahrStart + 1) To (TagImJahrEnde - 1) Step 1
For Tagesminuten = 1 To 1440 Step 1
A = Tagesminuten
B = TagImJahr
C2 = A + B
Next Tagesminuten
Next TagImJahr


'Schritt 3 (letzter Tag)
For Tagesminuten = 1 To TagesminutenEnde Step 1
A = Tagesminuten
B = TagImJahrEnde
C2 = A + B
Next Tagesminuten

Intensität = C1 + C2 + C3

So kannst Du zwischendurch auch noch C1 … C3 multiplizieren, womit Du möchtest und der Code bleibt übersichtlich.

Gruß, Rainer

Mach mir doch bitte ein riesen Gefallen und füge Dein VOrschlag
direkt in den Syntax ein das ist für Dich warscheinlich kein größerer
Aufwand als „füge… nach der 1.Schleife ein“ zu schreiben und ich
versehe es besser.
Also jedes C soll mit step multipliziert werden. Und dann die Summe
aus jedem Schritt gebildet werden
also:
Text1.text=Summe aus allen (C*step)

Hier ist der Syntax:

Option Explicit

Private Sub Command1_Click()
Dim TagesminutenStart As Currency
Dim TagesminutenEnde As Currency
Dim TagImJahrStart As Currency
Dim TagImJahrEnde As Currency
Dim Tagesminuten&
Dim A As Currency
Dim B As Currency
Dim C As Currency
Dim D As Currency
Dim E As Currency
Dim TagImJahr&

’ Einlesen der Textfelder
TagesminutenStart = 550
TagesminutenEnde = 200
TagImJahrStart = 20
TagImJahrEnde = 120

'Schritt 1 (Erster Tag)
For Tagesminuten = TagesminutenStart To 1440 Step 1
A = Tagesminuten
B = TagImJahrStart
C = A + B
Next Tagesminuten

'Schritt 2 (zweiter bis vorletzter Tag)
For TagImJahr = (TagImJahrStart + 1) To (TagImJahrEnde - 1) Step 1
For Tagesminuten = 1 To 1440 Step 1
A = Tagesminuten
B = TagImJahr
C = A + B
Next Tagesminuten
Next TagImJahr

'Schritt 3 (letzter Tag)
For Tagesminuten = 1 To TagesminutenEnde Step 1
A = Tagesminuten
B = TagImJahrEnde
C = A + B
Next Tagesminuten

'Schritt4 (Aufsummierte Sonnenenergie)
'Summe aller C aus Schritt 1-3
Text1.Text = Intensität

End Sub

Danke

OK wir haben vorhin parallel geschrieben. -Egal
Ja, ich bekomme jetzt C1+C2+C3 die Summe aus dem Ende jeder Schleife!
Konkret: Wie lautet der Befehl die Zahl C1 für jeden step in eine
Gleichung einzusetzen???
–Für jeden step?
Danke

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Dominik,

Du willst mit Step multiplizieren? Du meinst mit dem Wert, den Du da hin schreibst, weil der nicht immer 1 bleiben soll? Denn mit 1 zu multiplizieren ist ja Unfug. Mal sehen, ob ich Dich jetzt richtig verstanden habe …

Option Explicit

Private Sub Command1\_Click()
Dim TagesminutenStart As Currency
Dim TagesminutenEnde As Currency
Dim TagImJahrStart As Currency
Dim TagImJahrEnde As Currency
Dim Tagesminuten&
Dim A As Currency
Dim B As Currency
Dim C As Currency
Dim D As Currency
Dim E As Currency
Dim TagImJahr&

' Einlesen der Textfelder
TagesminutenStart = 550
TagesminutenEnde = 200
TagImJahrStart = 20
TagImJahrEnde = 120

'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
 'Du willst mit 'Step' multiplizieren, dann muß
 'da eine Variable rein
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

Dim Schritt As Byte
Schritt = 1 'das möchtest Du variieren, richtig?
 'Sonst ist es überflüssig.

'Schritt 1 (Erster Tag)
For Tagesminuten = TagesminutenStart To 1440 Step Schritt
A = Tagesminuten
B = TagImJahrStart
C = A + B
intensität = intensität + C \* Schritt
Next Tagesminuten

'Schritt 2 (zweiter bis vorletzter Tag)
For TagImJahr = (TagImJahrStart + 1) To (TagImJahrEnde - 1) Step Schritt
For Tagesminuten = 1 To 1440 Step 1
A = Tagesminuten
B = TagImJahr
C = A + B
intensität = intensität + C \* Schritt
Next Tagesminuten
Next TagImJahr

'Schritt 3 (letzter Tag)
For Tagesminuten = 1 To TagesminutenEnde Step Schritt
A = Tagesminuten
B = TagImJahrEnde
C = A + B
intensität = intensität + C \* Schritt
Next Tagesminuten

'Schritt4 (Aufsummierte Sonnenenergie)
'Summe aller C aus Schritt 1-3
Text1.Text = intensität

End Sub

Noch eine Kleinigkeit, poste Code doch bitte mit Tag, das ist dann leichter zu lesen.

Gruß, Rainer

Gegeben:
Uhzeit erster Tag in Tagesminuten =>> TagesminutenStart
Uhrzeit letzter Tag in Tagesminuten =>> TagesminutenEnde
Datum erster Tag in Tagen im Jahr =>> TagImJahrStart
Datum letzter Tag in Tagen im Jahr =>> TagImJahrEnde
Anzahl der Tage in Tagen =>> Tagesdifferenz
Ein Tag = 1440 Minuten
Gesucht:
Aufsummierte Sonnenenergie zwischen zwei Zeitpunkten

Hi Dominik,
ich habe jetzt nicht alle Beiträge gelesen, ist das Problmem gelöst?
Wenn nicht, lade mal ne kleine Beipieldatei wo du die Ergebnisse manuell berechnet hast hoch bei http://rapidshare.de/ o.ä. und poste hier den Link.
Gruß
Reinhard

Jaaaaaaaaaaaaaa, super jetzt bekomme ich eine gigantische Zahl raus.
-Das müsste stimmen.
Jetzt muss ich das noch in die echte Formel übertragen und ein MS-
Chart hinbekommen.
Ich informiere Dich
Danke Rainer

Hallo Dominik,

Jaaaaaaaaaaaaaa, super jetzt bekomme ich eine gigantische Zahl
raus.
-Das müsste stimmen.

Gut! :smile: Wenn Du lust hast, kannst Du Dir den anderen Code noch mal ansehen, der macht das Selbe wie Deiner, nur in einer einzigen Schleife und weniger kompliziert. :smile:

Jetzt muss ich das noch in die echte Formel übertragen und ein
MS- Chart hinbekommen.
Ich informiere Dich

OK, bis dann.

Gruß, Rainer

So, jetzt sollte ich noch ein MSChart für meine fornext Schleife
hinbekommen.
Was setze ich für die „?“ ein?
MSChart:
With MSChart1.DataGrid
.ColumnCount = 1
.RowCount = ?
.SetData ?, 1, Strahlungsenergie, false

Danke Dominik