[gelöst] Können Makros dateiübergreifend aufgezeichnet werden?

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: [gelöst] Können Makros dateiübergreifend aufgezeichnet werden?

Re: [gelöst] Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » So, 07.05.2023 10:06

Danke,
ich werde vorbauend gleich alle Großbuchstaben in Datei- und Verzeichnisnamen auf Kleinbuchstaben ändern.

Re: [gelöst] Können Makros dateiübergreifend aufgezeichnet werden?

von Hiker » So, 07.05.2023 00:56

Grundsätzlich laufen die Macros auch unter Linux. Problematisch sind absolute Dateinamen wie bei Dir

Code: Alles auswählen

convertToURL("f:\SVSTST\Daten.csv")
Ähnliche Fallen gibt es bei Gross- und Kleinschreibung, die bei Windows für Dateien ignoriert wird. Datei.csv findet unter Windows also auch datei.CSV aber eben nicht unter Linux.

Von Open nach LibreOffice funktioniert auch fast alles, bei LibreOffice muss man auf Neuerungen verzichten, die OpenOffice nicht kennt...

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Sa, 06.05.2023 18:34

Danke, das werde ich so ändern denn ich brauche das immer nur zwischen 2 Dokumenten.

Aber eine andere Frage habe ich noch: ich verwende diesen Makro in Windows 10. Läuft der auch unter den anderen Betriebssystemen unter denen OpenOffice läuft und funktionieren diese Makros auch unter LibreOffice?
Eines erscheint mir klar: wenn jemand die Dokumente nach Excel konvertiert wird er auch die Makros neu schreiben müssen aber dieses Problem ist nicht mein Problem :)

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von mikeleb » Sa, 06.05.2023 18:00

Hallo,
schön, das es funktioniert. Den letzten Code könntest du noch etwas vereinfachen (wenn du den Pfad nicht noch für etwas anderes brauchst):

Code: Alles auswählen

	surl = thiscomponent.url
	apfad = split(surl,"/")
	apfad(ubound(apfad)) = "Daten.csv"
   	sURL = convertToURL(join(apfad,"/"))
   	oCSV = StarDesktop.LoadComponentFromURL(sURL, "_blank", 0, args())

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Sa, 06.05.2023 17:46

Gelöst!
Ich habe einen Code gefunden der den Name der aktuellen Directory in eine Variable speichert: das sieht jetzt so aus:

Code: Alles auswählen

	surl = thiscomponent.url
	apfad = split(surl,"/")
	apfad(ubound(apfad)) = ""
	spfad = join(apfad,"/")
   	sURL = convertToURL(spfad+"Daten.csv")
   	oCSV = StarDesktop.LoadComponentFromURL(sURL(0), "_blank", 0, args())
Nachdem das jetzt so funktioniert wie es meine Anwendung optimal ist bedanke ich mich noch einmal für die großartige Hilfe. Durch mein Suchen nach Code-Beispielen bin ich zwar nicht in die Geheimnisse der "Nicht-Basic-Codes" eingedrucngen habe aber doch eine gewisse vage Vorstellung gewonnen wie diese funktionieren. Für die nächste Zeit habe einiges zu tun, um meine Anwendung mit aufzeichenbaren Makros zu vervollständigen. Wenn ich dann zu den Übertragungen von ODS zu ODS komme werde ich versuchen das bisher gelernte (oder abgeschriebene ;-))) anzupassen. Wahrscheinlich ergeben sich dann wieder Fragen mit denen ich mich gerne wieder an euch wenden werde.

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Sa, 06.05.2023 17:14

Ich hab es gefunden!
Im Internet habe ich den Code gefunden, der nach wenigen Adaptionen funktioniert hat. Im folgenden Code ist der Originalcode von mikeleb mit ' auf REM gesetzt und der von mir an seiner Stelle eingesetzte darunter geschrieben.

Code: Alles auswählen

'*****************************************************************
	'Dialog zur Dateiauswahl
	'ein Startverzeichnis kann optional vorgegeben werden
'	sUrl= FileOpenDialog("csv-Datei auswählen","")
'	if isarray(sUrl) then
'			oCSV=StarDesktop.LoadComponentFromURL(sUrl(0), "_blank",0,args())
'	end if
'*******************************************************************
    sURL = convertToURL("f:\SVSTST\Daten.csv")
    oCSV = StarDesktop.LoadComponentFromURL(sURL(0), "_blank", 0, args())
 '*******************************************************************
Das einzige was jetzt stört ist, dass man das komplette Verzeichnis in den Code schreiben muss. Das bedeutet, dass der Anwender diese Applikation auch auf diese Partition und in dieses Verzeichnis speichern muss. Die zu öffnende Datei liegt im gleichen Verzeichnis wie die geöffnete. Wenn man im Macro die Angabe der Partion und des Verzeichnissen umgehen könnte wäre das ein Hit!

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Sa, 06.05.2023 16:41

@mikeleb und Hiker,
dank eurer Hilfe funktioniert das Makro jetzt gut. Nach dem Kopieren der Bereiche aus der csv-Datei in die entsprechenden Bereiche der ods-Datei wird die csv-Datei geschlossen. Jetzt kann ich den Rest des "Zellenschaufelns", wie schon früher gemacht, als Makro aufzeichnen.
Allerdings wäre es für den Anwender gut wenn er die csv-Datei nicht aus der Liste wählen muss sondern die csv-Datei von selbst geöffnet wird, da es immer die gleiche Datei ist (wenn sich auch der Inhalt ändert).
D.h. der im folgenden Code (der nur eine Anpassung des Codes von Mikeleb ist) soll der mit ************ markierte Code durch ein "open file" ersetzt werden. D.h. die csv-Datei wird geöffnet, ohne dass der Anwender es merkt.
Ich habe zwar versucht das aus verschiedenen Beispielen, die ich im Netz gefunden habe "zusammenzubauen" hatte aber keinen Erfolg.

Wenn dieses Makro so funktioniert dürfte es für mich kein Problen sein es für andere Bereichsübertragungen zwischen 2 ods-Dateien zu adaptieren (nehme ich zumindest an).

Nochmals vielen Dank für eure Hilfe und ich hoffe, dass ihr mir mit dem oben genannten auch weiterhelft, danke!

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von mikeleb » Fr, 05.05.2023 11:37

Hallo,

Code: Alles auswählen

oCSV.close(false)

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von Hiker » Fr, 05.05.2023 11:04

Da Du Deinen Code nicht hier eingesetzt hast, kommentiere ich mikeles...

Der Code kennt 2 referenzen, einmal oDoc, abgeleitet aus ThisDocument am Anfang und oCSV, der beim Öffnen des zweiten documents zurückgegeben wurde. Mit diesen kannst Du sie auch schliessen.

Falls Du natürlich einen Code gefunden hast, mit dem das "aktive" Dokument, das den Eingabefokus hat, geschlossen wird, müsstest Du den Fokus entsprechend anpassen, oder anderen Code suchen/finden.

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Do, 04.05.2023 23:16

Mit Hilfe des Codes von mikeleb konnte ich die aus der CSV-Datei zu holenden Spalten problemlos in die ODS-Tabelle übertragen. Die im folgenden benötigten Verarbeitungen kann ich aufzeichnen und in dieses Makro integrieren. Da sehe ich kein Problem weil ich diese Verarbeitungen schon mit einem aufgezeichneten Makro gelöst habe.
Was die Aufzeichnung allerdings stört ist, dass nach der Übernahme der Daten aus der CSV-Datei die Tabelle datei.csv am Schirm zu sehen ist und nicht die Datei datei.ods, die die Daten empfangen hat. Ich habe versucht diesen Wechsel mit Fenster und Auswahl der anderen Tabelle aufzuzeichnen. Das habe ich testweise zwischen zwei ods-Dateien gemacht weil man in der csv-datei keine Macros aufzeichnen kann. Leider wurde dabei gar nichts aufgezeichnet. Offenbar lässt sich dieser Vorgang nicht aufzeichnen.
In diesem Fall würde es mir schon genügen wenn die Datei datei.csv geschlossen würde weil ich sie nicht mehr benötige.
Ich habe zwar einen Code gefunden mit dem man eine Datei schließen kann aber zu diesem Zeitpunkt wird im Macro die ODS-Datei referenziert und daher diese geschlossen. Ich weiß nicht wie ich den Bezug wieder auf die CSV-Datei legen kann.

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Do, 04.05.2023 16:43

@ mikeleb
nochmals herzlichen Dank für dieses Makro! ich habe es leicht modifiziert weil ich von den 18 Spalten der CSV-Datei nur 5 benötige. Dazu habe ich die Zeilen für Ein- und Auslesen kopiert und in jede Zeile den entsprechenden Bereich eingetragen. Und das funktioniert auch wenn die Ausgabe auf eine Tabelle erfolgt, die im vorderen Bereich schon Daten enthält. Den Rest der noch notwendig ist, nämlich das Löschen der gerade eingelesenen Zeilen wenn in der Spalte Inaktivdatum ein Datum eingetragen ist. Das hatte ich schon mit Makroaufzeichnen gelöst oder ginge das auch schon beim Übernehmen der Bereiche wobei ich allerdings die Schwierigkeit sehe weil ich in mehreren Teilbereichen einlese in denen diese Spalte gar nicht vorkommt.
Ein echtes Problem ist, dass bei Übernehmen der Texte die Umlaute nicht richtig angezeigt werden sondern Sonderzeichen zeigen. Bei der manuellen Konvertierung hatte ich den Zeichensatz auf Unicode (UTF-8) gesetzt.

Edit: das Problem mit dem Zeichensatz konnte ich lösen, habe eine Internetseite zu LibreOffice gefunden, die eine Liste der Codes enthält.
https://help.libreoffice.org/latest/de/ ... arams.html

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Do, 04.05.2023 15:01

@ mikeleb
danke für dieses Beispiel! Nachdem ich die Daten aus einem Vorsysten als CSV-Datei erhalte könnte mir das eine Zwischentabelle ersparen. Ich werde mir das Beispiel genau ansehen.

@Hiker
ja, mit der Aussage zu Basic und die Library (UNO) etc. hast du recht! Die Dokumente von Dannenhöfer und Pitoniak habe ich mir schon etwas angesehen aber da durchzukommen wird etwas dauern.

Auf jeden Fall ein herzliches Dankeschön für eure Hilfe! Auch wenn ich mich jetzt länger nicht melde, ich bleibe dran!

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von Hiker » Di, 02.05.2023 20:34

kilix hat geschrieben: Di, 02.05.2023 18:44 ... Ich habe zwar schon Basic programmiert (zuletzt FreeBasic) aber das hier verwendete Basic verstehe ich ohne Anleitung nicht. Ich habe zwar schon Im Internet nach einer Anleitung gesucht aber noch nicht gefunden.
...
Basic dürfte Dir kaum Probleme machen, aber die Library (UNO) in der LibreOffice/ OpenOffice/ StarOffice den Zugang zu den Dokumenten und Strukturen verpackt ist "etwas" unübersichtlich. Ausserdem sind Ansätze wie Objektorientierung, Unicode, Modularisierung bei BASIC nicht gerade systemimmanent...

Startpunkte:
Dannenhöfer:
http://www.dannenhoefer.de/faqstarbasic/index.html

Pitonyak
https://www.pitonyak.org/oo.php
(es gibt auch eine deutsche Übersetzung)

und eine "Sammelfrage":
https://ask.libreoffice.org/t/libreoffi ... ning/74539

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von mikeleb » Di, 02.05.2023 20:28

Hallo,
da ich gerade so ein ähnliches Makro da hatte, mal ein Beispiel, wie es aussehen könnte.
Wenn du die Sub csv_import aufrufst, öffnet sich ein Dialog zum Auswählen und Öffnen der cvs-Datei. Aus dieser werden die Daten aus der 1. Tabelle Zellen B1:B20 ausgelesen und in die odt-Datei, 1.Tabelle Zellen D11:D30 geschrieben.

Code: Alles auswählen

Sub csv_import

	'Zugriff auf die aktuelle Datei
	oDoc=ThisComponent
	
	'Öffnen der csv-Datei
	Dim args(1) as New com.sun.star.beans.PropertyValue
	args(0).Name= "FilterName"
	args(0).Value = "Text - txt - csv (StarCalc)"
	
	'ASCII-Codes 44 (Komma), 32 (Leerzeichen), 9 (Tabulator)
	'Mehrfachauswahl durch / trennen, z. B. 44/9
	sFeldSeparator="44"
	'ASCII-Codes 34 (doppelte Hochkomma), 39 (einfache Hochkomma)
	sTextBegrenzer="34"
	'Systemzeichensatz 0
	sZeichensatz="0"
	'erste einzulesende Zeile
	sErste="1"
	'Spaltenformat für jede Spalte festlegen
	'Spalte/Format/Spalte/Format/...
	'Formate: 1 Standard, 2 Text, 3 Datum (MTJ), 4 Datum (TMJ), 5 Datum (JMT), 9 nicht importieren, 10 US-englisch
	'nicht aufgeführte Spalten werden als Standard importiert
	sSpaltenFormate="1/1/2/1/3/1/4/1"
	args(1).Name="FilterOptions"
	args(1).Value =sFeldSeparator & "," & sTextBegrenzer & "," & sZeichensatz & "," & sErste & "," & sSpaltenformate
	'Dialog zur Dateiauswahl
	'ein Startverzeichnis kann optional vorgegeben werden
	sUrl= FileOpenDialog("csv-Datei auswählen","")
	if isarray(sUrl) then
			oCSV=StarDesktop.LoadComponentFromURL(sUrl(0), "_blank",0,args())
	end if
	'Auslesen der Daten in ein Array der Daten
	aDaten=oCSV.Sheets(0).getCellRangeByName("B1:B20").getDataArray
	'Schreiben der Daten in die aktuelle Datei
	oDoc.Sheets(0).getCellRangeByName("D11:D30").setDataArray(aDaten)
	
End Sub

function FileOpenDialog(sTitle as String, optional sStartverzeichnis as string) 
    if ismissing(sStartverzeichnis) then
    	oPS=CreateUnoService("com.sun.star.util.PathSettings")
    	sStartverzeichnis=oPS.work
    end if
    oFilepicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
    oFilepicker.Title = sTitle  
    oFilepicker.appendFilter("Alle Dateien", "*.*")
    oFilepicker.appendFilter("csv-Dateien", "*.csv")
    oFilepicker.setCurrentFilter("csv-Dateien")
	oFilepicker.setMultiSelectionMode(true)
	oFilepicker.setDisplayDirectory(converttourl(sStartverzeichnis)) 	
	if oFilepicker.execute()=1 then
		FileOpenDialog = oFilepicker.getSelectedFiles()
	else
		FileOpenDialog=""
	end if
End function
Dateianhänge
beispiel_csv_auslesen.ods
(8.92 KiB) 89-mal heruntergeladen

Re: Können Makros dateiübergreifend aufgezeichnet werden?

von kilix » Di, 02.05.2023 18:44

Ja, mikeleb, genau das habe ich mir nach weiteren Versuchen gedacht. Denn erstens hat es nur funktioniert solange OO nicht geschlossen wurde. D.h. es wurde immer der selbe Inhalte der Zwischenablage vom Erstellen des Makro mit dem Makrorecorder eingelesen. Sobald ich aber OO beendet und wieder aufgerufen hatte wurde nichts kopiert. Zum Zweiten fehlt mir jeder Hinweise auf die Datei aus der ich den Bereich kopieren will (soweit hab ich den Code schon verstanden, wenn ich ihn auch sonst kaum verstehe).
D.h., um dieses Aufgabe mit einem Makro lösen zu können müsste ich den Code für den Makro erstellen. Ich habe zwar schon Basic programmiert (zuletzt FreeBasic) aber das hier verwendete Basic verstehe ich ohne Anleitung nicht. Ich habe zwar schon Im Internet nach einer Anleitung gesucht aber noch nicht gefunden.
Ich habe zwar hier https://users.de.openoffice.narkive.com ... i-kopieren einen Code gefunden, der einen Bereich einer Datei in die Zwischenablage kopieren soll und einen zweiten Code der die Zwischenablage in die andere Datei speichern soll. Aber auch hier finde ich keine Dateinamen etc.

Nach oben