🙏 Helfen Sie mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Zelle in Uhrzeit formatieren - Edit: in einem Makro

Alles zur Programmierung im LibreOffice.
DerYeti
Beiträge: 19
Registriert: Sa 16. Mär 2024, 12:19

Re: Zelle in Uhrzeit formatieren - Edit: in einem Makro

Beitrag von DerYeti » Sa 20. Apr 2024, 09:28

nitja hat geschrieben:
Sa 20. Apr 2024, 08:15

"Die Datei"(en) ist/sind ja ohnehin nicht die worum es Dir eigentlich geht …
Du willst lediglich deren Daten in die "Master-Tabelle" einpflegen lassen, also holen und möglicherweise in verarbeiteter Form einfügen.
Soweit richtig verstanden?
Ja, richtig.
nitja hat geschrieben:
Sa 20. Apr 2024, 08:15
Wie kriegst Du die Dateien in Deinen Rechner, auf dem LO läuft?
Dann landen die vermutlich in einem Verzeichnis/directory, das Du dafür vorbereitet hast?
Von dort kannst Du sie per Makro ein- bzw. auslesen und ihre Daten Zeile für Zeile verarbeiten und so weit auswerten, dass Du einen Eintrag in die eigentliche, die "Master-Tabelle" machen lassen kannst, bis die Quelldateien abgearbeitet sind … und dann das Ergebnis anschauen.

Um das im Detail zu klären, bräuchte es hier also Beispieldateien in der Form, wie Deine Datenquellen sie liefern und eine mit der (möglicherweise leeren, verkleinerten) "Master-Datei", die in etwa zeigt wo was endgültig hin geschrieben werden soll.
Vielen Dank für Deine Antwort.
Im Prinzip alles genau so, wie Du beschrieben hast und dass ich das mit einem Makro lösen will, ist auch richtig.

Die Lösung in "Handarbeit" habe ich schon erst einmal so, dass ich zumindest mal alle Daten auswerten kann. Ich kann überhaupt nicht programmieren. Deshalb habe ich da auch keine großen Ambitionen, sondern will mir das alles irgendwie selbst erarbeiten. Das ganze dient also erst einmal nur zu meiner Weiterbildung und ob ich damit dann jemals mehr mache, weiß ich noch gar nicht.

Weil die Daten aus mehreren Quellen kommen, kann ich das so genau auch noch gar nicht beschreiben: Ich möchte da erst einmal einzelne kleine Schritte mit Makros lösen um dann zu verstehen, wie das aus der Handarbeit in den Makros aussieht.

Kurz zu meinem ursprünglichen Anliegen, etwas detaillierter beschrieben, ein paar kleine einzelne Makros sind auch schon funktionsfähig, teilweise noch mit Einschränkungen. Woran ich gerade arbeite ist folgendes.

In einer Zelle (A2) steht ein Datum und eine Uhrzeit als Text (!) wie folgt:
'2024/04/03 01:00:00

So kann ich das nicht richtig auswerten und deshalb teile ich das mehr oder weniger von Hand auf. Mehrere Einträge untereinander dann mit der Funktion aus dem Menü Daten --> "Text in Spalten". aufteilen.
Im Endergebnis steht dann in der Zelle A2 ein "echtes" Datum im Format: 03.04.2024 (soweit bin ich aber noch gar nicht und will da auch noch nicht anfangen)

In der Zelle B2 steht dann idealerweise die Uhrzeit: 01:00:00
Ich habe bereits ein Makro, welches die letzten 8 Zeichen (also die Uhrzeit mit den Doppelpunkten) in die Zelle B2 kopiert und dann aus der Zelle A2 löscht.

Mittlerweile ist das Ergebnis in B2 eine Dezimalzahl die ich auch von Hand Im Format Uhrzeit formatieren kann. Die stimmt dann mit der ursprünglichen Uhrzeit im Text der Zelle A2 überein. Soweit mein Stand.

Was ich nicht hinbekomme, ist dass die Zelle B2 nicht nur die Dezimalzahl enthält, sondern bereits als Uhrzeit formatiert ist. Ich kann die Zelle dann ja auch selbst formatieren und wenn das grundsätzlich geht, sollte das ja auch in einem Makro klappen. Dachte ich... ;) Gefunden hatte ich bei meiner Recherche erst einmal nichts, deshalb hier der Post. Ich habe dann gestern spät Abends noch das hier gefunden:
Genauer angeschaut hab ich das noch nicht, ich hoffe aber, dass mich das weiter bringt.

Wichtig wäre für mich, dass ich die einzelnen kleinen Aufgaben nach und nach als kleine, überschaubare Makros habe, damit ich jeweils verstehe, was da passiert. Ob ich dann das eine oder andere kombiniere oder verwerfe, möchte ich dann am Ende entscheiden . Deshalb beschreibe ich auch hier nur einzelne Teile, damit sich niemand die Mühe macht, mir eine Lösung zu programmieren, die ich nachher gar nicht verwende. Da ist ja dann keinem geholfen ;)

Ich poste hier mal das Makro, das bis jetzt funktioniert. Wie gesagt, das Ergebnis in der Zelle B2 ist dann eine Dezimalzahl. Die Zelle kann dann formatiert werden, so dass die korrekte Uhrzeit auch dargestellt wird.

Vielleicht noch ein wichtiger Hinweis.
Die Datei kommt aus einem Export als Excel-Datei. Die Bearbeitung bis hier hin erfolgt in LibreOffice Calc. Ich weiß nicht ob das in diesem konkreten Fall wichtig ist, will es aber noch erwähnt haben.

Und: Ich habe nicht immer so viel Zeit und Power um da kontinuierlich dran zu bleiben. Es kann also auch maletwas dauern, bis ich einzelne Schritte nachvollziehen kann ;)

Vielen Dank auf jeden Fall mal bis hier hin und ier ist das Makro, das bisher zumindest mal läuft:

Code: Alles auswählen


Sub CopyLast8CharactersAndConvertToTime1
    Dim oSheet As Object ' Deklaration einer Variablen für das aktive Tabellenblatt
    Dim oCellA As Object ' Deklaration einer Variablen für Zelle A2
    Dim oCellB As Object ' Deklaration einer Variablen für Zelle B2
    Dim sText As String  ' Deklaration einer Variablen für den Text in Zelle A2

    ' Aktives Tabellenblatt zuweisen
    oSheet = ThisComponent.CurrentController.ActiveSheet

    ' Zelle A2 auswählen
    oCellA = oSheet.getCellRangeByName("A2")

    ' Zelle B2 auswählen
    oCellB = oSheet.getCellRangeByName("B2")

    ' Text aus Zelle A2 holen und in Variable sText speichern
    sText = oCellA.getString()

    ' Überprüfen, ob der Text in Zelle A2 mindestens 8 Zeichen lang ist
    If Len(sText) >= 8 Then
        ' Die letzten 8 Zeichen des Textes in eine "echte" Uhrzeit umwandeln und in Zelle B2 einfügen
        oCellB.setValue(TimeValue(Right(sText, 8)))

        ' Die letzten 8 Zeichen aus der Ursprungszelle löschen
        oCellA.setString(Left(sText, Len(sText) - 8))
    Else
        ' Eine Meldung anzeigen, wenn der Text in Zelle A2 kürzer als 8 Zeichen ist
        MsgBox "Der Text in Zelle A2 ist kürzer als 8 Zeichen."
    End If
End Sub


nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Zelle in Uhrzeit formatieren - Edit: in einem Makro

Beitrag von nitja » Sa 20. Apr 2024, 12:17

DerYeti hat geschrieben:
Sa 20. Apr 2024, 09:28
Weil die Daten aus mehreren Quellen kommen, kann ich das so genau auch noch gar nicht beschreiben
Du könntest beschreiben wie Du das jetzt machst. Also z.B. wie Du die Daten aus Deiner Steckdose in den Rechner transportierst, auf dem LO läuft.
DerYeti hat geschrieben:
Sa 20. Apr 2024, 09:28
Ich möchte da erst einmal einzelne kleine Schritte mit Makros lösen …
Klar, aber eine Vorstellung, in welches Bauwerk die einzelnen "Backsteine" nachher wie passen sollen, würde helfen, nicht jeden ("Backstein") immer wieder neu machen zu müssen, wenn der nächste dazu kommt.
DerYeti hat geschrieben:
Sa 20. Apr 2024, 09:28
… um dann zu verstehen, wie das aus der Handarbeit in den Makros aussieht.
Solange der "work-flow" sich abbilden lässt …
Manchmal macht man das intuitiv richtig. Aber ich bin bei eigenen Projekten auch mal über das Gegenteil gestolpert, hätte mir gewünscht, vorher daran gedacht zu haben statt x Mal von "scratch" neu anzufangen.

Sei's drum. …

DerYeti hat geschrieben:
Sa 20. Apr 2024, 09:28
[Ausgangssituation]: In einer Zelle (A2) steht … '2024/04/03 01:00:00, [B2 ist leer]
[Ziel]: in … A2 …: 03.04.2024 [als Date] … In … B2 …: 01:00:00 [als Time]

… gestern spät Abends noch das hier gefunden: ¹⁾
¹) Da könnte ich Dir die Makro-"Bibel" von Andrew Pitonyak et al. empfehlen.
(help @ libreoffice.org, hat mit wenn, dann nur in sehr kleinen Häppchen weiter geholfen,
wobei es zum Nachschlagen - wenn man weiß was man sucht - freilich unersetzbar ist.)

DerYeti hat geschrieben:
Sa 20. Apr 2024, 09:28

Code: Alles auswählen

Sub CopyLast8CharactersAndConvertToTime1
    Dim oSheet As Object ' Deklaration einer Variablen für das aktive Tabellenblatt
    Dim oCellA As Object ' Deklaration einer Variablen für Zelle A2
    Dim oCellB As Object ' Deklaration einer Variablen für Zelle B2
    Dim sText As String  ' Deklaration einer Variablen für den Text in Zelle A2

    ' Aktives Tabellenblatt zuweisen
    oSheet = ThisComponent.CurrentController.ActiveSheet

    ' Zelle A2 auswählen
    oCellA = oSheet.getCellRangeByName("A2")

    ' Zelle B2 auswählen
    oCellB = oSheet.getCellRangeByName("B2")

    ' Text aus Zelle A2 holen und in Variable sText speichern
    sText = oCellA.getString()

    ' Überprüfen, ob der Text in Zelle A2 mindestens 8 Zeichen lang ist
    If Len(sText) >= 8 Then
        ' Die letzten 8 Zeichen des Textes in eine "echte" Uhrzeit umwandeln und in Zelle B2 einfügen
        oCellB.setValue(TimeValue(Right(sText, 8)))

        ' Die letzten 8 Zeichen aus der Ursprungszelle löschen
        oCellA.setString(Left(sText, Len(sText) - 8))
    Else
        ' Eine Meldung anzeigen, wenn der Text in Zelle A2 kürzer als 8 Zeichen ist
        MsgBox "Der Text in Zelle A2 ist kürzer als 8 Zeichen."
    End If
End Sub

Code: Alles auswählen

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

Sub ZelleInUhrzeitFormatieren
	dim oSheet as object, sText as string, sTime as string, tDate as date
	oSheet = thisComponent.sheets(0)
	sText = oSheet.getCellByPosition(0,0).string : sTime = split(sText)(1)
	oSheet.getCellByPosition(1,0).setFormula("=TEXT(TIMEVALUE(" & sTime & ");""HH:MM:SS""")
	tDate = CDate(join(split(split(sText)(0),"/"),"-"))
	oSheet.getCellByPosition(0,0).setFormula(tDate)
End Sub
oops - statt der ersten Tabelle kannst ja auch wie in Deinem Beispiel die aktive nehmen.
Die Sache mit der Uhrzeit passiert schon in der Zeile darunter.
Aber, falls Du das Datum auch in dem Format haben willst, das Du als Standard eingestellt hast, musst aus dem Text erstmal ein (ISO-)Datum machen.
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Zelle in Uhrzeit formatieren - Edit: in einem Makro

Beitrag von mikele » Sa 20. Apr 2024, 13:01

Hallo,
vielleicht hilft der Code-Schnipsel weiter:

Code: Alles auswählen

Sub Main

	sDatum="2024/04/03 01:00:00"
	datum=cdate(join(split(sDatum,"/"),"-"))
	Dim aLocale As New com.sun.star.lang.Locale
	onf=thiscomponent.numberformats
	sf=onf.getstandardformat(2,aLocale)	
	oZell1=ThisComponent.sheets(0).getcellbyposition(1,0)
	oZell2=ThisComponent.sheets(0).getcellbyposition(2,0)
	ozell1.value=datum
	ozell1.numberformat=sf
	sf=onf.getstandardformat(4,aLocale)
	ozell2.value=datum
	ozell2.numberformat=sf

End Sub
Gruß,
mikele

DerYeti
Beiträge: 19
Registriert: Sa 16. Mär 2024, 12:19

Re: Zelle in Uhrzeit formatieren - Edit: in einem Makro

Beitrag von DerYeti » Sa 20. Apr 2024, 13:28

nitja hat geschrieben:
Sa 20. Apr 2024, 12:17
Du könntest beschreiben wie Du das jetzt machst. Also z.B. wie Du die Daten aus Deiner Steckdose in den Rechner transportierst, auf dem LO läuft.

......
Klar, aber eine Vorstellung, in welches Bauwerk die einzelnen "Backsteine" nachher wie passen sollen, würde helfen, nicht jeden ("Backstein") immer wieder neu machen zu müssen, wenn der nächste dazu kommt.
Die eine Quelle ist der Export aus dem Laderegler, das kommt als csv-Datei und bereitet erst einmal so keine Probleme. Das würde dann erst relevant werden, wenn ich die beiden Quellen wirklich zusammenführen will. Der liefert mir auch bis zu 30 Tage an Daten und da ist der Aufwand akzeptabel. Zumal da schon beim importieren so einiges automatisch in LibreOffice klappt.

Die Sache mit den Steckdosen ist mit mehr Aufwand verbunden, weil die nur bis zu 7 Tage Daten liefern und wenn ich das nicht regelmäßig mache, fehlen mir eventuell Daten. Diese Steckdosen sind von Tapo und liefern leider nur Daten im Excel-Format. Und da dann eben die Datum/Uhrzeit Geschichte. Da hab ich glaube ich auch schon beschrieben, das ich das mit "Daten --> Text in Spalten" ganz gut hinbekomme. Aber halt relativ häufig in kurzen Abständen.

Geliefert werden beide per E-Mail. Dummerweise heißt der Export aus den Steckdosen immer gleich, so dass ich da wirklich dran bleiben muss um die auseinanderhalten zu können. Man kann die Namen auch tatsächlich nicht beeinflussen. Deshalb will ich irgendwann die Arbeit in dem Fall vereinfachen.

Hier mal der Workflow bzgl. der Steckdosen. Wenn auch wirklich ohne die Absicht einen Code haben zu wollen. Spar Dir die Zeit, es kann auch sein, dass ich irgendwann was anderes habe. Dann wäre die Zeit verschenkt, weil ungenutzt. Es sind übrigens zwei Steckdosen, die unterschiedliche Dinge versorgen. Blöderweise aber halt die gleichen Namen beim Export verwenden.

1. Export aus der App
2. Dateianhang aus der Mail abspeichern und umbenennen (am besten sofort, weil ich da sonst relativ schnell den Überblick verlieren würde)

Die Excel-Tabelle besteht aus zwei Spalten. Spalte A mit dem Datum und der Uhrzeit als Text, Spalte B die verbrauchten kwh als Zahl, kein Problem.

3. Vor der Spalte B eine leere Spalte einfügen.
4. Spalte A mit "Daten --> Text in Spalten" aufteilen.

Dann sind die Daten bereits "verwendbar".

5. Die letzte Stunde in der "Master-Datei" ermitteln (Beispiel: 03.04.2024, 11:00:00)
6. Diese Stunde in der gelieferten Excel-Tabelle mit markieren (weil in der Stunde ab 11 Uhr der Verbrauch evtl. weiter geht ich überschreibe also diese eine Zeile in der Master-Datei) kopieren und in der Master-Tabelle einfügen.

Das war es schon. Wäre das nicht so häufig und für zwei Dosen, wäre der Aufwand überschaubar. Es geht halt darum, dass ich nicht immer die Lust habe und dann wird es irgendwann eklig ;)

In der Master-Datei gibt es (bisher) zwei Tabellen. Eine sammelt die Daten untereinander so, wie ich sie einfüge. In der zweiten hab ich eine Pivot-Tabelle, in der ich die monatlichen Summen bilde und ein Diagramm, in dem ich das grafisch anzeigen lasse. Die Pivot-Tabelle hab ich mit einem sehr großen Bereich nach unten angelegt, so dass ich nach dem Einfügen der Daten aus der Excel-Tabelle nur noch aktualisieren muss und alles ist wie ich es will.

Ich hab schon Lösungen für einige der Schritte. Öffnen, der Excel-Datei, einfügen der dritten Spalte, die letzte relevante Zeile ermitteln... Im Moment fehlt mir eigentlich nur das mit dem Datum. Kopieren und einfügen der Datensätze geht eigentlich schon. Vielleicht ergibt sich da insgesamt noch was. Im Moment überlege ich tatsächlich das ganze auch in mehr als einem Makro zu machen. Ein Makro, was mir aus der LO Datei die Excel-Tabelle aufbereitet und das zweite Makro, was mir dann entsprechend die relevanten Zeilen ermittelt und in die Master-Datei kopiert.

Der Export aus dem Laderegler (csv-Datei) ist im Moment noch eine andere Geschichte. Da geht s auch grundsätzlich um was anderes. Hier wird der erzeugte Strom dargestellt, was nicht immer das ist, was ich auch verbrauche. Die Steckdosen sind für den Verbrauch eher relevant. Die Auswertungen mit der Pivot-Tabelle geht in beiden Fällen, da bin ich glücklich damit.

Das war es jetzt mal im groben. Es gibt noch mehr aber ich schreibe ja eh schon Romane ;) und wie gesagt, ich hab da keine Eile. Wer weiß ob ich in ein paar Monaten nicht was anderes brauche ;)

nitja hat geschrieben:
Sa 20. Apr 2024, 12:17
¹) Da könnte ich Dir die Makro-"Bibel" von Andrew Pitonyak et al. empfehlen.
(help @ libreoffice.org, hat mit wenn, dann nur in sehr kleinen Häppchen weiter geholfen,
wobei es zum Nachschlagen - wenn man weiß was man sucht - freilich unersetzbar ist.)


Wow... das ist mal ein gutes Dokument. Da werd ich mir auf jeden Fall mal ein paar Sachen anschauen, vielen Dank!
nitja hat geschrieben:
Sa 20. Apr 2024, 12:17

Code: Alles auswählen

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

Sub ZelleInUhrzeitFormatieren
	dim oSheet as object, sText as string, sTime as string, tDate as date
	oSheet = thisComponent.sheets(0)
	sText = oSheet.getCellByPosition(0,0).string : sTime = split(sText)(1)
	oSheet.getCellByPosition(1,0).setFormula("=TEXT(TIMEVALUE(" & sTime & ");""HH:MM:SS""")
	tDate = CDate(join(split(split(sText)(0),"/"),"-"))
	oSheet.getCellByPosition(0,0).setFormula(tDate)
End Sub
Danke für den Code, den versuche ich für mich zu nutzen :)
Ich glaube, ich setze den Post mal auf "gelöst". Ich will erst einmal das verarbeiten, was ich bis jetzt bekommen habe :)

DerYeti
Beiträge: 19
Registriert: Sa 16. Mär 2024, 12:19

Re: Zelle in Uhrzeit formatieren - Edit: in einem Makro

Beitrag von DerYeti » Sa 20. Apr 2024, 13:30

mikele hat geschrieben:
Sa 20. Apr 2024, 13:01
Hallo,
vielleicht hilft der Code-Schnipsel weiter:

Code: Alles auswählen

Sub Main

	sDatum="2024/04/03 01:00:00"
	datum=cdate(join(split(sDatum,"/"),"-"))
	Dim aLocale As New com.sun.star.lang.Locale
	onf=thiscomponent.numberformats
	sf=onf.getstandardformat(2,aLocale)	
	oZell1=ThisComponent.sheets(0).getcellbyposition(1,0)
	oZell2=ThisComponent.sheets(0).getcellbyposition(2,0)
	ozell1.value=datum
	ozell1.numberformat=sf
	sf=onf.getstandardformat(4,aLocale)
	ozell2.value=datum
	ozell2.numberformat=sf

End Sub
Vielen Dank, probiere ich sehr gerne aus. Es kann aber ein wenig dauern, ich habe nicht immer die Energie und Zeit dazu und bin daher nicht der schnellste :) Es geht aber nichts unter.

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: [gelöst] Zelle in Uhrzeit formatieren - Edit: in einem Makro

Beitrag von nitja » Sa 20. Apr 2024, 17:24

sorry, da war ein typo drin

Code: Alles auswählen

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

Sub ZelleInUhrzeitFormatieren
	dim oSheet as object, sText as string, sTime as string, tDate as date
	oSheet = thisComponent.sheets(0)
	sText = oSheet.getCellByPosition(0,0).string : sTime = split(sText)(1)
	oSheet.getCellByPosition(1,0).setFormula("=TEXT(TIMEVALUE(""" & sTime & """);""HH:MM:SS""")
	tDate = CDate(join(split(split(sText)(0),"/"),"-"))
	oSheet.getCellByPosition(0,0).setFormula(tDate)
End Sub
… immer so a G'schiss mit dera Gänsefüßchen :lol:
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten