vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

Ich würde mich sehr freuen wenn mir jemand zumindest den Teil mit dem Ausfüllen des 2. Arbeitsblattes helfen kann.

Öffnen, Speichern und Schließen habe ich inzwischen lösen können, zwar statisch aber dann schreibe ich die Datei eben fortlaufend weg - das passt für mich.
Wie wäre es denn mit etwas Geduld? Sicherlich schauen bereits Etliche auf Deine Frage und denken über Lösungen nach, aber hier ist ein Forum von Freiwilligen das Hilfe zur Selbsthilfe geben will und kein kostenloser Support um für komplexe Fragen binnen Stunden den fertigen vollständigen Code zu liefern.
-Kopieren weniger Datensätze von aktiver zu geöffneter Mappe:
Quelle: B6:B18
Ziel Transponiert in Arbeitsmappe Daten Arbeitsblatt Daten Zellen A[r]:M[r] wobei r die nächste freie Zeile ist
hierfür allgemeinen Code anzugeben ist schwierig, weil beide Mappen jeweils ein Dokumentobjekt darstellen und also in einer Objektvariable beeinhaltet sein müssen. Die URSPRÜNGLICH (zu Beginn aller Makroaktionen) aktive Mappe ist durch ThisComponent repräsentiert, die andere Mappe musst Du direkt beim Öfnen per Makro einer Objektvariable zu weisen, also skizzenhaft:

Code: Alles auswählen

quelldatei = ThisComponent
quelltabellenblatt = ThisComponent.CurrentController.ActiveSheet
http://www.starbasicfaq.de/Wiekannmanda ... rmitt.html

und

Code: Alles auswählen

zieldatei = StarDesktop.loadComponentFromUrl(...)
zieltabellenblatt = zieldatei.Sheets.getByName("meinTabellenblatt")
http://www.starbasicfaq.de/Wiekannmanei ... l#Zweig135
http://www.starbasicfaq.de/Wiekannmanau ... ugrei.html

r ermitteln:

Code: Alles auswählen

oCellCursor = zieltabellenblatt.createCursor
oCellCursor.GotoEndOfUsedArea(False)
r = oCellCursor.getRangeAddress().endRow + 1
http://www.starbasicfaq.de/Wiekannmandi ... palte.html

und nun den Rest am simpelsten per Makrorecoder aufzeichnen und anpassen.

B6:B18 kopieren (vorausgesetzt das richtige Tabellenblatt der Quelltabelle ist das sichtbare Tabellenblatt):

Code: Alles auswählen

dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = quelldatei.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 = "$B$6:$B$18"

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

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
richtige Zelle in Zieldatei selektieren:

Code: Alles auswählen

myView = zieldatei.CurrentController
mysheet = zieldatei.sheets.getByName("DasTabellenblatt") 
mycell =  mysheet.getCellByPosition(0,r)
myView.Select(mycell)
http://www.starbasicfaq.de/Wiekannmande ... l#Zweig174

und transponiert einfügen:

Code: Alles auswählen

document   = zieldatei.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args2(5) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Flags"
args2(0).Value = "A"
args2(1).Name = "FormulaCommand"
args2(1).Value = 0
args2(2).Name = "SkipEmptyCells"
args2(2).Value = false
args2(3).Name = "Transpose"
args2(3).Value = true
args2(4).Name = "AsLink"
args2(4).Value = false
args2(5).Name = "MoveMode"
args2(5).Value = 4

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

Alle Vorstehende NUR Skizzen und kein komplett fertiger Code!
Formel in Arbeitsmappe Daten Arbeitsblatt Daten einfügen: N[r] = N$2*A[r]
- Formel automatisch nach rechts erweitern bis Spalte Z: Z[r] = Z$2*M[r]
- Formel in Arbeitsmappe Daten Arbeitsblatt Daten einfügen: AA[r] = Summe(N[r]:Z[r])
Einstieg:
http://www.starbasicfaq.de/WiekannmanWe ... hreib.html
http://de.openoffice.info/viewtopic.php?t=31086


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

Bei mir funktioniert Dein Code ohne Fehlermeldung.

Du müsstest also bitte mitteilen was falsch ist.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

Ich habe es heute nochmal versucht und noch ein paar Dinge angepasst, aber wie ich es auch anstelle, die Kopiervorgänge bleiben leider ohne Erfolg.
zumindest der erste Kopiervorgang klappt, einzig ist r um Eins zu hoch also, entferne das "+1" In zielzeile_int = oCellCursor.getRangeAddress().endRow + 1


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

bei mir klappt es leider nicht, ich kann nicht
Dann muss Du den Code debuggen. Ich habe keine Ahnung und kann hier auch nicht prüfen, was auf Deinem System anders ist.

z.B. schreibe "Exit Sub" in den Code direkt nach der ersten Kopieranweisung:

Code: Alles auswählen

'...
		
	'Anzahl transponiert einfügen
	dim args_ziel_anz(5) as new com.sun.star.beans.PropertyValue
	args_ziel_anz(0).Name = "Flags"
	args_ziel_anz(0).Value = "SVD"
	args_ziel_anz(1).Name = "FormulaCommand"
	args_ziel_anz(1).Value = 0
	args_ziel_anz(2).Name = "SkipEmptyCells"
	args_ziel_anz(2).Value = false
	args_ziel_anz(3).Name = "Transpose"
	args_ziel_anz(3).Value = true
	args_ziel_anz(4).Name = "AsLink"
	args_ziel_anz(4).Value = false
	args_ziel_anz(5).Name = "MoveMode"
	args_ziel_anz(5).Value = 4
	
	dispatcher.executeDispatch(zielframe, ".uno:InsertContents", "", 0, args_ziel_anz())

	Exit Sub

	'Datum und Zeit kopieren

'...
dann bleibt Daten.ods geöffnet und Du kannst sehen wo das Kopierte landet, bei mir jedenfalls hier:

erster Kopiervorgang.gif
erster Kopiervorgang.gif (10.71 KiB) 4117 mal betrachtet


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

Ich verstehe dann nicht recht, warum es bei mir funktioniert hat.

Du musst Dich aber keine besonderen Verrenkungen wegen des Fokus machen, sondern es sollte dafür genügen die Reihenfolge im Code zu ändern wie folgt:

Code: Alles auswählen

	'...
	quelldatei = ThisComponent
	quellframe = ThisComponent.CurrentController.Frame
	quell_ws = ThisComponent.CurrentController.ActiveSheet
	
	'Anzahl kopieren
	dim args_quell_Anzahl(0) as new com.sun.star.beans.PropertyValue
	args_quell_Anzahl(0).Name = "ToPoint"
	args_quell_Anzahl(0).Value = "$B$6:$B$18"

	dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args_quell_Anzahl())
	dispatcher.executeDispatch(quellframe, ".uno:Copy", "", 0, Array())

	'Exit Sub	
	
	path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
	path = "file:///C:/Users/rig/Desktop/trash/Neu/"

	zieldateiurl = path & "Daten.ods"		
  
	'Öffnen des Ziel-Dokumentes
	zieldatei = StarDesktop.loadComponentFromURL(zieldateiurl, "_blank", 0, zieldateiprop())
	zielframe = zieldatei.CurrentController.Frame
  	ziel_ws = zieldatei.Sheets.getByName("Daten")
	'...
(vorstehend ist "Exit Sub" auskommentiert, entferne das Hochkomma dann stopt der Code und Du kannst Dich mabuell überzeugen das die Werte in die Zwischenablage kopiert sind, indem Du sie manuell mit der Maus einzufügen versuchst, NACHDEM der Code vorher gelaufen ist)




Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

Alternativ kann ich mir auch vorstellen [...]
Also eigentlich könnte der ganze Code ohne dieses dämliche Copy-Paste auskommen, was uns (komischerweise) aufhält, obwohl ich es ursprünglich genannt habe um die Dinge zu vereinfachen (das Copy-Paste übernimmt auch Formatierungen und ist deshalb quasi bequemer - besserer Code ist es hingegen nichht, weder bei VBA noch bei StarBasic).

Du kannst statt:

Code: Alles auswählen

Sub save_to_pdf
rem ----------------------------------------------------------------------
rem define variables
	dim quelldatei 
	dim quell_ws
	Dim quellframe
	dim zielframe
	dim zieldatei
	dim ziel_ws
	dim time as string
	dim date as string
	dim path as string
	dim zieldateiurl as string
	dim zieldateiprop() as new com.sun.star.beans.PropertyValue
	dim zielzeile_int as long	'interne Zeilnnummer beginnt mit Zählung bei 0
	dim zielzeile_ext as long	'externe Zeilennummer beginnt mit Zählung bei 1
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

		
	quelldatei = ThisComponent
	quellframe = ThisComponent.CurrentController.Frame
	quell_ws = ThisComponent.CurrentController.ActiveSheet
	
	path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
	path = "file:///C:/Users/rig/Desktop/trash/Neu/"

	zieldateiurl = path & "Daten.ods"		
  
	'Öffnen des Ziel-Dokumentes
	zieldatei = StarDesktop.loadComponentFromURL(zieldateiurl, "_blank", 0, zieldateiprop())
	zielframe = zieldatei.CurrentController.Frame
  	ziel_ws = zieldatei.Sheets.getByName("Daten")

	'Zielzeile bestimmen
	oCellCursor = ziel_ws.createCursor
	oCellCursor.GotoEndOfUsedArea(False)
	zielzeile_int = oCellCursor.getRangeAddress().endRow + 1
	zielzeile_ext = zielzeile_int + 1
	
	'Anzahl kopieren
	dim args_quell_Anzahl(0) as new com.sun.star.beans.PropertyValue
	args_quell_Anzahl(0).Name = "ToPoint"
	args_quell_Anzahl(0).Value = "$B$6:$B$18"

	dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args_quell_Anzahl())
	dispatcher.executeDispatch(quellframe, ".uno:Copy", "", 0, Array())

	zielzelle = ziel_ws.getCellByPosition(0, zielzeile_int)
	zieldatei.CurrentController.Select(zielzelle) 

	dim args_ziel_Anzahl(0) as new com.sun.star.beans.PropertyValue
	args_ziel_Anzahl(0).Name = "ToPoint"
	args_ziel_Anzahl(0).Value = "$A$" & zielzeile_ext & ":$M$" & zielzeile_ext
	
	dispatcher.executeDispatch(zielframe, ".uno:GoToCell", "", 0, args_ziel_Anzahl())
		
	'Anzahl transponiert einfügen
	dim args_ziel_anz(5) as new com.sun.star.beans.PropertyValue
	args_ziel_anz(0).Name = "Flags"
	args_ziel_anz(0).Value = "SVD"
	args_ziel_anz(1).Name = "FormulaCommand"
	args_ziel_anz(1).Value = 0
	args_ziel_anz(2).Name = "SkipEmptyCells"
	args_ziel_anz(2).Value = false
	args_ziel_anz(3).Name = "Transpose"
	args_ziel_anz(3).Value = true
	args_ziel_anz(4).Name = "AsLink"
	args_ziel_anz(4).Value = false
	args_ziel_anz(5).Name = "MoveMode"
	args_ziel_anz(5).Value = 4
	
	dispatcher.executeDispatch(zielframe, ".uno:InsertContents", "", 0, args_ziel_anz())
	
	'...

End Sub

auch verwenden:

Code: Alles auswählen

Sub save_to_pdf
rem ----------------------------------------------------------------------
rem define variables
	dim quelldatei 
	dim quell_ws
	Dim quellframe
	dim zielframe
	dim zieldatei
	dim ziel_ws
	dim time as string
	dim date as string
	dim path as string
	dim zieldateiurl as string
	dim zieldateiprop() as new com.sun.star.beans.PropertyValue
	dim zielzeile_int as long	'interne Zeilnnummer beginnt mit Zählung bei 0
	dim zielzeile_ext as long	'externe Zeilennummer beginnt mit Zählung bei 1
	Dim daten
	
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

		
	quelldatei = ThisComponent
	quellframe = ThisComponent.CurrentController.Frame
	quell_ws = ThisComponent.CurrentController.ActiveSheet
	
	path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
	path = "file:///C:/Users/rig/Desktop/trash/Neu/"

	zieldateiurl = path & "Daten.ods"		
  
	'Öffnen des Ziel-Dokumentes
	zieldatei = StarDesktop.loadComponentFromURL(zieldateiurl, "_blank", 0, zieldateiprop())
	zielframe = zieldatei.CurrentController.Frame
  	ziel_ws = zieldatei.Sheets.getByName("Daten")

	'Zielzeile bestimmen
	oCellCursor = ziel_ws.createCursor
	oCellCursor.GotoEndOfUsedArea(False)
	zielzeile_int = oCellCursor.getRangeAddress().endRow + 1
	zielzeile_ext = zielzeile_int + 1
	
	'lesen
	daten = quell_ws.getCellRangeByName("B6:B18").getDataArray()
	
	'schreiben
	For i = 0 To UBOUND(daten())
		ziel_ws.getCellByPosition(i, zielzeile_int).Value = daten(i) (0)				
	Next i
	
	'...
	
End Sub
Wahrscheinlich brauchst Du eine Erklärung für:

Code: Alles auswählen

daten = quell_ws.getCellRangeByName("B6:B18").getDataArray()
damit liest Du die DAten eines Bereiches (hier also B6:B18) in ein Array das so viele Zellen hat wie der Bereich Zeilen und in jeder Zelle wiederum ein Array mit sovielen Zellen wie der Bereich Spalten hat.

in:

Code: Alles auswählen

ziel_ws.getCellByPosition(i, zielzeile_int).Value = daten(i) (0)
entspricht "daten(i) (0)" dem Wert der i-ten Zeile und der ersten Spalte des ursrünglichen Datenbereiches. Bezpgen auf Dein Beispiel entspräche "daten(3) (0)" also dem Wer aus Zelle B9 und "daten(0) (0)" dem Wert aus B6.

man könnte auch schreiben (was ggf. anfänger-verständlicher wäre):

Code: Alles auswählen

For i = 0 To UBOUND(daten())
	tmp_daten = daten(i)
	ziel_ws.getCellByPosition(i, zielzeile_int).Value = tmp_daten(0)				
Next i


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

Ich hatte vermutet das Du das Makro nicht über den Button gestartet hast sondern über die Makroauswahl ?
Nein, habe ich nicht.

Ich verstehe auch Deine ganze Annahme mit dem Fokus nicht und halte mich nur zurück das zu kritisieren, weil mich das Programierer-Leben gelehrt hat, das manchmal die komischten Dinge passieren können.
das sieht wirklich gut aus und werde ich jetzt mal umsetzen
Ja, tue das, es ist eigentlich der bessere Weg.


GRuß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vorhandene Arbeitsmappe öffnen und Daten aus aktiver Arbeitsmappe einfügen & Speichern

Beitrag von Stephan »

Ich verstehe auch Deine ganze Annahme mit dem Fokus nicht und halte mich nur zurück das zu kritisieren, weil mich das Programierer-Leben gelehrt hat, das manchmal die komischten Dinge passieren können.
Das ganze Fokus-Problem scheint nur bei LibreOffice zu bestehen, hingegen funktioniert OpenOffice diesbezüglich einwandfrei.

Getestet mit der angehängten Beispieldatei.


Gruß
Stephan
Dateianhänge
fokustest.ods
(9.55 KiB) 68-mal heruntergeladen
Antworten