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

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

Moderator: Moderatoren

Richarde

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

Beitrag von Richarde »

Hallo Zusammen,
ich bin komplett Neu hier und hoffe auf eure Hilfe,
ich habe schon einige Excel VBA Erfahrung aber da ich nun für einen Verein ein Makro bauen möchte und dieser Verein keine Office nutzen soll für die Funktion möchte ich das in LibreOffice realisieren.

Aufgabenstellung:

In einer geöffnete Arbeitsmappe wird ein Makro gestartet, dieses
- öffnet eine Arbeitsmappe aus einem Verzeichnis (Selektion über Zeitstempel Erstellung oder über Dateinamensortierung, die Dateien im Verzeichnis heißen Daten_yyyymmdd_hhmmss.ods - über welchen zugriff man einfacher die letzte Schnappt weiß ich nicht)
- 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
- 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])
- Daten aus aktiver Arbeitsmappe B2:B3 kopieren
Ziel Transponiert in Arbeitsmappe Daten Arbeitsblatt Daten Zellen AB[r]:AC[r] einfügen

Arbeitsmappe Daten unter neuem Namen im Ursprungsverzeichnis speichern.

Die beiden Dateien habe ich mal angehängt, dann wird es anschaulicher. Es wäre sehr Mega wenn sich hier jemand die Zeit für mich nehmen kann, per Makrorekorder bin ich leider nicht weit gekommen, denn die Öffnen, Speichern, kopieren in andere Mappe Vorgänge wurden nicht aufgezeichnet :-(
Kassenzählprotokoll.ods
(16.79 KiB) 3-mal heruntergeladen
Daten_DDDDDDDD_TTTTTT.ods
(10.2 KiB) 4-mal heruntergeladen
Vielen Dank für euere Zeit und Hilfe
Richarde
Richarde

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

Beitrag von Richarde »

Hallo nochmal zusammen,

also ich habe jetzt ein paar Stunden herumprobiert... grausam so eine neue Sprache :-)
man muss wirklich alles nachschlagen.

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.

Was nun noch fehlt und mich zur Verzweiflung bringt ist:

-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
- 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])
- Daten aus aktiver Arbeitsmappe B2:B3 kopieren
Ziel Transponiert in Arbeitsmappe Daten Arbeitsblatt Daten Zellen AB[r]:AC[r] einfügen

Vielen Dank an alle und viele Grüße
Stephan
********
Beiträge: 12317
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
Richarde

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

Beitrag von Richarde »

Hallo und vielen Dank für Deine Antwort
Stephan hat geschrieben: Fr, 10.09.2021 21:59 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.
Danke, das ist mir natürlich klar, mein zweiter Post diente nicht dem "Druck aufbauen" oder sollte nicht ungeduldig rüberkommen, ich wollte zeigen das ich es selbst auch versuche und das mir Teile der Aufgabenstellung wichtiger sind als andere.
Stephan hat geschrieben: Fr, 10.09.2021 21:59 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:
Danke, mit den Objekten in dieser Sprache habe ich die meisten Probleme - aller Anfang ist schwer :-)
Stephan hat geschrieben: Fr, 10.09.2021 21:59 und nun den Rest am simpelsten per Makrorecoder aufzeichnen und anpassen.
Ja, das klappt zumindest nicht komplett, den PDF Teil der hier nicht erwähnt wurde habe ich ja schon fertig gehabt und per Recorder und etwas basteln zusammengefriemelt. Der Rekorder zeichnet aber interaktionen zwischen Mappen zumindest bei mir nicht auf. Ich habe mir aber jetzt geholfen in dem ich zum Aufzeichnen der Befehle in einer Mappe bleibe und dann die von Dir gelernten Objektreferenzen davor setze.

Dies ist nun mein Code, er funktioniert nicht aber ich finde den Fehler auch trotz debugger nicht. Er kopiert wohl die flaschen Daten. Ich hoffe das mit Frame habe ich richtig gemacht, das ist eigentlich mehr geraten.
Vielleicht kann sich den Code mal jemand anschauen und findet die Ursache?

Im Teil "Anzahl kopieren" kommt es zum Fehler, er kopiert mir daten aus dem Zielarbeitsblatt ins Zeilarbeitsblatt - wobei ich nicht weiß woher er die Range nimmt.

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 as long
	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 = oCellCursor.getRangeAddress().endRow + 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)
	zieldatei.CurrentController.Select(zielzelle) 
	
	'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 = "A"
	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())

	'Werte berechnen		
	zielzelle = ziel_ws.getCellByPosition(14, zielzeile)
	zielzelle.formula = "= N$2*A" & zielzeile
	
	'weiter ausfüllen
	dim args_fill(0) as new com.sun.star.beans.PropertyValue
	args_fill(0).Name = "ToPoint"
	args_fill(0).Value = "$N$" & zielzeile
	
	dispatcher.executeDispatch(zielframe, ".uno:GoToCell", "", 0, args_fill())
	
	
	dim args_fill2(0) as new com.sun.star.beans.PropertyValue
	args_fill2(0).Name = "EndCell"
	args_fill2(0).Value = "$Z$" & zielzeile
	
	dispatcher.executeDispatch(zielframe, ".uno:AutoFill", "", 0, args_fill2())	
	
	'Summe berechnen		
	zielzelle = ziel_ws.getCellByPosition(27, zielzeile)
	zielzelle.formulalocal = "=SUM(N" & zielzeile & ":Z" & zielzeile & ")"
	
	'Datum und Zeit kopieren
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	
	dim args_datetime(0) as new com.sun.star.beans.PropertyValue
	args_datetime(0).Name = "ToPoint"
	args_datetime(0).Value = "$AG$2:$AH$3"
	
	dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args_datetime())
	dispatcher.executeDispatch(quellframe, ".uno:Copy", "", 0, Array())
	
	dim args_datetime_z(5) as new com.sun.star.beans.PropertyValue
	args_datetime_z(0).Name = "Flags"
	args_datetime_z(0).Value = "SVD"
	args_datetime_z(1).Name = "FormulaCommand"
	args_datetime_z(1).Value = 0
	args_datetime_z(2).Name = "SkipEmptyCells"
	args_datetime_z(2).Value = false
	args_datetime_z(3).Name = "Transpose"
	args_datetime_z(3).Value = true
	args_datetime_z(4).Name = "AsLink"
	args_datetime_z(4).Value = false
	args_datetime_z(5).Name = "MoveMode"
	args_datetime_z(5).Value = 4
	
	dispatcher.executeDispatch(zielframe, ".uno:InsertContents", "", 0, args_datetime_z())
	
	'Speichern des Dokumentes
	zieldatei.store()
	  
	'Schliessen des Dokumentes
	zieldatei.close(true)			
	
	'####################################################################################################
	

		
	Dim args3(0) as new com.sun.star.beans.PropertyValue
	args3(0).name = "ToPoint"
	args3(0).Value = "$B$6"
	
	dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args3())
	
	times = format(now, "hhmmss")
	dates = format(now, "yyyymmdd")
	
	dim args1(2) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "URL"
	args1(0).Value = path & "Kassenzaehlung_DDDDDDDD_TTTTTT.pdf"
	args1(1).Name = "FilterName"
	args1(1).Value = "calc_pdf_Export"
	args1(2).Name = "FilterData"
	args1(2).Value = Array(Array("UseLosslessCompression",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Quality",0,90,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ReduceImageResolution",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("MaxImageResolution",0,300,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTaggedPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SelectPdfVersion",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportNotes",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ViewPDFAfterExport",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarks",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SinglePageSheets",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenBookmarkLevels",0,-1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTransitionEffects",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsSkipEmptyPages",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportPlaceholders",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsAddStream",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportFormFields",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FormsType",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("AllowDuplicateFieldNames",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerToolbar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerMenubar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerWindowControls",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ResizeWindowToInitialPage",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("CenterWindow",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenInFullScreenMode",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("DisplayPDFsource_docTitle",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialView",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Magnification",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Zoom",0,400,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PageLayout",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FirstPageOnLeft",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialPage",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Printing",0,2,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Changes",0,4,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableCopyingOfContent",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableTextAccessForAccessibilityTools",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportLinksRelativeFsys",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PDFViewSelection",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ConvertOOoTargetToPDFTarget",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarksToPDFDestination",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("_OkButtonString",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Watermark",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EncryptFile",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPasswords",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("RestrictPermissions",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPermissionPassword",0,Array(),com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Selection",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureLocation",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureReason",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureContactInfo",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignaturePassword",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureCertificate",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureTSA",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseReferenceXObject",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE))
	
	args1(0).Value = Replace (args1(0).Value, "DDDDDDDD", dates)
	args1(0).Value = Replace (args1(0).Value, "TTTTTT", times)
	dispatcher.executeDispatch(quellframe, ".uno:ExportDirectToPDF", "", 0, args1())
		
	MsgBox("PDF erfolgreich gespeichert")


end sub
Ich Danke euch wie immer für euren Input und eure Zeit.

VG Richarde
Stephan
********
Beiträge: 12317
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
Richarde

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

Beitrag von Richarde »

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. Es gibt zwar keine Fehlermeldung, aber es wird nichts kopiert und die Zielzellen bleiben leer.

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())



	'Datum und Zeit kopieren
	dim args_datetime(0) as new com.sun.star.beans.PropertyValue
	args_datetime(0).Name = "ToPoint"
	args_datetime(0).Value = "$B$2:$C$3"
	
	dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args_datetime())
	dispatcher.executeDispatch(quellframe, ".uno:Copy", "", 0, Array())
	
	zielzelle = ziel_ws.getCellByPosition(27, zielzeile_int)
	zieldatei.CurrentController.Select(zielzelle) 	

	dim args11(0) as new com.sun.star.beans.PropertyValue
	args11(0).Name = "ToPoint"
	args11(0).Value = "$AB$4:$AC$4"

	dispatcher.executeDispatch(zielframe, ".uno:GoToCell", "", 0, args11())
	
	dim args_datetime_z(5) as new com.sun.star.beans.PropertyValue
	args_datetime_z(0).Name = "Flags"
	args_datetime_z(0).Value = "SVD"
	args_datetime_z(1).Name = "FormulaCommand"
	args_datetime_z(1).Value = 0
	args_datetime_z(2).Name = "SkipEmptyCells"
	args_datetime_z(2).Value = false
	args_datetime_z(3).Name = "Transpose"
	args_datetime_z(3).Value = true
	args_datetime_z(4).Name = "AsLink"
	args_datetime_z(4).Value = false
	args_datetime_z(5).Name = "MoveMode"
	args_datetime_z(5).Value = 4
	
	dispatcher.executeDispatch(zielframe, ".uno:InsertContents", "", 0, args_datetime_z())


	'Werte berechnen		
	zielzelle = ziel_ws.getCellByPosition(13, zielzeile_int)
	zielzelle.formula = "= N$2*A" & zielzeile_ext
	
	'weiter ausfüllen
	dim args_fill(0) as new com.sun.star.beans.PropertyValue
	args_fill(0).Name = "ToPoint"
	args_fill(0).Value = "$N$" & zielzeile_ext
	
	dispatcher.executeDispatch(zielframe, ".uno:GoToCell", "", 0, args_fill())
	
	
	dim args_fill2(0) as new com.sun.star.beans.PropertyValue
	args_fill2(0).Name = "EndCell"
	args_fill2(0).Value = "$Z$" & zielzeile_ext
	
	dispatcher.executeDispatch(zielframe, ".uno:AutoFill", "", 0, args_fill2())	
	
	'Summe berechnen		
	zielzelle = ziel_ws.getCellByPosition(26, zielzeile_int)
	zielzelle.formulalocal = "=SUMME(N" & zielzeile_ext & ":Z" & zielzeile_ext & ")"
	
	
	'Speichern des Dokumentes
	zieldatei.store()
	  
	'Schliessen des Dokumentes
	zieldatei.close(true)			
	
	'####################################################################################################
	

		
	Dim args3(0) as new com.sun.star.beans.PropertyValue
	args3(0).name = "ToPoint"
	args3(0).Value = "$B$6"
	
	dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args3())
	
	times = format(now, "hhmmss")
	dates = format(now, "yyyymmdd")
	
	dim args1(2) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "URL"
	args1(0).Value = path & "Kassenzaehlung_DDDDDDDD_TTTTTT.pdf"
	args1(1).Name = "FilterName"
	args1(1).Value = "calc_pdf_Export"
	args1(2).Name = "FilterData"
	args1(2).Value = Array(Array("UseLosslessCompression",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Quality",0,90,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ReduceImageResolution",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("MaxImageResolution",0,300,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTaggedPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SelectPdfVersion",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportNotes",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ViewPDFAfterExport",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarks",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SinglePageSheets",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenBookmarkLevels",0,-1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTransitionEffects",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsSkipEmptyPages",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportPlaceholders",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsAddStream",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportFormFields",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FormsType",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("AllowDuplicateFieldNames",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerToolbar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerMenubar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerWindowControls",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ResizeWindowToInitialPage",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("CenterWindow",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenInFullScreenMode",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("DisplayPDFsource_docTitle",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialView",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Magnification",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Zoom",0,400,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PageLayout",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FirstPageOnLeft",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialPage",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Printing",0,2,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Changes",0,4,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableCopyingOfContent",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableTextAccessForAccessibilityTools",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportLinksRelativeFsys",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PDFViewSelection",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ConvertOOoTargetToPDFTarget",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarksToPDFDestination",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("_OkButtonString",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Watermark",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EncryptFile",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPasswords",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("RestrictPermissions",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPermissionPassword",0,Array(),com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Selection",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureLocation",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureReason",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureContactInfo",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignaturePassword",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureCertificate",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureTSA",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseReferenceXObject",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE))
	
	args1(0).Value = Replace (args1(0).Value, "DDDDDDDD", dates)
	args1(0).Value = Replace (args1(0).Value, "TTTTTT", times)
	dispatcher.executeDispatch(quellframe, ".uno:ExportDirectToPDF", "", 0, args1())
		
	MsgBox("PDF erfolgreich gespeichert")


end sub

Daten.ods
(9.88 KiB) 9-mal heruntergeladen
Kassenzählprotokoll.ods
(17.76 KiB) 10-mal heruntergeladen
Stephan
********
Beiträge: 12317
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
Richarde

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

Beitrag von Richarde »

Stephan hat geschrieben: Mo, 13.09.2021 16:50 zumindest der erste Kopiervorgang klappt
bei mir klappt es leider nicht, ich kann nicht feststellen das der Zähler falsch wäre, das sieht gut aus für mich - aber beim Copy & Paste kommt einfach nichts an - siehe Bild im Anhang.

So recht habe ich keine Idee woran es liegen könnte und würde mich über Hinweise freuen.
Result.png
Result.png (9.49 KiB) 2286 mal betrachtet
Viele Grüße
Richarde
Stephan
********
Beiträge: 12317
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) 2277 mal betrachtet


Gruß
Stephan
Richarde

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

Beitrag von Richarde »

Ich habe nun herausgefunden woran es liegt,
ich starte das Makro per Taste auf dem Quellsheet (Steuerelement Formular Button)

Dadurch bleibt der Fokus auf dem Element kleben und die Kopierfunktion sleektiert nichts.

Ich müsste nun den Fokus wechseln. Eine Anfrage dazu habe ich hier im Forum schon in einem sehr alten aber entsprechenden Thread gestellt.
http://de.openoffice.info/viewtopic.php?p=6358#p6358

Alternativ kann ich mir auch vorstellen die Quellmappe zu speichern, zu schließen und wieder zu öffnen.

Das Makro muss dann im Standard-Makro Modul gespeichert werden aber das wäre für mich ok.
Diesen Ansatz habe ich nun schon verfolgt, jedoch kommt beim wieder öffnen der Quellmappe jedes mal eine Warnung das sie noch zum bearbeiten geöffnet ist. Wenn ich diese Meldung abfangen kann und dort so lange meine Runden drehe bis die Schreibsperre weg ist oder ich ohne Abfrage einfach Schreibgeschützt öffnen kann wäre mein Problem wohl behoben.


Was mich an Star.Office wohl am meisten stört ist die nicht vorhandene Code-Vervollständigung. Somit weiß man auch nie welche Objekte welche Methoden unterstützen. Ich glaube damit würden sich erfahrene Programmierer aber neulinge in StarBasic leichter tun. Aber das nur am Rande.

Über Anregungen, Lösungsvorschläge und weiteres Feedback freue ich mich wie immer sehr.
viele Grüße
Richarde

Edit: Link berichtigt
Richarde

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

Beitrag von Richarde »

Hier noch der neue Ansatz:

Code: Alles auswählen

	quelldatei = ThisComponent
	quelldatei.store()
	quelldatei.close(true)
	
	wait 5000 
	
	path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
	path = "file:///C:/Users/rig/Desktop/trash/Neu/"

	quelldateiurl = path & "Kassenzählprotokoll.ods"
	quelldatei =  StarDesktop.loadComponentFromURL(quelldateiurl, "_blank", 0, dateiprop())
	quellframe = quelldatei.CurrentController.Frame
	quell_ws = quelldatei.Sheets.getByName("Kassenzählung")
	
	
und die Meldung:
schreibschutz.png
schreibschutz.png (10.4 KiB) 2209 mal betrachtet
Ich könnte die Quelle auch in eine Temporäre Datei speichern... also Notnägelansätze sind schon vorhanden. Vielleocht hat dennoch jemand eine Idee wie es "richtiger" geht.

Danke und viele Grüße
Stephan
********
Beiträge: 12317
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: 12317
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
Richarde

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

Beitrag von Richarde »

Stephan hat geschrieben: Di, 14.09.2021 17:41 Ich verstehe dann nicht recht, warum es bei mir funktioniert hat.
Ich hatte vermutet das Du das Makro nicht über den Button gestartet hast sondern über die Makroauswahl ?
Stephan hat geschrieben: Di, 14.09.2021 17:41 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:
Hab ich noch nicht versucht, sollte aber ebenfalls nicht funktionieren, denn der Fokus liegt ja in der Quelle auf dem Button und wird durch keine Anweisung vom Button genommen. Da hilft meiner Meinung nach auch die neue Reiehnfolge auch nichts. (Oder stehe ich da auf dem Schlauch?)

10 min später:

Ok, hab das sicherheitshalber nochmal geprüft, nicht das ich hier auf den Deckel bekomme. Also Anweisungen drehen bringt nix, denn der Fokus ist ja immer noch an der falschen Stelle.
Stephan hat geschrieben: Di, 14.09.2021 18:05 Also eigentlich könnte der ganze Code ohne dieses dämliche Copy-Paste auskommen
den Ansatz finde ich toll und sowas kenne ich bereits aus VBA, nur ohne ZwischenArray - das sieht wirklich gut aus und werde ich jetzt mal umsetzen.


Ein mal angefangen kann ich aber kaum wieder aufhören :-)
Das mit dem Fokus interssiert mich jetzt schon. Auch beim Zellen löschen was ich durch den Button mache bleibt der Fokus anschließend so halb am Button kleben. Wenn man dann Eingaben mit Enter bestätigt wird wieder alles gelöscht. Den Fehler macht der Anwender 2 mal dann hat er sich das gemerkt und weiß er muss die Pfeiltasten zum Navigieren verwenden, aber dennoch ist das ärgerlich weshalb mich eine Lösung auch für das Fokus-Problem interessieren würde.

Das hat mich nochmal nach Methoden suchen lassen... und ich habe dann eine Einstellung beim Button gefunden:
fokus.png
fokus.png (8.74 KiB) 2149 mal betrachtet
"Fokusieren bei Klick"

nachdem ich das auf Nein gestellt habe, geht auch das Makro ohne Probleme.

Ich werde jetzt dennoch mal den Array Befehl austesten und Danke für Deine Unterstützung Stephan, ich hoffe der Trick mit dem Fokus beim Button hilft auch anderen.

Ich werde auch nochmal die Dateien hier hochladen wenn ich fertig bin.

Viele Grüße
Richarde
Stephan
********
Beiträge: 12317
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
Antworten