Verstrichene Zeit

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Verstrichene Zeit

Re: Verstrichene Zeit

von mumpel » Mo, 04.08.2008 18:38

Danke für den Hinweis. Darüber kümmere ich mich zu gegebener Zeit. Jetzt muss ich erst einmal ein Konzept erstellen, um ein paar Wünsche von Anwendern einbauen zu können. Es soll möglich sein, für unterschiedliche Tageszeiten auch unterschiedliche Löhne berechnen zu können. Ist ja nicht schwehr, aber dauert eben.

Re: Verstrichene Zeit

von Stephan » Mo, 04.08.2008 18:10

Damit läuft das Makro zwar auch nicht schneller,[
Damit Dein Makro schneller läuft mußt Du versuchen den Code optimieren, beispielsweise ist es in Calc, im Vergleich zu Excel, absolut zeitfressend direkt durch Tabellenzellen zu interieren, diese sollten möglichst erst in ein Array gelesen werden.

Zur Verdeutlichung 2 kurze Beispiele, die beide dassselbe tun, wobei das schnelle Makro <1 Sekunde braucht, das langsame hingegen 16 Sekunden.

Code: Alles auswählen

Sub langsam()
For i = 1 To 10000
	ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A"&i).Value = i
Next i
End Sub

Code: Alles auswählen

Sub schnell()
x = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A1:A10000")
Dim daten()
Dim z()
daten() = x.getDataArray()
For i = LBound(daten()) To UBound(daten())
	z() = daten(i)
	For j = LBound(z()) To UBound(z())
		z(j) = i
	Next
Next
x.setDataArray(daten())
End Sub

In diese Dinge mußt Du Dich einfach einmal einarbeiten, beispielsweise das Dokument von Pitonyak enthält Code zu get/set DataArray. Ingesamt gehört natürlich zur Codeoptimierung auch immer etwas Erfahrung.
So große Zeiteinsparungen wie oben kriegst Du nicht immer aber bei halbwegs komplexen Calc-Tabellen ist eine Beschleunigung um Faktor 6-8 meist drin.



Gruß
Stephan

Re: Verstrichene Zeit

von mumpel » Mo, 04.08.2008 15:27

Problem gelöst. Habe jetzt beide Schleifen zusammengeführt. Somit ist nur noch eine Schleife vorhanden. Damit läuft das Makro zwar auch nicht schneller, aber man braucht es in der Regel ohnehin nur einmal im Jahr (am Jahresanfang). Danke nochmal an alle Helfer!

Re: Verstrichene Zeit

von mumpel » So, 03.08.2008 22:36

Mir ist gerade eingefallen, dass ich eine Schleife zuviel habe. Ich prüfe in zwei Schleifen jeweils eine Spalte. Das ist aber unsinnig. Wenn das Datum in Spalte B stimmt, dann stimmt es auch in Spalte AC, da beide Spalten im Inhalt identisch sind und auch jeweils in der selben Zeile stehen. Also genügt es doch, wenn ich nur die Spalte B prüfe und bei Übereinstimmung Spalte B und Spalte AC gleichzeit einfärbe. Da habe ich mir wieder zuviel Arbeit gemacht.

Re: Verstrichene Zeit

von Stephan » So, 03.08.2008 21:59

Vielleicht durch addieren der Zeiten am Ende des Makros?
Es wird in meinem Beispiel einmal der momentane Zeitwert ermittelt und a2 zugewiesen restliche Werte sind immer die Differenz zu a2, auch in 2 Schleifen.




Gruß
Stephan
Dateianhänge
Arbeitszeitberechnung_ODS-a.ods
(338.04 KiB) 95-mal heruntergeladen

Re: Verstrichene Zeit

von mumpel » So, 03.08.2008 21:25

Mit einer Schleife funktioniert es. Da ich aber zwei separate Schleifen habe, muss ich versuchen, die Zeiten für beide Schleifen in ein Label zu bringen. Vielleicht durch addieren der Zeiten am Ende des Makros?

Re: Verstrichene Zeit

von Stephan » So, 03.08.2008 21:02

Ich habe schon befürchtet, dass das nicht möglich oder zumindest sehr schwierig umzusetzen ist.[/[uote]
Es ist schlicht eine Frage der gewünschten Genauigkeit, wenns nicht milisekundengenau sein muß reicht es doch Timer bei jedem Schleifendurchlauf einmalig aufzurufen.
Da Du sinnigerweise hier eine Datei mit geschütztem Code hochlädtst habe ich eine Demo in Jürgens Datei eingebaut.


Gruß
Stephan
Dateianhänge
Timer_II.ods
(10.72 KiB) 103-mal heruntergeladen

Re: Verstrichene Zeit

von mumpel » So, 03.08.2008 20:38

turtle47 hat geschrieben: Vor der "lbrZeiten" steht einer und sagt "Hier kommst Du net rein" :lol:
PN unterwegs. Kennwort bitte geheimhalten!

Re: Verstrichene Zeit

von turtle47 » So, 03.08.2008 20:25

Den Startbutton zu Einfärben würde ich nach dem Start auch deaktivieren. Denn wenn man diese mittendrinn nochmals betätigt fängt das Einfärben wiede von vorne an!

Vor der "lbrZeiten" steht einer und sagt "Hier kommst Du net rein" :lol:

Re: Verstrichene Zeit

von Stephan » So, 03.08.2008 20:01

Dann hat derjenige, der das Beispiel in der Onlinehilfe erstellt hat da was nicht mitbekommen denn
der Beispielcode hat einen gravierenden Fehler.
Tschuldigung, nur ganz offensichtlich reden wir über völlig unterschiedliche Dinge.
Ich bezog mich darauf das Kenntnisse über Timer oder StarBasic nicht nötg sind wenn wenn über grundlegende Programmierkenntnisse (z.B. in VBA) verfügt und die aufgabe heißt aus einer beliebig erzeugten Ganzzahl (Timer liefert eine solche, sie kann aber genausogut aus einer Tabellenzelle, oder aus manueller Eingabe poder... stammen) den durc h 60 teilbaren Teil zu ermitteln und vom Rest abzutennen.
Sofern die Ganzzahl nicht größer ist wie 3600 (entspricht dem Gewünschten das René sagte ein Makro würde nur Minuten und Sekundenanzeige brauchen) geht das z,B, so, egal ob die Zahl von Timer stammt:

Code: Alles auswählen

'beliebige Ganzzahl:
x = 1234

r = x Mod 60
y = (x - r)/60

Msgbox y & " Minuten und " &  r & " Sekunden"
Beim Überschreiten der 30-Sekundenmarke wird bei >Timer> einfach eine Minute hinzugezählt.
das kann ich nicht nachvollziehen, wenn ich nun bereits zum zweiten Mal in diesem Tread darauf verweise das die Rückgabe von Timer an eine Variable erfolgen sollte die vorher als Long deklariert wurde.
Zum bequemen Ausprobieren ändere einfach das eine der Makros Deiner Beispieldatei wie folgt:

Code: Alles auswählen

Sub MyTimer
myctrl = myDlg.getControl("Label1")	
Dim a2 As long
	a2 = Timer
	myStatus = 0
	While True

	myctrl.Text = "Verstrichene Zeit: " & Timer-a2

	if MyStatus = 1 Then
	goto Ende
	End if
	wait 1000
	Wend
	Ende:
	myDlg.endexecute
end sub
und die SEkunden werden als einfache Zahl fortlaufend hochgezählt, ich zumindest sehe keinen Sprung beim .


Das hingegen Time und Timer die gleiche Rückgabe liefern davon war nirgens die Rede, auch:
(Jürgen machts jetzt etwas anders indem er Time statt Timer verwendet)
sagt das nicht, sondern sollte nur kennzeichnen das ich mir das Ganze angeschaut hatte und mitbekommen das Du Timer nicht verwendest.


Gruß
Stephan

Re: Verstrichene Zeit

von mumpel » So, 03.08.2008 19:49

turtle47 hat geschrieben:
Bei Dir sind es ja schon 3 Subs die parallel laufen sollen.
1. Sub Timer.
2. Sub ProgressBar
3. Sub Einfärben
Nicht ganz. Sub Einfaerben wird doch nur einmal zum Öffnen des Dialogs ausgeführt. Wenn der Dialog geöffnet wurde, ist diese Sub doch schon beendet. Also sind es zwei Prozeduren. Mir ist natürlich bekannt, dass immer nur eine Prozedur laufen kann (ist in MSO nicht anders). Die nächste Sub startet erst mit einem Klick auf die Schaltfläche. Die Progressbar selber ist in dem "Färbemakro" eingebaut. Das funktioniert auch fehlerfrei. Jetzt wollte ich eigentlich noch eine Zeitanzeige zusätzlich zur Prozentanzeige, auch wenn es nicht zwingend erforderlich ist. Ich habe schon befürchtet, dass das nicht möglich oder zumindest sehr schwierig umzusetzen ist.

Hier die Datei, um welche es geht: Arbeitszeitberechnung_ODS

Re: Verstrichene Zeit

von turtle47 » So, 03.08.2008 19:35

Auaaaaa, vor den Kopfhau.
Das geht, so glaube ich, alles so garnicht wie Du das vorhast.
Du musst alles in entsprechender Reihenfolge in eine Sub packen.

Warum?

Das ist ganz einfach.
Das Programm wird ja immer zeilenweise abgearbeitet.
Beispiel:
Start > Sub1 wird abgearbeitet bis Zeile 5 wo Sub2 aufgerufen wird.
Sub2 wird bis zum Ende abgearbeitet und es erfolgt der RücKsprung in Zeile 6 der Sub1.
Sub1 wird weiter bis zum Ende abgearbeitet.
Zwei oder mehr Subs parallel abarbeiten ist nicht möglich. :(

Bei Dir sind es ja schon 3 Subs die parallel laufen sollen.
1. Sub Timer
2. Sub ProgressBar
3. Sub Einfärben

Alles klar?

Re: Verstrichene Zeit

von mumpel » So, 03.08.2008 19:02

Bei Deinem Beispiel werden die Zeit und das Makro sofort gestartet. Genau das kann ich nicht nutzen, da das Makro nicht sofort ausgeführt werden soll. Erst wird der Dialog aufgerufen. Dann hat der Anwender die Möglichkeit abzubrechen oder das Makro auszuführen (Schaltfläche Feiertage und Wochenenden jetzt einfärben). Nur wenn das Makro ausgeführt werden soll, dann soll auch der Timer starten. Setvisible funktioniert bei mir nicht.
Dialog01.jpg
Dialog01.jpg (72.03 KiB) 3301 mal betrachtet
Das Dialog-aufrufende Makro:

Code: Alles auswählen

Sub Faerben
Dialoglibraries.Loadlibrary("lbrZeiten")
MyDlg= CreateUnoDialog(Dialoglibraries.lbrZeiten.Einfaerben)
MyDlg.execute()
End Sub
Wenn ich jetzt setvisible nutze, dann wird der Dialog gleich wieder geschlossen.

Re: Verstrichene Zeit

von turtle47 » So, 03.08.2008 18:28

Hallo Zusammen,
Stephan hat geschrieben:Auch hat das alles (Umformung und Anzeige einer bekannten Rückgabe einer Funktion) nicht mit StarBasic-Spezialkenntnissen zu tun, sondern ist allgemeines Grundwissen für jede Art der Programmierung (z.B. auch VBA) (z.B. auch VBA)
Dann hat derjenige, der das Beispiel in der Onlinehilfe erstellt hat da was nicht mitbekommen denn
der Beispielcode hat einen gravierenden Fehler.
Am Anfang zeigen beide die gleiche Zeit an.
Timer1.jpg
Timer1.jpg (5.62 KiB) 3309 mal betrachtet
Aber dann:
Timer2.jpg
Timer2.jpg (5.63 KiB) 3309 mal betrachtet
Beim Überschreiten der 30-Sekundenmarke wird bei >Timer> einfach eine Minute hinzugezählt.
Genau so wie bei Überschreiten der 30-Minutenmarke wird vorne bei Stunde eine Stunde dazuaddiert. :shock:

So, und jetzt Zu Deinem Code Mumpel.
Wenn in dem Dialog direkt etwas ausgeführt werden soll, dann kann man diesen nicht mit

Code: Alles auswählen

myDlg.execute
aufrufen, sondern mit:

Code: Alles auswählen

myDlg.setvisible(True)
Das ist auch in dem Beispiel mit der Progressbar so. :o
Also versuche mal folgenden Datei:
Timer_Neu.ods
(10.3 KiB) 123-mal heruntergeladen
Übrigens ist das

Code: Alles auswählen

Wait 1000
dafür da um die Prozessorauslastung zu mindern.
Wenn man das "Wait 1000" rausnimmt steigt bei mir die Auslastung direkt auf 100% an!

Kommst Du jetzt damit weiter?

Jürgen

Re: Verstrichene Zeit

von mumpel » So, 03.08.2008 14:01

Habe das Beispiel von Jürgen mal ausprobiert und angepasst.

Code: Alles auswählen

c2 = c1 &   trim(Str(Minute(daDT))) & " Minuten " & trim(Str(Second(daDT))) & " Sekunden"
Ich schaffe es aber nicht, dieses in meinen Code einzubauen. Ich habe bereits zwei For I-Schleifen in meinem Makro. Entweder wird nur der Timer ausgeführt oder meine Schleifen.

Codeauszug:

Code: Alles auswählen

Sub Week_day
ThisComponent.Sheets(0).Unprotect(Kennwort")
    lblNext= MyDlg.getControl("Label1")
    lblNext.Model.Label="Bitte warten...."
   
    lblNext.Model.TextColor=RGB(255,0,0)
    cmdNext = MyDlg.getControl("CommandButton1")
    cmdNext.Model.Enabled = False
    myctrl=myDlg.getControl("ProgressBar1")
   'Festsetzen des Maximalwertes
    myctrl.model.ProgressValueMax=742
Dim i as Long
Rem Hier beginnt Schleife 1 für Spalte B 
For i= 11 to 742
    lblNext= MyDlg.getControl("Label3")
    lblNext.Model.Label= Format((i-11)/7.31, 0) & " % fertiggestellt"
If      Weekday(ThisComponent.Sheets(0).GetCellByPosition(1,i).value, vbMonday) = 1 Then
        ThisComponent.Sheets(0).GetCellByPosition(1,i).setPropertyValue( "CharColor", RGB(255,0,0) )
ElseIf  Weekday(ThisComponent.Sheets(0).GetCellByPosition(1,i).value, vbMonday) = 7 Then
          ThisComponent.Sheets(0).GetCellByPosition(1,i).setPropertyValue( "CharColor", RGB(0,0,255) )
ElseIf  ThisComponent.Sheets(0).GetCellByPosition(1,i).Value = ThisComponent.Sheets(3).GetCellRangeByName("A1").Value Then
          ThisComponent.Sheets(0).GetCellByPosition(1,i).setPropertyValue(  "CharColor", RGB(255,0,0) )
          ThisComponent.Sheets(0).GetCellByPosition(22,i).STRING = "F"
ElseIf  ThisComponent.Sheets(0).GetCellByPosition(1,i).Value = ThisComponent.Sheets(3).GetCellRangeByName("A2").Value Then
          ThisComponent.Sheets(0).GetCellByPosition(1,i).setPropertyValue(  "CharColor", RGB(255,0,0) )
          ThisComponent.Sheets(0).GetCellByPosition(22,i).STRING = "F"
End If
myctrl.value=i     
Next i
Rem Ende Schleife 1

Rem Hier beginnt Schleife 2 für Spalte AC    
myctrl=myDlg.getControl("ProgressBar2")
     'Festsetzen des Maximalwertes
      myctrl.model.ProgressValueMax=742
For i= 11 to 742
      lblNext= MyDlg.getControl("Label4")
      lblNext.Model.Label= Format((i-11)/7.31, 0) & " % fertiggestellt"
If      Weekday(ThisComponent.Sheets(0).GetCellByPosition(28,i).value, vbMonday) = 1 Then
        ThisComponent.Sheets(0).GetCellByPosition(28,i).setPropertyValue( "CharColor", RGB(255,0,0) )
ElseIf  Weekday(ThisComponent.Sheets(0).GetCellByPosition(28,i).value, vbMonday) = 7 Then
          ThisComponent.Sheets(0).GetCellByPosition(28,i).setPropertyValue( "CharColor", RGB(0,0,255) )
ElseIf  ThisComponent.Sheets(0).GetCellByPosition(28,i).Value = ThisComponent.Sheets(3).GetCellRangeByName("A1").Value Then
          ThisComponent.Sheets(0).GetCellByPosition(28,i).setPropertyValue(  "CharColor", RGB(255,0,0) )
ElseIf  ThisComponent.Sheets(0).GetCellByPosition(28,i).Value = ThisComponent.Sheets(3).GetCellRangeByName("A2").Value Then
          ThisComponent.Sheets(0).GetCellByPosition(28,i).setPropertyValue(  "CharColor", RGB(255,0,0) )
End If
   myctrl.value=i     
   Next i 
Rem Ende Schleife 2

Rem Endprozedur
    Wait 2000
    mydlg.endexecute()
Exit Sub
Fehler:
MsgBox "Fehler"
ThisComponent.Sheets(0).Protect("Kennwort")
End Sub
Zusätzlich zur Prozentanzeige soll auch die verstrichene Zeit angezeigt werden.

Und was das allgemeine Grundwissen betrifft. Das kann man nur haben, wenn man es gelernt hat. Aber gerade das mit dem Timer habe ich nicht gelernt. Ich lerne eigentlich jeden Tag was neues. Bisher habe ich zum Umformen immer nur Format benutzt.

Nach oben