BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Datum kleiner als 01.01.2017 und weiteres

Alles zur Programmierung im LibreOffice.
oiram
Beiträge: 7
Registriert: Di 27. Jun 2017, 15:46

Datum kleiner als 01.01.2017 und weiteres

Beitrag von oiram » Do 29. Jun 2017, 09:53

Hallo Zusammen,
ich bin an meiner ersten Makroprogrammierung dran und habe auch schon einiges hinbekommen, aber an 3 Stellen hapert es noch.
Es soll eine csv-Datei geöffnet, bearbeitet und wieder als csv in utf-8 gespeichert werden.
Was ich bis jetzt hinbekommen habe ist das Löschen von Spalten und Zeilen und das Hinzufügen und Befüllen von einer Spalte.

Was noch nicht klappt ist das Löschen von Zeilen nach Datum.
In der Spalte E soll nach dem Datum gesucht werden, welches älter wie der 1.1.2017 ist und die entsprechende Zeile gelöscht werden.
Dazu habe ich folgendes zusammengebastelt:

sub loesche_wenn_datum
oSheet = ThisComponent.CurrentController.getActiveSheet()
oCursor = oSheet.CreateCursor
oCursor.GotoEndOfUsedArea(false)
nEndrow = oCursor.Rangeaddress.EndRow
dim oCell as Date
for i = nEndrow to 0 step - 1
oCell = oSheet.GetCellByPosition(4,i)'1 entspricht Spalte E
if (oCell.date < "01.01.2017") then
oSheet.Rows.RemoveByIndex(i,1)
endif
next i
end sub

Leider wird dabei nach längerer Wartezeit der gesamte Inhalt der Datei gelöscht,
was sicher (auch) mit dem nicht richtigen Format des Datums sowohl in der Spalte als auch im Makro zu tun hat.

Die restlichen Sachen wären das Importieren der csv und das funktioniert schon von Hand nur so,
wenn das Makro unter "Meine Makros & Dialoge" liegt, auch mit kompletten Lockern der Makroschutzrichtlinien.
Das Speichern soll, wie gesagt wieder in csv in utf-8 mit demselben Dateinamen plus "_bearbeitet" sein.

Für das Öffnen und Speichern habe ich bis jetzt noch gar keine brauchbaren Ansätze, wobei das auch unter die Kategorie nice to have fällt.
Das Wichtigste wäre also die Datumsgeschichte.
Und wenn ihr mir da etwas auf die Sprünge helfen könntet wäre das eine richtig coole Sache.
Zuletzt geändert von oiram am Do 29. Jun 2017, 12:16, insgesamt 1-mal geändert.

oiram
Beiträge: 7
Registriert: Di 27. Jun 2017, 15:46

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von oiram » Do 29. Jun 2017, 11:03

Das Speichern hätte sich erledigt, ist zwar derselbe Name, aber wenn man die Datei vorher umbenennt ist das auch ok.
Und wenn man beim öffnen auf utf-8 umstellt geht das auch

dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von mikele » Do 29. Jun 2017, 14:36

Hallo,
die Code-Zeile

Code: Alles auswählen

dim oCell as Date
ist nicht sinnvoll, da durch

Code: Alles auswählen

oCell = oSheet.GetCellByPosition(4,i)'1 entspricht Spalte E
oCell ein Objekt und kein Date-Struct darstellt (führt bei mir zu einer Fehlermeldung).

Code: Alles auswählen

Cell.date
führt bei mir auch zum Fehler, da der Zellwert nicht als Date-Struct vorliegt.
Ich würde den Code so ändern:

Code: Alles auswählen

sub loesche_wenn_datum
	oSheet = ThisComponent.CurrentController.getActiveSheet()
	oCursor = oSheet.CreateCursor
	oCursor.GotoEndOfUsedArea(false)
	nEndrow = oCursor.Rangeaddress.EndRow
	for i = nEndrow to 0 step - 1
		oCell = oSheet.GetCellByPosition(4,i)'4 entspricht Spalte E
		if cdate(oCell.value) < cdate("01.01.2017") then
			oSheet.Rows.RemoveByIndex(i,1)
		endif
	next i
end sub
Gruß,
mikele

oiram
Beiträge: 7
Registriert: Di 27. Jun 2017, 15:46

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von oiram » Do 29. Jun 2017, 16:50

Hallo mikele,
danke für deine Antwort.
Leider habe ich hier den gleichen Effekt, es wird alles gelöscht.
Nun habe ich von Hand die Spalte als Datum formatiert (ursprünglich ist es ja Text).
Danach habe ich aber ein ' drin: '18.3.2008
Jetzt wäre die Frage, wie kann ich die Spalte automatisch auf Datum (TT.MM.JJJJ) umsetzen und das ' rauslöschen.
Mit der Makroaufzeichnung habe ich für das Datumsformat folgendes gefunden:

Code: Alles auswählen

sub datum
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "NumberFormatValue"
args1(0).Value = 36

dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args1())
end sub
Allerdings muss ich hierbei vorher die Spalte markieren oder ich mache es so:

Code: Alles auswählen

sub datum2
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$E$2:$E$500000"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "NumberFormatValue"
args2(0).Value = 36

dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
end sub
Hier gefällt mir die genaue Bezeichnung des Zellen nicht, aber damit könnte ich leben.

Bei der Entfernung von dem Strich erhalte dann sowas:

Code: Alles auswählen

sub datum3
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "StringName"
args1(0).Value = "24.2.2010"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "9.3.2007"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

end sub
Und das ist dann nicht wirklich was was funzt...

Hättest Du oder jemand anderes noch eine Idee wie ich die Striche entweder gar nicht rein bekomme oder sie löschen kann?

F3K Total
Beiträge: 2410
Registriert: So 10. Apr 2011, 10:10

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von F3K Total » Do 29. Jun 2017, 18:12

Hallo,
da gibt es mehrere Möglichkeiten:
HIer ein Codeschnipsel, dessen Werte in der Zeile

Code: Alles auswählen

Args(1).Value = "59,34,76,1,,0,false,true,true"
ich beim Export íns CSV Format aufgenommen habe:

Code: Alles auswählen

Sub S_load_csv_insert_EK_store_csv
    Dim Args(1) as New com.sun.star.beans.PropertyValue
    sURL = converttourl("C:\Users\USER\Desktop\TEST.csv") '    <------ Dateipfad der zu ladenden Datei
    Args(0).Name = "FilterName"
    Args(0).Value ="Text - txt - csv (StarCalc)"
    Args(1).Name = "FilterOptions"
    Args(1).Value = "59,34,76,1,,0,false,true,true"
    odoc = StarDesktop.loadComponentFromURL(sURL,"_blank", 0, Args)
End sub
Hier wird Spalte E als Datum geladen.
HTH R
Windows 10: AOO, LO Linux Mint: AOO, LO

oiram
Beiträge: 7
Registriert: Di 27. Jun 2017, 15:46

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von oiram » Fr 30. Jun 2017, 09:09

Hallo F3K,
danke für deine Antwort.
Leider verstehe ich im ersten Augenblick nur ziemlich viel Bahnhof.
Für mich ist das widersprüchlich: "beim Export ins CSV" und "Dateipfad der zu ladenden Datei"??
Meinst Du wenn die Datei auf diese Weise gespeichert wird, dann öffnet man sie das nächste mal mit der Spalte E im Datumsformat
oder heißt das wenn man sie so öffnet dann ist die Spalte E im Datumsformat?
Wo wird die Spalte E definiert - beim öffnen ist die benötigte Spalte noch nicht E...

oiram
Beiträge: 7
Registriert: Di 27. Jun 2017, 15:46

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von oiram » Fr 30. Jun 2017, 09:38

ok, alles gut, es geht um das Öffnen und es werden alle Spalten mit Datum als Datum definiert.
Gibt es irgendwo eine Übersicht mit den Bedeutungen dieser Zahlen?

oiram
Beiträge: 7
Registriert: Di 27. Jun 2017, 15:46

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von oiram » Fr 30. Jun 2017, 11:37

Hallo Zusammen,
es läuft jetzt alles sehr gut bis auf eine Kleinigkeit ;-)
der Teil mit dem Datum löscht auch die erste Zeile, in der die Überschriften stehen:

Code: Alles auswählen

sub loesche_wenn_datum
	oSheet = ThisComponent.CurrentController.getActiveSheet()
	oCursor = oSheet.CreateCursor
	oCursor.GotoEndOfUsedArea(false)
	nEndrow = oCursor.Rangeaddress.EndRow
	for i = nEndrow to 0 step - 1
		oCell = oSheet.GetCellByPosition(4,i)'4 entspricht Spalte E
		if cdate(oCell.value) < cdate("01.01.2017") then
			oSheet.Rows.RemoveByIndex(i,1)
		endif
	next i
end sub
Wie kann ich die Zeile mit den Überschriften ausklammern?

Benutzeravatar
karolus
Beiträge: 2170
Registriert: Fr 10. Dez 2010, 10:01

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von karolus » Fr 30. Jun 2017, 12:53

Hallo
Wie kann ich die erste Zeile ausklammern?
Na vielleicht indem du den Schleifenindex statt bis 0, eben nur bis 1 laufen lässt.

……………………for i = nEndrow to 1 step - 1
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Datum kleiner als 01.01.2017 und weiteres

Beitrag von mikele » Fr 30. Jun 2017, 14:22

Hallo,
Gibt es irgendwo eine Übersicht mit den Bedeutungen dieser Zahlen?
https://wiki.openoffice.org/wiki/Docume ... er_Options
Gruß,
mikele

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten