Seite 1 von 1

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

Verfasst: Fr 16. Feb 2024, 16:27
von Rolf_V
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

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

Verfasst: Fr 16. Feb 2024, 17:52
von mikele
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


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

Verfasst: Fr 16. Feb 2024, 18:12
von karolus
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"

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

Verfasst: Fr 16. Feb 2024, 21:28
von Rolf_V
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.

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

Verfasst: Fr 16. Feb 2024, 21:31
von Rolf_V
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)