🙏 Helfen Sie jetzt 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. 🤗

Inhalte in eine andere ods-Datei übertragen

Alles zur Programmierung im LibreOffice.
Paradroid
Beiträge: 5
Registriert: Mo 2. Jan 2017, 20:15

Inhalte in eine andere ods-Datei übertragen

Beitrag von Paradroid » Mo 2. Jan 2017, 20:53

Mahlzeit,

ich habe mich an einem Problem festgebissen, bei dem ich meine "lurker"-Position hier aufgeben muss. Innerhalb einer LO-Tabelle kann ich mit Macros mittlerweile recht viel machen, aber nun möchte ich ganze drei Werte in eine andere Datei pushen. Offenbar stelle ich mich dabei nicht sehr clever an:

Code: Alles auswählen

Sub push

	Dim oDoc As Object, oSheet As Object, oCell As Object, oSheets As Object
	Dim oCellRange As Object
	Dim tDoc As Object, tSheet As Object, tCell As Object, tSheets As Object
	Dim tCellRange As Object
	Dim CustNo As String
	Dim dummy()
	
	tDoc=starDeskTop.loadComponentFromURL("file:///mnt/pfad/andereDatei.ods","_blank",0,dummy())
	tSheet=tDoc.Sheets.getByName("Tabelle")
	tCell=tSheet.getCellByposition(1,25) 'noch fest - wird später dynamisch gewählt

	oDoc=ThisComponent
	oSheet=oDoc.Sheets.getByName("test")
	oCell=oSheet.getCellRangeByName("$C$5") 'string der gepusht werden soll
	CustNo=oCell.GetString()
	oCell=oSheet.getCellRangeByName("$M$3") 'Testfeld
	
	oCell.setString(CustNo)
	tCell.setString(CustNo)
	
End Sub
Bei tSheet=tDoc.Sheets.getByName("Tabelle") bekomme ich jedoch einen Laufzeitfehler, "Objektvariable nicht belegt.". Muss ich dem Interpreter noch irgendwie mitteilen, dass es sich bei tDoc auch um ein spreadsheet handelt?

Vielen Dank im Voraus,
Jens

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

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von mikele » Mo 2. Jan 2017, 21:13

Hallo,
bist du dir sicher, dass dein Tabellenblatt den Namen "Tabelle" hat?
Gruß,
mikele

Paradroid
Beiträge: 5
Registriert: Mo 2. Jan 2017, 20:15

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von Paradroid » Mo 2. Jan 2017, 21:19

Selbstverständlich ist der Blattname ein Anderer - ich habe einige Namen und Pfade verändert, weil ich nicht vom Thema ablenken wollte. Tatsächlich sind mehrere Tabellenblätter in der Zieldatei (tDoc; "t" für "T"arget) vorhanden, und ich möchte das Zweite anwählen. Ausprobiert habe ich auch die Namen der anderen Blätter, aber die Fehlermeldung deutet darauf hin, dass schon einen Schritt zuvor etwas schief läuft, nämlich dass das Objekt gar keine Funktion "Sheets.getbyname" hat.

Das ist aber auch nur eine Vermutung - ich bin kein Programmierer.

Jens

Paradroid
Beiträge: 5
Registriert: Mo 2. Jan 2017, 20:15

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von Paradroid » Di 3. Jan 2017, 11:49

Ich bin einen Schritt weiter: Ich hatte die ganze Zeit die Zieldatei schon geöffnet, was den Laufzeitfehler verursacht hat. Schließe ich die Zieldatei, wird sie korrekt geöffnet, der Wert eingetragen und das Makro ohne Laufzeitfehler beendet.

Starte ich das Makro erneut, bekomme ich wieder den Laufzeitfehler. Auch wenn ich den Frame-Namen auf etwas Festes setze (also nicht "_blank", sondern z.B. "Hans"), bekomme ich den Laufzeitfehler beim zweiten Aufruf. Ich habe das Gefühl, dass ich am dritten Parameter von "loadComponentFromURL" anpassen muss. Werde gleich mal die Suchfunktion hier weiter bemühen.

Edit: Hier im Forum kann ich wirklich nichts finden. Aber die LO-Doku sagt, dass die SearchFlags=0 (Auto) "depreciated" sind, und besser durch Konstanten zu setzen sind. Die sehen für mich wie Bitfelder aus, denn die Konstante "Global" (=55) wird beschrieben mit "findet alles, öffnet aber nichts Neues" und lässt sich zusammensetzen aus den einzelnen Konstanten, die hier beschrieben sind. Leider bringen die SearchFlags 55 (global) und 63 (einfach alle Bits gesetzt) keine Besserung. Das Problem, dass eine bereits geöffnete ods-Datei nicht gefunden wird, bleibt bestehen.

Jens

balu
* LO-Experte *
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von balu » Di 3. Jan 2017, 12:19

Hallo Jens,
wenn ich den Frame-Namen auf etwas Festes setze (also nicht "_blank", sondern z.B. "Hans")
Wenn Du nicht weißt was das "_blank" bedeutet, dann lass doch bitte schön die Finger davon. Und außerdem wird dein Problem nicht daran liegen.
Versuchs doch mal hiermit.



Gruß
balu

Paradroid
Beiträge: 5
Registriert: Mo 2. Jan 2017, 20:15

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von Paradroid » Di 3. Jan 2017, 14:55

Hallo Balu,

Dein Ton und der direkte Link auf eine Quelle, die zwar noch die "depreciated-0" nutzt, aber das Array (welches ich in einem anderen Beispiel als leeres Dummy gefunden habe) anders definiert, impliziert, dass Du meinen Fehler gefunden hast. Leider ist das nicht so: Wenn die Datei schon in einem anderen Fenster geöffnet ist, dann bekomme ich keinen Zugriff. Nur wenn die Datei zu ist, wird sie geöffnet und wie gewünscht bearbeitet. Die Übernahme der einzigen Differenz (die Definition des Arrays) ändert leider nichts.

Meine Zwischenlösung ist, dass ich die Datei vor Ausführen des Makros schließe, und das Makro sie nach Änderungen speichert (mit "overwrite=true") und wieder schließt. Das ist zwar nicht schön (weil langsam), funktioniert aber. Vielleicht kann ich diesen Workaround noch schöner machen, indem ich die Datei "hidden" öffne, aber es würde ein Workaround bleiben - nichts, was ich als echte Lösung sehen kann.

Solltest Du (oder jemand anders) sachdienliche Hinweise haben, wie ich eine bereits geöffnete Datei für den Zugriff aus einem Makro heraus öffne, wäre ich sehr dankbar.

Jens

balu
* LO-Experte *
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von balu » Di 3. Jan 2017, 16:48

Hallo Jens,

ganz so einfach ist das Thema auch nicht, wie Du es dir vorstellst. Ich hatte wohl schon so einen verdacht, musste aber erstmal nach einer geeigneten Datei in meiner Krabbelkiste suchen. Bin auch fündig geworden. :)

In diesem Falle muss erst der oComponentWalker aufgerufen und abgearbeitet werden. Dieser kann nämlich alle geöffneten Dateien ansprechen. Jedoch muss er vorher wissen mit welcher Datei genau weiter gearbeitet werden soll. Dazu muss der komplette Pfad und der Dateiname einer Variablen übergeben werden. Was in deinem Falle so aussehen würde.

Code: Alles auswählen

sExterneURL  = "file:///mnt/pfad/andereDatei.ods"
Und erst danach kann der oComponentWalker arbeiten.

Code: Alles auswählen

    dim myFileProp(0) as New com.sun.star.beans.PropertyValue
            
            oComponentWalker = oComponents.createEnumeration()
            Do While oComponentWalker.hasMoreElements()
                oComponent = oComponentWalker.nextElement()
                if oComponent.getURL() = sExterneURL then
                    gefunden = true
                    'print oComponent.getURL()'
                end if
            Loop
Und je nachdem was dann in gefunden steht, wird die Externe Datei angesprochen.

Code: Alles auswählen

        if gefunden = true then   
            oEXTDoc = StarDesktop.loadComponentFromURL(sExterneURL, "_default", 0, myFileProp())
        else
            oEXTDoc = StarDesktop.loadComponentFromURL(sExterneURL, "_blank", 0, myFileProp())
        end if
Wie Du siehst ist der 2. Parameter von loadComponentFromURL jetzt anders. Einmal _default, und einmal _blank. Aber nur durch die Hilfe des oComponentWalker kommt jetzt das zu tragen, was ich vorher schon leicht angemäckert hatte. Du warst so gesehen schon fast auf dem richtigen Wege, jedoch ist dieser spezielle zugriff auf eine Datei halt etwas anders und deshalb brauchst Du den oComponentWalker. Mir ist momentan keine andere Methode bekannt um dein Ziel zu erreichen. Am sichersten fähst Du mit ihm. ;)

Hier mal der komplette Beispiel-Code.

Code: Alles auswählen

Public oEXTDoc As Object, oDoc as Object
Public oDummy()
Public gefunden as String
'**************************************************************************************'

Sub Copy_Aeras_2_Sheet_2

    on Error goto Ende ' Für den Fall eines Fehler zu der Sprungmarke Ende springen.'
   
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
   
    oDoc = thisComponent
    oComponents = StarDesktop.getComponents()
    gefunden = ""
    sExterneURL  = "file:///E:/OFFICE/Array_Spielereien_0.ods" 'Pfad zum Dokument anpassen'
   
'############  Prüfen ob Dokument schon geöffnet ist.'
'############  Wenn nein, dann wird es per _blank geöffnet.'
'############  Wenn ja, dann wird per _default darauf zugegriffen.'

    dim myFileProp(0) as New com.sun.star.beans.PropertyValue
            
            oComponentWalker = oComponents.createEnumeration()
            Do While oComponentWalker.hasMoreElements()
                oComponent = oComponentWalker.nextElement()
                if oComponent.getURL() = sExterneURL then
                    gefunden = true
                    'print oComponent.getURL()'
                end if
            Loop

        if gefunden = true then   
            oEXTDoc = StarDesktop.loadComponentFromURL(sExterneURL, "_default", 0, myFileProp())
        else
            oEXTDoc = StarDesktop.loadComponentFromURL(sExterneURL, "_blank", 0, myFileProp())
        end if
   
'###############  Ende Prüfung  #############################'

   oExternTabelle3 = oEXTDoc.Sheets().getByName("Tabelle3") 'Tabellenblatt *Tabelle3* in der auszulesenden Datei defenieren.'
   oInternTabelle2 = oDoc.Sheets().getByName("Tabelle2")' Tabellenblatt *Tabelle2* in dieser Datei defenieren.'
   
    dim aDatArray()' Einen Datenbereich kopieren'
    aDatArray = oExternTabelle3.getCellRangeByName("A1:B11").getDataArray
    oInternTabelle2.getCellRangeByName("A1:B11").setDataArray(aDatArray)
        
    Ende:  ' Falls ein Fehler aufgetreten ist, hier her springen und Makro beenden.'
END SUB
Ich habe da ein paar Zeilen zum Kopieren von einer Externen Datei zu der aktuellen Datei (die mit diesem Makro) eingebaut. Und es funktioniert bei mir fehlerfrei. Es spielt keine Rolle ob die Datei schon geöffnet ist, oder nicht. Wenn sie nicht geöffnet ist, dann wird sie halt geöffnet und anschließend wird kopiert.

Der Grund-Code ist nicht von mir, den hatte ich wo anders her. Ich habe ihn lediglich auf die schnelle an die geforderte Situation angepasst. Hoffe Du komst damit zu recht.



Gruß
balu

Paradroid
Beiträge: 5
Registriert: Mo 2. Jan 2017, 20:15

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von Paradroid » Di 3. Jan 2017, 18:16

Danke - ich hab's noch nicht ausprobiert, habe aber mal über DuckDuckGo und Google geschaut, wo ich noch Hinweise auf den Component Walker gefunden hätte. Ich habe auch Dein Posting bei openoffice.info gefunden, welches wohl die neue Domain für oooforum.de ist. Die gesamte Dokumentation von LO scheint jedoch komplett frei von dem Begriff.

Wie soll man sowas finden? (klar, Rhetorische Frage - lieb in einem Forum fragen!).

Ich melde mich nochmal, wenn ich Dein Beispiel ausprobiert habe.

danke,
Jens

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

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von mikele » Di 3. Jan 2017, 21:04

Hallo,
interessanterweise funktioniert bei mir (Ubuntu12.04, LO4.4.7.2) auch der ursprüngliche Code fehlerfrei (wenn die Datei bereits geöffnet war, wird sie in einem neuen Fenster erneut geöffnet).
Für den Zugriff auf die bereits geöffnete Datei würde ich balu's Code abwandeln:

Code: Alles auswählen

            dim myFileProp(0) as New com.sun.star.beans.PropertyValue
            oComponentWalker = oComponents.createEnumeration()
            Do While oComponentWalker.hasMoreElements()
                oComponent = oComponentWalker.nextElement()
                if oComponent.getURL() = sExterneURL then
                    oEXTDoc =oComponent
               end if
            Loop
            if isnull(oExtDoc) then   
                oEXTDoc = StarDesktop.loadComponentFromURL(sExterneURL, "_blank", 0, myFileProp())
           end if
Gruß,
mikele

balu
* LO-Experte *
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Inhalte in eine andere ods-Datei übertragen

Beitrag von balu » Di 3. Jan 2017, 21:25

Hallo Jens,
Wie soll man sowas finden? (klar, Rhetorische Frage - lieb in einem Forum fragen!).
Manche Dinge kann man wohl erfragen, und auch Antworten darauf bekommen. Aber nicht immer steht schon eine Lösung irgendwo auf Abruf bereit, oft muss sie erst erarbeitet werden.
Ich hatte schon manchmal ein Problem wo ich dachte: "Bist Du zu blöde um die Lösung zu finden?"
Und als ich im Forum deswegen anfragte, musste ich hinterher feststellen, das es dafür überhaupt noch keine Lösung gab/gibt. Und das frustet dann schon sehr oft, wenn man nicht vorher schon weiß ob es eine Lösung gibt. Denn schließlich will ich zumindest mir nicht anhören: "Zu faul zum suchen?"

Die gesamte Dokumentation von LO scheint jedoch komplett frei von dem Begriff.
Das ist ja auch kein Tool von OO (Kurzform für: OO.o, AOO und LO), sondern ein Makro von einem User. Übrigens habe ich jetzt auch den ursprünglichen Code wiedergefunden, den ich dann für meine Zwecke Schritt-für-Schritt angepasst hatte. Ich hatte wohl ein anderes Zeil vor Augen, aber dieser Code war mir schon eine sehr große Hilfe gewesen. Schau mal hier.

openoffice.info gefunden, welches wohl die neue Domain für oooforum.de ist
Falsch. Beide Adressen sind gültig. Schau hier: http://de.openoffice.info/impressum.html



Gruß
balu


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