AW: Berechnung nach Uhrzeit
19.08.2006 22:34:33
ingUR
Hallo, @kalldy,
dass es da eine fertige Vorlagelösung für dieses Problem gibt, das kann ich mir gut vorstellen.
Allerdings wird diese Lösung wohl nur mit VBA-Kenntnis zu erarbeiten sein, wobei das vermeintliche Referenzwertproblem zu lösen, die einfachste Aufgabe ist, da wird einfach die erste festgestellte Quote der Meßreihe nach der Startzeit in eine Variable gesichert.
Eine Arbeitsmappe enthält zwei Schaltflächen vom Typ ComboButton, je einen zum Starten und zum Abbrechen, sowie in den Zellen C2 und D2 die Anfangs- und Enddatumsangaben incl. Uhrzeit (Format: dd.mm.yyyy hh:mm:ss, was intern als Doubletyp, also als Gleitpunktzahl mit doppelter Genauigkeit, bearbeitet wird und wo die Uhrzeit durch die Nachkommerstellen dargestellt wird).
Soblad die Einträge vorgenommen sind kann zu einem beliebigen Zeitpunkt der Start erfolgen. Hier wird dann eine Zeitbeobachtungsfunktion aufgerufen, die sich in vorgegebenem Intevall erneut aufruft (rekrusiver Aufruf).
Die Worksheet-Prozedur als Ereignisprozedur auf des Signal der Start- und Endchaltflächen, cbStart und cbEnde (könnten als Wechselschalter aufgebaut werden):
Private Sub cbStart_Click()
StartDatum=Range("C2")
EndeDatum=Range("D2")
StartValue=Range("A3") ''nur bei selbstgenerierter Testreihe
InitTimeWatch
end sub
Private Sub cbEnde_Click()
FineTimeWatch
end sub
Private Sub Worksheet_Change(ByVal Target As Range)
static RefQ as double, IsRefQ as boolean
If Not IsTestOn Then Exit Sub
If Not Target.Address = Range("A3").Address Then Exit Sub
'... Aufgaben, die nach dem eintreffen eines Meßwertes auszufühtren sind
If not IsRefQ then
RefQ=Range("A3").Value
IsRefQ=True
end If
Range("A4")=Range("A3")/RefQ
end sub
Eine Abbruchprozedur einer eventulle geöffenten Beobachtungsvorgabe sollte vor schließen der Mappe automatisch gelöscht werden. Für das Objekt "Diese Arbeitsmappe" ist das Ereignis "Before_Close" daher mit folgenden Aufruf zu belegen:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error resum Nest
Application.OnTime NextExecTime, "WatchTime", Schedule:=False
End Sub
Die Modulprozeduren InitTimeWatch, TimeWatch und FineTimeWatch enthalten die eigentlichen Aufgaben, die während der Testzeit zu Zeitüberwachung zu erledigen sind:
Public IsTestON as boolean
Public StartDatum as date, EndeDatum as Date
Dim NextExecTime as long
const TIntervall = "00:00:01"
'nur bei selbstgenerierter Testreihe
Public StartValue as double
const ChgP = 5
Public sub InitTimeWatch()
dim cNow as long
' andere Aufgaben vor dem tatsächlichen Start der Testreihe
cNow=Now
if cNow <= EndeDatum then
NextExecTime = iif(cNnow<StartDatum, StartDatum-int(StartDatum), cNow-int(cNow))
IsTestON = true
Application.OnTime NextExecTime, "TimeWatch"
end if
end sub
Public sub WatchTime()
if Now <= EndDatum and IsTestON then
'......... z.B Datengenerierung:
randomize
'nicht jeder Intervall-TimerAufruf führt zu einem neuen Wert
'hier sind es annähernd nur 2 pro 10sec.
if rnd()>0.8 then1
Range("A3")=Range("A3")*(1+sgn(0.5-rnd()*(ChgP*rnd()/100))
end if
NextExecTime=Now+TimeValue(TIntervall)
Application.Ontime NextExecTime, WatchTime
else
FineWatch
exit sub
end if
end sub
Public sub FineWatch
Application.Ontime NextExecTime, WatchTime, Schedule:=False
IsTestON=False
end if
Soweit die nicht getestete Grundidee zur Lösung Deiner Aufgabe. Mit der Konstantenanweisung const TIntervall = "00:00:01" wird während der Testzeit ein Intervall von einer Sekunde angegeben.
Ob dies jedoch für eine längeren Beobachtungszeit ein verwertbare Wert ist, müßten Tests ergeben, ggf. ist er bei längeren Zeiten zu Erhöhen, da der rekrusive Aufruf möglicherweise den Speicher in unzuläßigem Maße füllt.
Baut man in die Formel für die Datengenerierung noch die Berücksichtigung einer gewichteten Zufallsvariablen ein, z.B. (ChgP*F(rnd())/100)), so kann man z.B. Zufallsreihen mit Normalverteilungen simulieren. Wenn ich dazu Gelegenheit habe, dann suche ich die entsprechnde Mappe noch einmal, wo ich dieses für Aktienkursreihen bereits einmal umgesetzt hatte.
Da die gesamten Programmfragmente ohne VBA-Editor geschrieben wurde, kann es auch nicht mehr als eine Konzeptfassung eines Grundgerüstes sein. Ich hoffe dennoch, dass es als Startvorlage die entsprechenden Anregungen zum Finden der richtigen Lösung liefert.
Gruß,
Uwe