🙏 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. 🤗

Zugriff zu 2 ODS-Dateien in einem Makro? [GELÖST]

Alles zur Programmierung im LibreOffice.
Antworten
Rolf_V
Beiträge: 23
Registriert: Mi 2. Mär 2022, 19:09

Zugriff zu 2 ODS-Dateien in einem Makro? [GELÖST]

Beitrag von Rolf_V » Fr 16. Feb 2024, 16:27

Ich will mit einem Makro eine zweite ODS-Datei öffnen und Zellinhalte aus einer Datei in die andere Datei kopieren. Das Öffnen funktioniert schon, aber es gibt keinen Zugriff auf die zweiten Datei.
Hier ist der relevante Teil des Makros, das von der ersten Datei gestartet wird:

Code: Alles auswählen

Sub Main
msgbox ReadCell("B6")
OpenFile("home/rolf/Downloads/New.ods")
msgbox ReadCell("A1")
' ...usw...
End Sub

sub OpenFile(Name as String)
Dim myProp(0) as new com.sun.star.beans.PropertyValue
myProp(0).name="MacroExecutionMode"
myProp(0).value = 0
url=converttourl(Name)
oDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myProp() )
end sub

function ReadCell(Adr as String)
dim myString
oDocument = thisComponent
oSheet = oDocument.sheets(0)
oZelle = oSheet.getCellRangeByName(Adr)
myString=oZelle.string
ReadCell = myString
end Function
Msgbox zeigt zunächst richtig den Inhalt der Zelle B6 an, aber nach dem Öffnen der zweiten Datei ist msgbox leer.
Wie kann ich den Zugriff abwechselnd auf beide Dateien einstellen, d.h. dass thisComponent auf die jeweilige gewünschte Datei zeigt?
FYI: LO läuft unter Linux
Zuletzt geändert von Rolf_V am Sa 24. Feb 2024, 23:46, insgesamt 1-mal geändert.

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

Re: Zugriff zu 2 ODS-Dateien in einem Makro?

Beitrag von mikele » Fr 16. Feb 2024, 17:52

Hallo,
ThisComponent zeigt immer auf die datei aus der heruas das Makro gestartet wurde.
In der Makrokonstellation wäre es sinnvoll aus der Sub OpenFile eine Function zu machen.

Code: Alles auswählen

Sub Main
oDoc1=ThisComponent
msgbox ReadCell("B6", oDoc1)
oDoc2=OpenFile("home/rolf/Downloads/New.ods")
msgbox ReadCell("A1", oDoc2)

' ...usw...
End Sub

function OpenFile(Name as String) as object
Dim myProp(0) as new com.sun.star.beans.PropertyValue
myProp(0).name="MacroExecutionMode"
myProp(0).value = 0
url=converttourl(Name)
OpenFile = StarDesktop.loadComponentFromURL(url, "_blank", 0, myProp() )
end function

function ReadCell(Adr as String, oDocument as object)
dim myString
oSheet = oDocument.sheets(0)
oZelle = oSheet.getCellRangeByName(Adr)
myString=oZelle.string
ReadCell = myString
end Function
Nebenbei ist mir der Vorteil der function ReadCell nicht so ganz klar.
Ich würde es einfach so gestalten

Code: Alles auswählen

Sub Main
oDoc1=ThisComponent
msgbox oDoc1.Sheets(0).getCellRangeByName("B6").String
oDoc2=OpenFile("home/rolf/Downloads/New.ods")
msgbox oDoc2.Sheets(0).getCellRangeByName("A1").String

' ...usw...
End Sub

function OpenFile(Name as String) as object
Dim myProp(0) as new com.sun.star.beans.PropertyValue
myProp(0).name="MacroExecutionMode"
myProp(0).value = 0
url=converttourl(Name)
OpenFile = StarDesktop.loadComponentFromURL(url, "_blank", 0, myProp() )
end function

Gruß,
mikele

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2536
Registriert: Fr 10. Dez 2010, 10:01

Re: Zugriff zu 2 ODS-Dateien in einem Makro?

Beitrag von karolus » Fr 16. Feb 2024, 18:12

Hallo

Die Basic-funktion »ThisComponent« verhält sich unterschiedlich, je nach dem von WO sie aufgerufen wird:
  • ist die aufrufende Prozedur in ein Dokument eingebettet|gespeichert gibt sie IMMER dieses Dokument zurück
  • in allen anderen Fällen gibt sie jeweils das Dokument zurück das MOMENTAN im Fokus ist!
Vergleiche bitte die Ausgaben von folgenden Code, je nach dem ob du ihn unter ⇒MeineMakros… oder ⇒xyz.ods… speicherst!

Code: Alles auswählen

Sub Main
    this_doc = ThisComponent
    print this_doc.Title
    other_doc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, array() )
    print other_doc.Title
    print thisComponent.Title 
End Sub
Als Konsequenz solltest du eigentlich immer die MEHRMALIGE Verwendung von »ThisComponent« vermeiden!

@all: das laden eines Dokumentes mit der Option "_blank" erzeugt ggf. einen zweiten Frame falls das betreffende Dokument bereits geladen war, besser ist in dem Fall die Option "_default"
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Rolf_V
Beiträge: 23
Registriert: Mi 2. Mär 2022, 19:09

Re: Zugriff zu 2 ODS-Dateien in einem Makro?

Beitrag von Rolf_V » Fr 16. Feb 2024, 21:28

mikele hat geschrieben:
Fr 16. Feb 2024, 17:52
Hallo,
ThisComponent zeigt immer auf die datei aus der heruas das Makro gestartet wurde.
In der Makrokonstellation wäre es sinnvoll aus der Sub OpenFile eine Function zu machen.
Hallo mikely,
vielen Dank. Genau das war es, was mir noch gefehlt hat. Auch die Kurzversion zum Auslesen von Zellen gefällt mir.

Rolf_V
Beiträge: 23
Registriert: Mi 2. Mär 2022, 19:09

Re: Zugriff zu 2 ODS-Dateien in einem Makro?

Beitrag von Rolf_V » Fr 16. Feb 2024, 21:31

karolus hat geschrieben:
Fr 16. Feb 2024, 18:12
Hallo karolus,
danke für die Hinweise. Werde ich berücksichtigen. Leider steht sowas nicht in den offiziellen Anleitungen (oder ist sehr schwer zu finden)


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