Zugriff zwischen OLE Objekte

Antwort erstellen


Um automatische Eingaben zu unterbinden, musst du die nachfolgende Aufgabe lösen.

BBCode ist eingeschaltet
[img] ist ausgeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Zugriff zwischen OLE Objekte

Re: Zugriff zwischen OLE Objekte

von rammi » Mo, 15.01.2018 09:53

Stephan hat geschrieben:
Fr, 12.01.2018 15:58
...bei einem Makro bleiben und sofern das Makro automatisch gestartet werden soll...dem EReignis "Dokument aktivieren" des odt-Dokuments zu ordnen...
So funktioniert es wie erwartet. Vielen Dank!

Re: Zugriff zwischen OLE Objekte

von Stephan » Fr, 12.01.2018 15:58

Die Funktionen liegen unter:
Extras->Makros->Makros verwalten->OpenOffice Basics->test-mitSchaltfläche.odt->Standard->Module1
Das kann nicht funktionieren, weil sie dort im Textdokument gespeichert sind und nicht in den Calc-OLE-Objekten.
Benutzerdefinierte Funktionen (also Basic-Funktionen die direkt in Calc-Tabellenzellen aufrufbar sein sollen) müssen immer entweder im Calc-Dokument (das wäre hier sinngemäß das OLE-Objekt) oder in der globalen Bibliothek namens "Standard" (nur in dieser funktionieren sie) gespeichert sein.
Im Calc-Dokumen, also hier im OLE-Objekt speichern ist noch durchführbar (Doppelklick auf Objekt und dann im dort unter Extras-Makros-... sichtbaren Dokument Unbenannt... ablegen), aber die Funktionen funktionieren nicht bei Aufruf als einer Tabellenzelle (zumindest bei mir nicht). Deshalb bleibt nur der zweite Weg (Speichern in der globalen Bibliothek "Standard"), der bei mir, zumindest mit der ganz einfachen HALLOWELT()-Funktion auch klappt, aber ich weiß trotzdem nicht was ich von dem Ganzen (=benutzerdefinierte Funktionen in OLE-Objekten nutzen) halten soll, mir wäre das zu zweifelhaft das es zuverlässig funktioniert. Deshalb würde ich bei einem Makro bleiben und sofern das Makro automatisch gestartet werden soll sobald es Ändeerungen an den Quelltabellen (also OLE-Objekten) gibt, dem EReignis "Dokument aktivieren" des odt-Dokuments zu ordnen, weil dieses Ereignis zwangsläufig eintritt wenn man nach einer Änderung in einem OLE-Objekt dieses Objekt wieder verlässt. Beispiel anhängend.


Gruß
Stephan
Dateianhänge
test-mitEreignismakro.odt
(34.33 KiB) 40-mal heruntergeladen

Re: Zugriff zwischen OLE Objekte

von rammi » Fr, 12.01.2018 14:59

Jetzt versuche ich die Geschichte als Funktion zu kapseln und dem entsprechenden Feld zuzuordnen, für alle Fälle hab ich eine einfache HALLOWELT() Funktion erstellt.

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
With ThisComponent.getEmbeddedObjects
	.getByName("Objekt4").getEmbeddedObject.Sheets().getByName("Tabelle1").getCellRangeByName("A1").Value = _
	.getByName("Objekt1").getEmbeddedObject.Sheets().getByName("Tabelle1").getCellRangeByName("B3").Value
	.getByName("Objekt4").getEmbeddedObject.Sheets().getByName("Tabelle1").getCellRangeByName("A2").Value = _
	.getByName("Objekt2").getEmbeddedObject.Sheets().getByName("Tabelle1").getCellRangeByName("A3").Value
End With
End Sub

function HALLOWELT()
	HALLOWELT="Hallo Welt"
end function

function MYVALUE()
	MYVALUE=This.Component.getEmbeddedObjects().getByName("Objekt1").getEmbeddedObject.Sheets().getByName("Tabelle1").getCellRangeByName("B3").Value
end function
test.odt
(32.57 KiB) 38-mal heruntergeladen
Dabei habe ich mich ans Handbuch gehalten, aber meine Funktionen kennt das aktuelle Projekt nicht. Die Funktionen liegen unter:
Extras->Makros->Makros verwalten->OpenOffice Basics->test-mitSchaltfläche.odt->Standard->Module1

Re: Zugriff zwischen OLE Objekte

von rammi » Fr, 12.01.2018 13:34

Stephan hat geschrieben:
Fr, 12.01.2018 12:39
hier der ursprüngliche Code in die Testdatei integriert
Danke, damit komme ich tatsächlich erstmal weiter

Re: Zugriff zwischen OLE Objekte

von Stephan » Fr, 12.01.2018 12:39

hier der ursprüngliche Code in die Testdatei integriert


Gruß
Stephan
Dateianhänge
test-mitSchaltfläche.odt
(35.08 KiB) 32-mal heruntergeladen

Re: Zugriff zwischen OLE Objekte

von Stephan » Fr, 12.01.2018 12:26

Sorry Stephan, ich habe oben eine Test Datei zur Verfügung gestellt was in etwa mein Dokument abbildet. Ich hatte schon zuvor gebeten, dieses Dokument als Vorlage zu nehmen um eine Lösung darauf abzubilden...
Und für genau dieses Dokument hatte ich einen passenden Code gepostet der funktioniert. Mehr geht an der Stelle nicht.

Alle späteren Problem haben doch damit zu tun das sie sich offensichtlich nicht mehr auf die ursprüngliche Datei beziehen.

warum füllst du nicht schnell mein test-Beispiel auf?
genau das habe ich bereits getan, der gepostete Code passt ganz genau auf Deine Beispiel-DAtei. z.B. berücksichtigt der Code auch die Besonderheit das dort 4 OLE-Objekte sind obwohl man direkt nur 3 sieht.


Gruß
Stephan

Re: Zugriff zwischen OLE Objekte

von rammi » Fr, 12.01.2018 12:16

Stephan hat geschrieben:
Fr, 12.01.2018 11:57
Sorry, aber entweder Du stellst die Datei zur Verfügung oder hier ist leider Schluss.
Es ist Unsinn das wir hier im Forum per Blindflug Deinen Code debuggen sollen, denn um vernünftig debuggen zu können muss man selber alles vor Augen haben....
Sorry Stephan, ich habe oben eine Test Datei zur Verfügung gestellt was in etwa mein Dokument abbildet. Ich hatte schon zuvor gebeten, dieses Dokument als Vorlage zu nehmen um eine Lösung darauf abzubilden... Warum muss ich nun in Gefahr laufen, das "hier Schluss" ist, obwohl es völlig unnötig ist, mein reales Projekt hier einzustellen?!

Um mal abzuwiegeln, OpenOffice ist ein Programm, welches nicht im Vordergrund NICHT(!) die BASIC-Programmierung voraussetzt. Du scheinst ja jemand zu sein, welcher sich mit BASIC auskennt, warum füllst du nicht schnell mein test-Beispiel auf?

Re: Zugriff zwischen OLE Objekte

von Stephan » Fr, 12.01.2018 11:57

Sorry, aber entweder Du stellst die Datei zur Verfügung oder hier ist leider Schluss.
Es ist Unsinn das wir hier im Forum per Blindflug Deinen Code debuggen sollen, denn um vernünftig debuggen zu können muss man selber alles vor Augen haben.

raten könnte man derzeitig das es z.B. garkeine Tabelle namens "Tabelle1" gibt und/oder der benannte Zellbereich "summe" sich nicht in Tabelle1 befindet.


Gruß
Stephan

Re: Zugriff zwischen OLE Objekte

von rammi » Fr, 12.01.2018 11:27

Stephan hat geschrieben:
Fr, 12.01.2018 10:50
...
ich würde zu debuggen statt des ...
in den Code schreiben:

Code: Alles auswählen

Msgbox .dbg_properties

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
  With ThisComponent
    With .getEmbeddedObjects		
      With .getByName("tblDusche")
        With .getEmbeddedObject()
          With .Sheets()
            With .getByName("Tabelle1")
              With .getCellRangeByName("summe")
                Msgbox .dbg_properties
              End With
            End With
          End With
        End With
      End With
    End With
  End With
End Sub
gibt weiterhin Fehler...
forum.JPG
forum.JPG (51.6 KiB) 2416 mal betrachtet

Re: Zugriff zwischen OLE Objekte

von Stephan » Fr, 12.01.2018 10:54

oder OO macht Probleme wegen des Namens (weil Summe auch der Name einer Tabellenfunktion ist würde ich das nicht als Namen für einen Bereich verwenden)
habe ich gerade ausprobiert, "summe" macht als Name für einen Zellbereich keine Probleme (gestestet OOo 3.3.0)


Gruß
Stephan

Re: Zugriff zwischen OLE Objekte

von Stephan » Fr, 12.01.2018 10:50

Jetzt kommt der Code durch bis zum Value
entweder der benannte Bereich "summe" existiert nicht, ist größer als 1 Zelle oder OO macht Probleme wegen des Namens (weil Summe auch der Name einer Tabellenfunktion ist würde ich das nicht als Namen für einen Bereich verwenden)

ich würde zu debuggen statt des

Code: Alles auswählen

.Value
in den Code schreiben:

Code: Alles auswählen

Msgbox .dbg_properties
dann werden die Eigenschaften des (vermeintlichen) Zellrange-Objekts angezeigt. Dort muss, wenn im Konkreten das richtige Objekt angesprochen wird, stehen "ScCellObj":



Gruß
Stephan
Dateianhänge
dbg-cellobject.gif
dbg-cellobject.gif (8.8 KiB) 2428 mal betrachtet

Re: Zugriff zwischen OLE Objekte

von rammi » Fr, 12.01.2018 10:26

Stephan hat geschrieben:
Fr, 12.01.2018 10:01
...Also wirst Du den Code schon so schreiben müssen wie das richtig ist, nämlich...
Ok, da ich schon schrieb, keine BASIC-Erfahrungen zu haben, hab ich da eben was durcheinander gebracht... Ich dachte der Punkt gilt auch über Zeilen als Verkettung. Wegen besserer Übersicht habe das dann so geschrieben und so offensichtlich die BASIC typische Kette auseinandergerissen...

Jetzt kommt der Code durch bis zum Value

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
  With ThisComponent
    With .getEmbeddedObjects		
      With .getByName("tblDusche")
        With .getEmbeddedObject()
          With .Sheets()
            With .getByName("Tabelle1")
              With .getCellRangeByName("summe")
                .Value  '<---- BASIC Exception
              End With
            End With
          End With
        End With
      End With
    End With
  End With
End Sub


'Sub Main
'With ThisComponent
'		.getEmbeddedObjects.getByName("tblDusche").getEmbeddedObject().Sheets().getByName("Tabelle1").getCellRangeByName("summe").Value
'End With
'End Sub
mit dem Fehler:
BASIC-Laufzeitfeher:
Es ist eine Exception aufgetreten
Type: com.sun.star.container.NoSuchElementException
Ich weiß nicht welches Element nicht gefunden wird. Der entsprechenden Zelle habe ich den Namen 'summe' gegeben

Re: Zugriff zwischen OLE Objekte

von Stephan » Fr, 12.01.2018 10:01

Also, ich habe deinen Code mal angepasst nach meinen Bedürfnissen, BASIC gibt Fehler: Methode nicht gefunden: getByName
ja, weil der Code wieder völlig falsch ist. Warum änderst Du zum zweiten Mal meinen Code einfach beliebig ab und meinst das würde trotzdem funktionieren?

Die Fehlermeldung kommt weil dieser Code:

Code: Alles auswählen

With ThisComponent
	.getEmbeddedObjects		
  	.getByName("tblDusche") ' <---- BASIC-Fehler
	
End With
dem hier entspricht:

Code: Alles auswählen

ThisComponent.getEmbeddedObjects
ThisComponent.getByName("tblDusche")
Du aber brauchst:

Code: Alles auswählen

ThisComponent.getEmbeddedObjects.getByName("tblDusche")
Also wirst Du den Code schon so schreiben müssen wie das richtig ist, nämlich:

Code: Alles auswählen

Sub Main
With ThisComponent
	.getEmbeddedObjects.getByName("tblDusche").getEmbeddedObject().Sheets().getByName("Tabelle1").getCellRangeByName("summe").Value
End With
End Sub
Oder meinethalben auch (was aber praktisch niemand so tut und was ich gänzlich ungewöhnlich fände):

Code: Alles auswählen

Sub Main
  With ThisComponent
    With .getEmbeddedObjects		
      With .getByName("tblDusche")
        With .getEmbeddedObject()
          With .Sheets()
            With .getByName("Tabelle1")
              With .getCellRangeByName("summe")
                .Value
              End With
            End With
          End With
        End With
      End With
    End With
  End With
End Sub


Gruß
Stephan

Re: Zugriff zwischen OLE Objekte

von rammi » Fr, 12.01.2018 07:50

Stephan hat geschrieben:
Do, 11.01.2018 21:17
Der nachfolgende Code ist auch nur ein Rudiment ..., aber so muss es prinzipiell aussehen...
Danke erstmal. Ich kenne mich mit Basic nicht aus, deshalb brauche ich Gehhilfe...

Also, ich habe deinen Code mal angepasst nach meinen Bedürfnissen, BASIC gibt Fehler: Methode nicht gefunden: getByName

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
With ThisComponent
		.getEmbeddedObjects		
  		.getByName("tblDusche") ' <---- BASIC-Fehler
  		'.getEmbeddedObject()
  		'.Sheets()
  		'.getByName("Tabelle1")
  		'.getCellRangeByName("summe")
  		'.Value
End With
End Sub

Re: Zugriff zwischen OLE Objekte

von Stephan » Do, 11.01.2018 21:17

Also ich versuche das so nachzubauen, ohne Erfolg
naja, an Deinem Makro ist auch nahezu nichts richtig, ich verstehe garnicht wie Du auf dieses Makro kommst.

Der nachfolgende Code ist auch nur ein Rudiment, da ich ja Dein Dokument nicht kenne, aber so muss es prinzipiell aussehen:

Code: Alles auswählen

Sub Main
With ThisComponent.getEmbeddedObjects
  .getByName("tblIdent").getEmbeddedObject.Sheets().getByName("Tabelle1").getCellRangeByName("A1").Value
End With
End Sub
aus sicherheitsgründen ist dieses makro nicht ausführbar
mutmaßlich weil die Makrosicherheitseinstellung auf hoch steht. Aktiviere unter Extras-Einstellungen-OpenOffice-Sicherheit Schaltfläche "Makrosicherheit" die Option für mittel oder niedrig. Bei "mittel" kommt später jedesmal bei Makros eine Nachfrage wo Du deren Ausführung zulassen musds, bei "niedrig" werden die Makros ohne Nachfrage immer ausgeführt.


Gruß
Stephan

Nach oben