Zeit aus drei Zahlen bilden

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi,

In Calc verwende ich die Funktion Zeit(a1;b1;c1) um in d1 die Zeit hh:mm:ss zu bekommen.Wobei die Spalten entsprechend formatiert sind.

Jetzt möchte ich das gleiche mit einem Makro erledigen. Zusätzlich möchte ich in e1 "hhmmss" als Zahl haben.
Leider habe ich noch nichts gefunden woraus ich den Gebrauch von Funktionen in Makro ershen kann..
Auf eure Hilfe warte ich gerne.

Grüße Ulrich
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Zeit aus drei Zahlen bilden

Beitrag von Stephan »

Leider habe ich noch nichts gefunden woraus ich den Gebrauch von Funktionen in Makro ershen kann..
siehe:
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig229

z.B.:

Code: Alles auswählen

Sub Main
oFunctionAccess = createUnoService( "com.sun.star.sheet.FunctionAccess" )
Dim args(2) As Variant
args(0) = 12
args(1) = 10
args(2) = 25
With ThisComponent.Sheets(0).getCellRangeByName("E1")
	.Value = oFunctionAccess.callFunction( "TIME", args())
	.NumberFormat = 41
End With
End Sub
Gruß
Stephan
ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Re: Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi Christian

Habe mir den Skript angepasst. er klappt mit "Zellen"- Angaben recht gut,
muss ihn aber noch auf Variable umstellen.
Donnenhöfer durchforste ich regelmäßig. Wobei ich immer wieder feststelle,
dass an entlegenen Stellen wichtig Details stehen. s.a. Dein Verweis

Grüße Ulrich
ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Re: Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi Christian

Nach dem ich auf Variable umgestellt habe kommt entweder Variable nicht deklariert (ich vermute:oZelle) wenn ich diese setze,
dann kommt oder "Exception" aufgetreten.
Hierzu ein Bild und meinen Code.
https://de.openoffice.info/download/fil ... c54bf399c7
REM ***** BASIC ***** Sub Zeit_In_Z ... h End Sub
der Fehler liegt bei "oZelle.Value = . . . .)
-----------------------------------------------------------------
Dann auch gleich noch die Frage: Wo finde ich etwas über "Spalten Formatieren . ."

Grüße Ulrich
Dateianhänge
2018-05-10 Exeption.PNG
2018-05-10 Exeption.PNG (55.63 KiB) 18737 mal betrachtet
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Zeit aus drei Zahlen bilden

Beitrag von balu »

Hallo Ulrich,

warum kannst Du nicht deinen Code so posten wie es Stephan gemacht hat? Es gibt dafür extra die CODE-Tags, der Button </> .

Zu deinem Problem.
Achte immer, und zwar AUSNAHMSLOS auf Tippfääähler.
Beispiel:
'Alfaa' ist nicht gleich 'alfa'.

Also schau dir deinen Code unter diesen Aspekt noch mal ganz genau an, und Du wirst sehen und verstehen was ich da gesagt habe.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Re: Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi Balu
Danke für den Hinweis. Hab selber schon gemerkt dass ich beim Schreiben Probleme bekomme. Ich schieb es auf mein Alter. Werd mir gleich noch mal dran geben und suchen.
Grüße Ulrich
ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Re: Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi Balu
Habe gerade mit :oops: :oops: :oops: alle Tippfehler gefunden. So was wird mir so schnell nicht mehr passieren.

Habe noch folgende Fragen:
1.) 41 ist sicherlich die Nummer für das Zeitformat. Wo finde ich info dazu.

2.) Wenn ich diese Sub aus eine übergeortneten Sub aufrufe, müssen dann auch alle Object-Variablen deklariert werden.

Da ich mit der Verwendung von Array ers anfange, folgende Frage:
3.) Wie kann ich aus dem inhalt eine Zahl machen. In diesem Fall 121025

Grüße Ulrich
ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Re: Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi Balu
Konnte meine Frage 1. selbst beantworten (Dannenhöfer 7.1.22) und auch lösen, d.h. vereinfachen.
Wobei ich dies aber noch nicht über Array's gelöst habe, sondern so:
nZeit = nStun *10000 + nMinu *100 + nSek .
Frage 2 steht noch offen !

Grüße Ulrich
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Zeit aus drei Zahlen bilden

Beitrag von balu »

Hallo Ulrich,
Habe gerade mit :oops: :oops: :oops: alle Tippfehler gefunden. So was wird mir so schnell nicht mehr passieren.
Vor so dummen und dämlichen Trip.. ööm.. Tippfehlern ist wahrlich keiner gefeilt. Das passiert schon mal, selbst einem erfahrenen Programmierer.

Wirklich schön das Du selbst ein paar Dinge selber lösen konntest.

3.) Wie kann ich aus dem inhalt eine Zahl machen. In diesem Fall 121025
So, und jetzt kommen wir zu dem Punkt, den ich nicht nachvollziehen kann.
Einerseits willst du mit der Funktion =ZEIT() arbeiten, aber anderseits willst Du eine durchgehende "Zahl" haben.
Optisch, aber wirklich auch nur rein Optisch, bekommt man das ja hin. Du kannst ja von Hand die Zelle so formatieren, das Du nur rein Optisch die "Zahl" 121025 zu Gesichte bekommst. Aber in der Zelle selber steht nun mal halt 12:10:25.
Wenn Du deine Optische Zahl 121025 z.B. in A1 stehen hast, und in B1 einfach das hier eingibst

Code: Alles auswählen

=A1+1
dann bekommst Du als Ergebnis in B1: 36:10:25 angezeigt.
Wenn man normalerweise eine 6 Stellige Zahl sieht, dann denkt man sich, das 121025 + 1 = 121026 ergibt, und nicht 36:10:25.

Ich persönlich finde die Idee also nicht gut, die Zelle so zu Formatieren, da ein Risiko mit Verwechselung besteht.

Jetzt gibt es wohl die Möglichkeit per Makro aus der Zeitangabe 12:10:25 die echte Zahl 121025 zu machen. Hier mal ein minimalistisches Beispiel.

Code: Alles auswählen

Sub Main
nStun_Zei = 12 
nMinnu_Zei = 10 
nSek_Zei = 25
Print nStun_Zei & nMinnu_Zei & nSek_Zei
End Sub
Aber das wäre dann eine Zahl (nach dem man die Verkettung mittels & in eine Zahl umgewandelt hat), und keine Zeitangebe mehr. Mit dieser Zahl kann man anschließend keine Berechnungen mehr durchführen, die mit Zeit zu tun haben.

Es ist mir also nicht ersichtlich, warum Du diese Optische Wandlung vornehmen willst.


Wenn dir das Risiko bewusst ist, und Du nur eine Optische Änderung machen willst, dann könnte dir dies kleine Makro behilflich sein.

Code: Alles auswählen

Sub Main
	myDoc = thisComponent
	mySheet = myDoc.sheets(0)
	mycell =  mysheet.getCellRangeByName("E1")
	mycell.NumberFormat=106 ' einstellen des Zellformats
  							' 106 ist gleich hhmmss
Print  mycell.NumberFormat ' anzeigen lassen welches Zellformat verwendet wird
End Sub
Um herauszufinden welches Format eine andere Zelle hat, setze vor der Zeile

Code: Alles auswählen

'	mycell.NumberFormat=106 ' einstellen des Zellformats
wie zu sehen ein Hochkomma.



Guts Nächtle
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Re: Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi Balu
Vielen Dank, dass du dir zu nächtlicher Stunde so eine große Mühe angetan hast.
Um mein Problem zu verstehen muß ich dir den Hintergrund erklären.
Ich zeichne meine Radtouren als GPX-Dateien auf. Diese verwende ich dann auch um gschossene Foto's mit GPX-Daten zu versehen.
Probleme gibt es, wenn die Aufzeichnung Lücken hat.
Diese werden mit Routenconverter.exe nachgezeichnet .Damit werden aber die folgenden Zeitangaben undgenau.
Dauher Berechne ich die Zeiten der Gpx neu. Wobei ich von markanten Punkten oder Pausen an der Route die vorhandenen Zeiten übernehme.
Die bearbeite GPX-Datei kann ich so ausdünnen, das die Punktdifferenzen 30 - 40 m betragen. Das heißt Längen- und Breitengrad durch den Punkt stehen senkrecht aufeinander. Hierzu https://www.kompf.de/gps/distcalc.html . Mit dee Routekonverter.exe speichere ich nun eine *.csv datei ab, die ich nun mit OO Calc öffnen kann. Länge und Breite raus kopieren und die Differenz je Zeile berechnen. Geht sehr schnell.
Aus den Punktdefferenzen wird nun mit einer "angenommenen" Geschwindigkeit die verflossene Zeit (m/v) in ss ermittelt.
Mein Makro rechnet nun aus dieser Zeitdiff. die ss, mm, hh hoch.Festpunkte mit Zeitangaben in Spalte E werden dabei berücksichtigt.
Die so gefüllten Spalten G,H,I werden nach dem Macro-Durchlauf in Spalte F mit der OO-Formel Zeit() als Zeit mit Format HH:MM:SS eingefügt.
Anschliessend mit kopieren/Inhalte nach D kopiert. Das Format bleibt aber Zeit HHMMSS.
Nachdem mir Steph den Hinweis auf das Macro von Dannenhöfer gegeben hat, die Spalte F zu füllen, habe ich dies in Makro mit Erfolg eingebaut.
Die wichtigste Erkenntnis war aber die Wirkung der Zeile

oZelle.Numberformat = 41.

Die bewirkt, dass das Zeitformat mit in die Zelle geschrieben wird.
Mit den 4 Zeilen habe ich jetzt sofort das, was der Routenconverter mir abnimmt ohne zu meckern. Eine Zahl

nZeit = nZeitStun *10000 +nZeitMinu *100 +nzeitSek

oZelle = oTabBlatt.getCellByPosition(3,x)
oZelle.NumberFormat = 0
oZelle.Value = nZeit

Übrig bleibt nun meine Frage 2.) Wenn ich diese Sub aus eine übergeortneten Sub aufrufe, müssen dann auch alle Object-Variablen deklariert werden.
Grüße Ulrich
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Zeit aus drei Zahlen bilden

Beitrag von balu »

Hallo Ulrich,

ja jetzt kann ich es schon etwas besser nachvollziehen was Du vor hast.

2.) Wenn ich diese Sub aus eine übergeortneten Sub aufrufe, müssen dann auch alle Object-Variablen deklariert werden.
Tja, wie soll ich es einfach sagen?
Jaien.

Es kommt auf die Situation drauf an.
Wenn nur in dieser Sub z.B. ein bestimmtes Tabellenblatt angesprochen wird, dann reicht es wenn die Variablen dort Lokal, also innerhalb der Sub, deklariert und definiert werden.

Wenn aber z.B. Werte, Texte oder ähnliches von einer Sub in die andere Sub übergeben werden sollen, dann muss die Variable, genauer gesagt der Variablenname Öffentlich deklariert werden.
Und öffentlich bedeutet, das die Variable als aller erstes ganz oben im Modul noch vor der ersten Sub deklariert werden muss. Die eigentliche definition der Variablen kann dann in der darauf folgenden oder erst in der 3 Sub geschehen.

Minimales Beispiel:
Normalerweise sieht ein neu angelegtes und unbeschriebenes Modul ja so aus.

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main

End Sub
In der aller ersten Zeile steht ja der Kommentar "REM ***** BASIC *****", die unbestraft gelöscht werden darf. Und das ist die Zeile ab der man anfängt Öffentlich zu deklarieren, was dann Beispielsweise wie folgt aussehen könnte.

Code: Alles auswählen

Dim oDok As Object, oMessen As Object, oDrucken As Object
Dim sTextUebergabe as String

Sub Erste_Routine

End Sub


Sub Zweite_Routine

End Sub
Nach dem so deklariert wurde, können in den folgenden Subs die Variablen definiert werden. Es gibt aber eine Regel die man beachten muss.
Wenn "Sub Erste_Routine" eine Variable zur Berechnung, oder ähnliches, an die "Sub Zweite_Routine" übergibt, dann muss die definition der Variable in der "Sub Erste_Routine" stattfinden. Oder aber halt auch anders herum.
Wichtig ist jedoch, das wenn eine Sub eine Variable an die andere Sub übergibt, das in der aufrufenden Sub die definition vollzogen wird, und erst dann in die andere Sub verzweigt werden darf.

Nehmen wir jetzt mal folgendes ganz einfaches Beispiel.
Angenommen Du arbeitest wohl mit mehreren Tabellenblättern, die aber nicht in jeder Sub Ver- beziehungsweise Bearbeitet werden, und ferner angenommen sei das die "Sub Erste_Routine" die Haupt-Sub ist die immer bei Aufruf des Makros ausgeführt wird, dann wäre folgendes Verfahren hilfreich (der Übersicht wegen).

In der Haupt-Sub werden alle Tabellenblätter definiert, auch selbst dann, wenn dort gar nicht auf ein Tabellenblatt zugegriffen wird.

Code: Alles auswählen

Dim oDok As Object, oMessen As Object, oDrucken As Object
Dim sTextUebergabe as String

Sub Erste_Routine
	oDok = ThisComponent
	oMessen = oDok.sheets.getByName("Messungen")
	oDrucken = oDok.sheets.getByName("MessWerte")
' tu irgendwas in und mit oDrucken
' rufe die Zweite_Routine auf
End Sub


Sub Zweite_Routine
oBs = oMessen.getCellRangeByName("A2:G2")
[...]
End Sub
Das wärs eigentlich im groben und ganzen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
ulko38
**
Beiträge: 29
Registriert: Do, 01.12.2016 10:56

Re: Zeit aus drei Zahlen bilden

Beitrag von ulko38 »

Hi Balu
Nochmals Danke für deine ausfürliche Erklärung
Einen schönen Abend und Grüße Ulrich
Antworten