Uhrzeiten eingeben

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

tobik
Beiträge: 3
Registriert: Mi, 02.06.2004 22:41
Kontaktdaten:

Uhrzeiten eingeben

Beitrag von tobik » Mi, 02.06.2004 22:50

Hi,

ich habe ein Dokument das mit vielen Uhrzeiten gefüllt werden muss. Dabei ist es lästig immer wieder den Doppelpunkt zu tippen.

Gibt es eine Möglichkeit nur 4 Ziffern einzutippen und dann automatisch in eine Uhrzeit umzuwandeln (1200 -> 12:00)

Ich hab schon über Daten/Gültigkeit/Makro versucht einen "ungültigen-4-ziffern" Eingabewert mit einem Doppelpunkt zu versehen und in die aktuelle Zeile zurückzuschreiben. Allerdings wird dieser Wert danach wieder durch den "ungültigen-4-ziffern" Wert ersetzt.

Tobias

Gast

Beitrag von Gast » Do, 03.06.2004 13:58

Hallo Tobias,

Erstelle eine Zellvorlage mit dem Namen "auto_zeit", der genaue Name ist wichtig die Einstellung der Formatierungen in der Vorlage ist unwichtig. Allerdings darfst Du hier keine Zeitformatierung angeben weil das dann zu Problemen führt wenn Du die Eingabe nicht in der Form "xx:yy" machst, aber das weißt Du ja.
Alle Zellen in welche Du in verkürzter Schreibform (1200 entspricht 12:00 Uhr) eintragen willst müssen mit der gerade erstellten Zellvorlage formatiert sein (vor dem Eintragen der Werte oder nachträglich). Trage nun in die entsprechenden Zellen die Werte in der Form 1200 ein, wichtig sind vierstellige Zahlen (also nicht für 8:00 Uhr 800 eintragen sondern 0800).
Nun markiere den gesamten Bereich auf dem Tabellenblatt wo die Zellen enthalten sind in denen Du z.B. 1200 in 12:00 umwandeln willst. Es können innerhalb der Markierung beliebig viele andere Zellen erfaßt sein, wichtig ist nur das alle Zellen erfaßt werden die du umwandeln willst.
Starte das folgende Makro:

Code: Alles auswählen

Sub format_zeit
oSelect=ThisComponent.CurrentSelection
oColumn=oselect.Columns
oRow=oSelect.Rows
For n= 0 To oColumn.getCount-1
    For m = 0 To oRow.getCount-1
        oCell=oselect.getCellByPosition (n, m)
        If oCell.CellStyle = "auto_zeit" Then
            eintrag = oCell.String
            If Len(eintrag) = 4 Then
            ' Eintrag muß 4 Ziffern haben !
            links = Left(eintrag, 2)
            rechts = Right(eintrag, 2)
            neu_eintrag = links & ":" & rechts
            oCell.String = ""
            oCell.NumberFormat = 40
            oCell.FormulaLocal = neu_eintrag
            End If
        End If
    Next m
Next n
End Sub
Ich hoffe das funktioniert bei Dir.

Gruß
Stephan

Gast

Beitrag von Gast » Do, 03.06.2004 23:18

Hallo Stephan,

vielen Dank für Deine Antwort. Deine Lösung ist gut für wenige große Portionen geeignet. Allerdings trage ich häufig kleinere Mengen von Uhrzeiten in die Tabelle (ein Logbuch) ein.

Deshalb fände ich es besser, wenn die Eingabe beim Verlassen der Zelle umgewandelt würde. Dann könnte man auch für jede eingegebene Zeile direkt die aus den Uhrzeiten errechneten Werte überprüfen.

Gibt es dafür wirklich keine Lösung?

Gruß,
Tobias

Gast

Beitrag von Gast » Fr, 04.06.2004 15:40

Hallo Tobias,
Ich hab schon über Daten/Gültigkeit/Makro versucht einen "ungültigen-4-ziffern" Eingabewert mit einem Doppelpunkt zu versehen und in die aktuelle Zeile zurückzuschreiben.
Das Problem ist das bei Daten/Gültigkeit/Makro der Wert geprüft wird bevor er in das Tabellenblatt übernommen wird. Führst Du nun ein Makro aus steht diesem der Wert den Du prüfen willst noch nicht in der Zelle zur Verfügung sondern nur temporär. Ich weiß nicht wie ich auf diesen temporären Wert zugreifen kann.
Verknüpfe ich ein Makro mit dem Ereignis "Geändertstatus geändert" kannst Du quasi immer nur einen Wert eintragen (hierbei wäre automatische Formatierung sofort bei Eingabe kein Problem) und müßtest anschließend immer auf Speichern drücken. Der Geändertstatus kann also nur die Werte "geändert" und "nicht geändert" annehmen und nicht z.B. "zweimal geändert" das ist das Problem.

Ich habe Dir jedoch folgendes Beispiel aufgeschrieben, was Dir auch ohne Makro weiterhelfen sollte:

öffne ein leeres Dokument
schreibe in Zelle:
A1 -->Beginn:
A2 -->Ende:
A3 -->Arbeitszeit:
formatiere die Zellen B1 und B2 "Benutzerdefiniert" Formatcode: ##:##
Du kannst nun in B1 und B2 z.B. 1200 und 1405 eingeben, und angezeigt wird 12:00 und 14:05 (zugegeben als String, was aber eigentlich nicht stören dürfte, wenn Du das Weitere beachtest)
trage in Zelle B3 folgende Formel ein:
=SUMME(-ZEIT(LINKS(B1;2);RECHTS(B1;2);0);ZEIT(LINKS(B2;2);RECHTS(B2;2);0))
das Ergebnis ist jetzt 0,09
ändere das Format der Zelle B3 in "Zeit" Format: 876613:37:46 Formatcode ist: [HH]:MM:SS (oder "Zeit" Format: 13:37:46 Formatcode: HH:MM:SS), bei ersterem werden Zeiten größer 24 Stunden angezeigt, bei letzterem nur Zeiten der Form: Anzeigewert = (Gesamtzeit/24 Stunden)-(ganzzahliger Anteil(Gesamtzeit/24 Stunden))
das Ergebnis ist nun 02:05:00

Ich hoffe das Du das sinngemäß verwenden kannst.


Gruß
Stephan

Gast

Beitrag von Gast » Mo, 07.06.2004 23:04

Hallo Stephan,

So habe ich es mir vorgestellt. DAAANKE!!! Damit kann ich prima leben.

Viele Grüße,
Tobias

PS: Auf den temporären Wert kann man lesend zugreifen über
Function ExampleValidity(CellValue as String, TableCell as String)
Aber wie das Makro den temporären Wert verändern kann weiß ich eben auch nicht.

Gast

Beitrag von Gast » Di, 08.06.2004 01:41

Hallo Tobias,

ich habe in den mitgelieferten Beispiel-Makros, diversen Handbüchern und im Developersguide gesucht...

Wo ist denn:
PS: Auf den temporären Wert kann man lesend zugreifen über
Function ExampleValidity(CellValue as String, TableCell as String)
Aber wie das Makro den temporären Wert verändern kann weiß ich eben auch nicht.
Falls es als Beispiel in OO oder SO enthalten, bitte gib zur Sicherheit auch die version an.
Wenn diese funktion das tut was Du ansprichst würde ein lesender Zugriff auf den Temporärwert genügen.


Gruß
Stephan

Gast

Beitrag von Gast » Di, 08.06.2004 17:32

Hallo Stephan,

ich hab das Beispiel in der Online-Hilfe von OO 1.1.0 deutsch gefunden:

Daten/Gültigkeit
Register Fehlermeldung
Hilfe

Ganz unten findest Du dieses Beispiel. Ich habe es ausprobiert. Der Lesezugriff funktioniert. Aber wenn ich die Zelle in der Funktion setze wird sie nach Beendigung des Makros wieder durch den temporären Wert überschrieben.

Gruß,
Tobias

Gast

Beitrag von Gast » Di, 08.06.2004 23:22

Hallo Tobias,
Anonymous hat geschrieben:Hallo Stephan,

ich hab das Beispiel in der Online-Hilfe von OO 1.1.0 deutsch gefunden:

Daten/Gültigkeit
Register Fehlermeldung
Hilfe

Ganz unten findest Du dieses Beispiel. Ich habe es ausprobiert. Der Lesezugriff funktioniert. Aber wenn ich die Zelle in der Funktion setze wird sie nach Beendigung des Makros wieder durch den temporären Wert überschrieben.

Gruß,
Tobias
Danke für die Info.
Vielleicht fällt mir doch noch etwas ein, aber Du hast recht mit dem was Du schilderst. Problem ist ebend das der temporäre Wert nach dem Ende des Makros in die Zelle geschrieben wird...

Gruß
Stephan

Gast

Beitrag von Gast » Fr, 11.06.2004 13:00

Ich habe eine Anfrage bei dem englischen OpenOffice-Forum gestellt (http://www.oooforum.org/forum/viewtopic.php?t=9673), welche mich zu folgendem Code führte :

Quelle: http://www.oooforum.org/forum/viewtopic.php?t=6445

Code: Alles auswählen

REM   Global Variables: 

    Global oListener    As Object 
    Global oDocView    As Object 
' ===================================
REM   Run this macro to start event intercepting: 
Sub Example_SelectionChangeListener 

    oDocView = ThisComponent.getCurrentController 
      
    'create a listener to intercept the selection change event 
    oListener = CreateUnoListener( "MyApp_", "com.sun.star.view.XSelectionChangeListener" ) 
      
    ' register the listener to the document controller 
    oDocView.addSelectionChangeListener(oListener) 
      
End Sub 

' =============================================
REM   Run this macro to stop event intercepting: 
Sub Remove_Listener 

   ' removes the listener 
   oDocView.removeSelectionChangeListener(oListener) 

End Sub 

' ====================================================
REM   All listeners must support this event: 
Sub MyApp_disposing(oEvent) 

   msgbox "disposing of the listener" 

End Sub 

' ========================================================
REM   What to do when we get an event: 
Sub MyApp_selectionChanged(oEvent) 

   Dim oCurrentSelection As Object 
   ' the source property of the event struct 
   ' gets a reference to the event source, 
   ' in this case, NOT the onscreen selection, 
   ' but rather the currentController: 

    oCurrentSelection =  oEvent.source 
    MsgBox "Fired:" & chr(10) & chr(10) & oCurrentSelection.dbg_properties 

   ' This will give us info about the onscreen selection: 
    dim oCurr as object 
          oCurr = thiscomponent.getcurrentselection 
    msgbox "Selection: " & oCurr.getimplementationname 

End Sub
Dieser Code funktioniert mit Mausbedienung nicht korrekt, mit Tastaturbedienung schon. Für dieses Phänomän existiert jedoch in dieser Datei : http://www.openoffice.org/nonav/issues/ ... eFiles.zip

der Hinweis das dieses Problem bekannt sei und
schon ein issue vorläge?
oder das das Problem auf einem bekannten Problem basiere, für welches ein issue vorliegt?

Im Umfeld des ganz oben genannten Links gibt es weitere Beispiele, die alle ähnlich sind u.a. ein Beispiel bei dem die Veränderung des Zellinhalts als auslösender Event benutzt wird.
Ich weiß nicht ob diese Informationen jetzt noch Interesse sind, habe sie jedoch hier eingefügt falls noch einmal jemand diesen Thread durchliest.

Gruß
Stephan

tobik
Beiträge: 3
Registriert: Mi, 02.06.2004 22:41
Kontaktdaten:

Beitrag von tobik » Sa, 12.06.2004 22:46

Hallo Stephan,

Treffer und versenkt :-)

Allerdings wird beim Verlassen einer Zelle die neue Zelle in event.source übermittelt. Man muss also letztlich die Zelle des vorherigen Aufrufs bearbeiten.

Code: Alles auswählen

Global oRecentSelection As Object

REM   What to do when we get an event: 
Sub MyApp_selectionChanged(oEvent) 

   ' the source property of the event struct 
   ' gets a reference to the event source, 
   ' in this case, NOT the onscreen selection, 
   ' but rather the currentController: 

	oSelection = oRecentSelection
	oRecentSelection = oEvent.source.selection
	
    'Only if oSelection is a single cell
    if oSelection.supportsService ("com.sun.star.sheet.SheetCell") then
	    'columns 1 and 2 are our timestamps
    	if (oSelection.CellAddress.column = 1) or (oSelection.CellAddress.column = 2) then
			'modify only if cell contains 4 characters and no colon
			if (len (oSelection.String) = 4) and (InStr (oSelection.String, ":") = 0) then
 		    	oSelection.Formula = Left (oSelection.Value, 2) + ":" + Right (oSelection.Value, 2)
	 		    oSelection.NumberFormat = 40
 			end if
	    end if
	end if
End Sub
Danke und Gruß,
Tobias

Gast

Beitrag von Gast » Sa, 12.06.2004 23:59

Hallo Tobias,
Treffer und versenkt
ich habe ganz aufgeregt den Code in OOo kopiert ...

Respekt, es funktioniert. Gut gemacht.


Ich werde das morgen erst nochmal genau durchdenken müssen.

Schönen Sonntag.


Beste Grüße
Stephan

Raabun
**
Beiträge: 26
Registriert: So, 27.06.2004 14:13
Kontaktdaten:

Frage zu Daten/Gültigkeit...

Beitrag von Raabun » So, 27.06.2004 14:21

Hallo Leute,
ich habe zu diesem Thema eine weiterführende Frage:
Weiß jemand von Euch wie ich dieses Feature
Daten, Gültigkeit, Zeit, Stop
in einen über Java erstellten Cell-Type o.ä pressen kann.

Zur Erläuterung:
Ich erzeuge mir mit Java-dynamisch eine OO-Calc-Dokument, in dem ich Zeiten eingeben will. Auf diese Zeiten wird später mit einem Makro zugegriffen. Falls in der Zelle nun KEINE Zeit steht, meldet mir mein Makro einen Fehler im Aufruf und startet OO-Basic-zum Debuggen ja ok,
aber im Gebrauch nicht. Eine nach obigen Muster behandelte Zelle verhinder aber die Eingabe einer "Nicht-Zeit"

Vielen Dank
Raabun

tobik
Beiträge: 3
Registriert: Mi, 02.06.2004 22:41
Kontaktdaten:

Beitrag von tobik » Fr, 22.04.2005 23:54

Leider funktioniert obige Lösung mit OO2 nicht mehr richtig. Deshalb hier die Anpassung an Openoffice 2.0, getestet mit Beta Build 1.9.79:

Code: Alles auswählen

Global oRecentSelection As Object

REM   What to do when we get an event:
Sub MyApp_selectionChanged(oEvent)

    ' the source property of the event struct
    ' gets a reference to the event source,
    ' in this case, NOT the onscreen selection,
    ' but rather the currentController: 

    oSelection = oRecentSelection 
    oRecentSelection = oEvent.source.selection 
    
    'Only if oSelection is a single cell 
    if oSelection.supportsService ("com.sun.star.sheet.SheetCell") then
        'columns 1 and 2 are our timestamps
        if (oSelection.CellAddress.column = 1) or (oSelection.CellAddress.column = 2) then
            'if cell formula is less then 1 then it is already a valid time.
            if oSelection.Formula >= 1 then
                recentString = oSelection.Formula
                while (len (recentString) < 4)
                    recentString = "0"+recentString
                wend
                recentString = Left (recentString, 2) + ":" + Right (recentString, 2)
                oSelection.Formula = recentString
                oSelection.NumberFormat = 40
            end if
        end if
    end if
End Sub
Gruß, Tobias

Gast

Re:

Beitrag von Gast » So, 22.07.2007 20:16

Gast hat geschrieben:Hallo Tobias,
Ich hab schon über Daten/Gültigkeit/Makro versucht einen "ungültigen-4-ziffern" Eingabewert mit einem Doppelpunkt zu versehen und in die aktuelle Zeile zurückzuschreiben.
Das Problem ist das bei Daten/Gültigkeit/Makro der Wert geprüft wird bevor er in das Tabellenblatt übernommen wird. Führst Du nun ein Makro aus steht diesem der Wert den Du prüfen willst noch nicht in der Zelle zur Verfügung sondern nur temporär. Ich weiß nicht wie ich auf diesen temporären Wert zugreifen kann.
Verknüpfe ich ein Makro mit dem Ereignis "Geändertstatus geändert" kannst Du quasi immer nur einen Wert eintragen (hierbei wäre automatische Formatierung sofort bei Eingabe kein Problem) und müßtest anschließend immer auf Speichern drücken. Der Geändertstatus kann also nur die Werte "geändert" und "nicht geändert" annehmen und nicht z.B. "zweimal geändert" das ist das Problem.

Ich habe Dir jedoch folgendes Beispiel aufgeschrieben, was Dir auch ohne Makro weiterhelfen sollte:

öffne ein leeres Dokument
schreibe in Zelle:
A1 -->Beginn:
A2 -->Ende:
A3 -->Arbeitszeit:
formatiere die Zellen B1 und B2 "Benutzerdefiniert" Formatcode: ##:##
Du kannst nun in B1 und B2 z.B. 1200 und 1405 eingeben, und angezeigt wird 12:00 und 14:05 (zugegeben als String, was aber eigentlich nicht stören dürfte, wenn Du das Weitere beachtest)
trage in Zelle B3 folgende Formel ein:
=SUMME(-ZEIT(LINKS(B1;2);RECHTS(B1;2);0);ZEIT(LINKS(B2;2);RECHTS(B2;2);0))
das Ergebnis ist jetzt 0,09
ändere das Format der Zelle B3 in "Zeit" Format: 876613:37:46 Formatcode ist: [HH]:MM:SS (oder "Zeit" Format: 13:37:46 Formatcode: HH:MM:SS), bei ersterem werden Zeiten größer 24 Stunden angezeigt, bei letzterem nur Zeiten der Form: Anzeigewert = (Gesamtzeit/24 Stunden)-(ganzzahliger Anteil(Gesamtzeit/24 Stunden))
das Ergebnis ist nun 02:05:00

Ich hoffe das Du das sinngemäß verwenden kannst.


Gruß
Stephan
Hallo habe gerade festgestellt, dass diese Formel nur bei 4-stelligen Uhrzeiten funktioniert (bei 9:00 wirds falsch), meine Lösung ist diese:

=WENN(B1>999;SUMME(-ZEIT(LINKS(B1;2);RECHTS(B1;2);0);ZEIT(LINKS(B2;2);RECHTS(B2;2);0));WENN(B1<999;SUMME(-ZEIT(LINKS(B1;1);RECHTS(B1;2);0);ZEIT(LINKS(B2;2);RECHTS(B2;2);0))))

Allerdings muss die Endzeit immer noch 4-stellig sein.
Vielleicht hilft es ja weiter... =)

Gruss,
Henrik

gripslund
***
Beiträge: 82
Registriert: So, 04.06.2006 09:46

Re: Uhrzeiten eingeben

Beitrag von gripslund » So, 22.07.2007 22:55

Hallo,
habe etwas in der Richtung: als Beispiel (mit meinen Zellen):
Spalte "L" formatiert mit > 00":"00 < (NullNullAnf.-zeichenDoppelp.Anf.-zeichenNullNull) - hier werden die Uhrzeiten eingetragen -> 106 für 01:06 Uhr, 34 für 00:34 Uhr ...
in Spalte "N" steht folgende Formel, welche die in "L" eingetragene Zahl in eine Uhrzeit umwandelt (formatiert mit 876613:37 [Std:Min]): =WENN(ISTZAHL(L5);(GANZZAHL(L5/100)*60+RECHTS(L5;2))/60/24;0)
Die Hilfsspalte "N" blende ich aus, muss keiner sehen, wird aber für die Berechnung herangezogen.
Hilft das? Benutze ich seit Jahren und kommt ohne Makro aus.

Gruß.

gripslund

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste