[Gelöst] Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Das Textverarbeitungsprogramm

Moderator: Moderatoren

unic0rned
**
Beiträge: 36
Registriert: Fr, 02.12.2016 09:06

[Gelöst] Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von unic0rned »

Hallo liebe Community,

ich habe ein Writer Dokument, in dem ich mehrere OLE Objekte (calc Tabellen) eingefügt habe. Diese sind in das Dokument eingebettet. Also nicht verknüpft.

Nun funktioniert das alles wunderbar. Allerdings würde ich gerne am Ende eine Aufstellung der ganzen Summen der einzelnen Tabellen haben. Und dafür müsste ich von einem OLE Objekt auf die anderen OLE Tabellen innerhalb des Dokuments zugreifen. Leider weiß ich nicht wie das geht. Gibt es da eine Möglichkeit?

Als Alternative hatte ich die Idee eine seperate calc Tabelle zu erstellen und diese verknüpft als OLE Objekt einzufügen. Dann könnte ich sowas machen weil ich ja innerhalb der calc Tabelle auf alle Werte zugreifen kann. Leider hat man dann immer zwei Dateien. Ich würde es am liebste einfach halten.

Das von oben funktioniert nicht. Wenn ich nämlich zwei seperate OLE Objekte auf dieselbe Datei verknüpfe, dann aktualisiert sich immer die Ansicht. Das ist leider keine Lösung für mich.

Also ich habe 3 Tabellen die jeweils ein bisschen rechnen wo man was reintippt. Unten stehen jeweils Summen. Es geht über mehrere Seiten insgesamt. Die Einzelnen Tabellen nicht. Also brauche ich kein DDE. DDE würde ich gerne vermeiden weil die Eingabe dann ja nur in calc geht. Finde ich sehr umständlich.

Am Ende soll eine Tabelle stehen, in der die Summen von den anderen Tabellen aufgeführt sind.

Ich bin dankbar für jeden Hinweis.

Freundliche Grüße

unic0rned
Zuletzt geändert von unic0rned am Mi, 18.01.2017 13:45, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von Stephan »

Gibt es da eine Möglichkeit?
meiner Meinung nach nur per Makro. Ich habe da aber nichts Fertiges zur Hand, vielleicht kann jemand Andees aushelfen.
Das von oben funktioniert nicht. Wenn ich nämlich zwei seperate OLE Objekte auf dieselbe Datei verknüpfe, dann aktualisiert sich immer die Ansicht. Das ist leider keine Lösung für mich.
Wir hatten dieses Themna schon lange nicht mehr, aber früher (OOo 2.x) hat immer funktioniert, und sollte auch heute funktionieren, die Verknüpfung über eine 'Zwischendatei' zu machen, d.h.:

lege eine Calc-Datei an und füge die gewünschten Inhalte dort ein. Erzeuge eine zweite Calc-Datei und verknüpfe in diese die Inhalte der ersten Datei. Verknüpfe nun die zweite Calc-Datei als OLE-Objekt in das Textdokument.
Nun darfst du Bearbeitungen zukünftig nur jeweils in der ersten Calc-Datei machen und die zweite Calc-Datei garnicht mehr bearbeiten (außer aktualisieren).

Dieses Verfahren ist etwas eingeschränkt, weil man in der ersten Datei ja keine Änderungen machen kann die nachträglich das Layout umwerfen, auch gibt es Fokus-Probleme bei der Bearbeitung/Aktualisierung, im Prinzip hat das Ganze früher aber so funktioniert.
Insgesamt ist das Ganze natürlich nicht 'toll', aber Du fragtest ja nach jedem HInweis.

Gruß
Stephan
unic0rned
**
Beiträge: 36
Registriert: Fr, 02.12.2016 09:06

Re: Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von unic0rned »

Hey Stephan,

vielen Dank schonmal für deine Hinweise!

Das mit der zweiten calc Datei ist schonmal eine Notlösung. Allerdings echt schade weil man dann keine Zeilen einfügen kann etc.


Falls jemand einen Weg per Makro kennt wäre ich sehr dankbar. Habe auch kein Problem damit das einzufügen.

Irgendwie muss man ja die Inhalte der Tabellen von den Einzelnen OLE Objekte ansprechen können.

Vielen Dank für alle Hilfe.
unic0rned
**
Beiträge: 36
Registriert: Fr, 02.12.2016 09:06

Re: Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von unic0rned »

Hmm also es scheint wohl leider nicht so einfach zu gehen.

Nun wäre ich auch bereit auf DDE umzuweichen und den User seine Eingaben in einer externen Calc Tabelle machen zu lassen.

Aber hier stoße ich auf das nächste Problem.......

DDE funktioniert bei mir lokal einwandfrei.

Wenn ich allerdings Dateien auf unserem Server habe funktioniert das ganze nicht mehr.
Ich benutze einen MAC und habe gelesen, dass es da Probleme gibt.

Kennt sich irgendjemand damit aus?

Geht DDE von einem Server überhaupt für MAC?
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von Stephan »

Hmm also es scheint wohl leider nicht so einfach zu gehen.
wirklich kompliziert ist es aber auch nicht. Das folgende Makro liefert z.B. den Zellwert (Zahl) der Zelle A1 in Tabellenblatt mit Index 0 eines Calc-OLE-Objekts namens "meinTabellenobjekt" in einer Writerdatei:

Code: Alles auswählen

Sub Main
x = ThisComponent.Drawpage.CreateEnumeration
Do While x.hasMoreElements()
	akt = x.nextElement
	If akt.Name = "meinTabellenobjekt" Then
		Msgbox akt.model.Sheets(0).getCellrangeByName("A1").Value
	End if
Loop
End Sub
Geht DDE von einem Server überhaupt für MAC?
Dazu kann ich leider nichts sagen, da ich mich mit Mac überhaupt nicht auskenne.


Gruß
Stephan
unic0rned
**
Beiträge: 36
Registriert: Fr, 02.12.2016 09:06

Re: Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von unic0rned »

Hey Stephan,

falls das klappt dann hast du mir gerade unheimlich viel Arbeit erspart!!!

Vielen Dank schonmal. Ich werde das gleich mal versuchen zu implementieren.

Ich habe den Fehler gefunden warum DDE vom Server gerade noch nicht funktioniert.
Und zwar hat Mac ja innerhalb des Dateisystems kein Problem mit Leerzeichen innerhalb von Dateistrukturen.
Windows allerdings schon.
Sobald also ein Freizeichen im Dateinamen oder in der Verzeichnisstruktur ist, funktioniert die Referenz nicht mehr.
Da gibt es bestimmt auch eine Lösung. Mit %20 hat es bis jetzt noch nicht funktioniert. Falls ich was finde melde ich mich.

Allerdings finde ich OLE Objekte sehr viel interessanter als DDE.

Bis später

unic0rned
unic0rned
**
Beiträge: 36
Registriert: Fr, 02.12.2016 09:06

Re: Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von unic0rned »

Wow das ist genial. Es funktioniert :)

Ich frage mich manchmal wo man solche Informationen findet. Ich glaube da sind meine Programmiertkenntisse einfach nicht ausreichend für. Hab ich mir schon lange vorgenommen die mal aufzufrischen :)

Ich habe noch eine Frage bezüglich Geschwindigkeit. Und zwar möchte ich natürlich, dass dieses Makro immer ausgeführt wird, wenn jemand einen Wert in der Tabelle verändert. Dafür habe ich beim Objekt 2 Möglichkeiten gefunden ein Makro auszuführen die für mich in Frage kommen.

Einmal beim draufklicken und einmal beim wenn der Mauszeiger das Objekt verlässt. Nun finde ich draufklicken doof weil man ja nach dem ändern nicht nochmal draufklickt. Aber Mauszeiger verlässt Objekt passiert sehr häufig einfach mal so. Da wird das Script dann total oft ausgeführt ohne Grund.

Gibt es da eine Möglichkeit, dass das Makro immer ausgeführt wird wenn man einen Wert im Objekt verändert hat?


Habe gefunden wo man das Makro ausführen kann wenn man es druckt. Das reicht mir.

Eine Sache habe ich noch, die mir wichtig wäre aber ich weiß nicht ob das geht.

Und zwar kann es sein, dass der Nutzer Zeilen zu der Tabelle hinzufügt. Dann stimmen ja leider meine Zellenangaben nicht mehr. Kann ich die Referenz irgendwie dynamisch setzen wie in Calc? Also so dass sie immer mitgeht wenn sich die Referenz verändert? Oder sonst einen anderen Workaround wie immer die letzte Zeile mit Werten drin benutzen das würde ja auch gehen ist nur nicht so elegant ;)
So à la immer einen weiter gehen bis kein Wert drin und dann den davor nehmen.

Habe gesehen, dass man ja einfach die letzte Zeile mit einer Zahl in einer bestimmten Spalte suchen kann. Leider sind alle Makros die ich finde immer für Calc geschrieben und nicht für meinen speziellen Fall, dass ich innerhalb von Writer auf OLE Objekte zugreife.
Ich habe einen ganz simplen Loop geschrieben, der guckt ob ein Wert leer ist. Leider schlägt der auch schon an, wenn da einfach noch nichts reingeschrieben wurde. Gibt es da eine elegante Lösung die letzte Zeile in einer Spalte zu finden, die noch einen Wert enthält?
Am besten wäre natürlich die dynamische Referenzierung aus Calc aber ich wage zu bezweifeln,dass das geht ;)

Vielen Vielen Dank dir nochmal. Du hast mir echt sehr geholfen. OLE Objekte sind einfach sehr viel funktionsfähiger als normale Tabellen in Writer. Jetzt kann ich die echt gut benutzen.

Ich habe nochmal eine Datei angehängt wo du genau mein Szenario sehen kannst. Dann kann man sich besser was darunter vorstellen.

Hier für die Leute mit dem gleichen Problem mein jetziger Code.

Code: Alles auswählen

Sub Main
x = ThisComponent.Drawpage.CreateEnumeration
Do While x.hasMoreElements()
   akt = x.nextElement
   If akt.Name = "Objekt1" Then
      Msgbox akt.model.Sheets(0).getCellrangeByName("D11").Value
      Summe1 = akt.model.Sheets(0).getCellrangeByName("D11").Value
   End if
   
   If akt.Name = "Objekt6" Then
      Msgbox akt.model.Sheets(0).getCellrangeByName("B1").Value
      akt.model.Sheets(0).getCellrangeByName("B1").Value = Summe1
      Msgbox akt.model.Sheets(0).getCellrangeByName("B1").Value
   End if

   
Loop
End Sub
Liebe Grüße

PS: Möchte jetzt nicht noch extra ein neues Topic hierfür aufmachen aber kennt jemand einen einfachen Weg innerhalb eines Writer Dokuments festzulegen, dass die erste Seite nicht gedruckt wird? Ich möchte da eine Eingabeseite machen, die später nicht gedruckt werden soll. Damit ich keine Formulare benutzen muss.
Dateianhänge
Beispiel OLE Zugriff.odt
(44.4 KiB) 68-mal heruntergeladen
unic0rned
**
Beiträge: 36
Registriert: Fr, 02.12.2016 09:06

Re: [Gelöst] Innerhalb eines Writer Dokumentes von einem OLE Objekt auf ein anderes zugreifen

Beitrag von unic0rned »

So ich hab es jetzt gelöst :)

Danke Stephan für deine tollen Tipps und auch den Anderen.

Ich habe von dir im Forum woanders einen Beitrag gefunden wie man die letzte Zelle mit Inhalt findet und habe diese Funktion so umgeschrieben, dass sie bei mir funktioniert.

Fürs Archiv hier nochmal mein endgültiger Code. Aber seid gewarnt ;) Er ist keinstenfalls optimiert. Aber er funktioniert für meinen speziellen Fall.

Dieser Code durchläuft alle OLE Objekte innerhalb eines Writer Dokuments und findet dann jeweils in den Objekten die letzte Zelle einer bestimmten Spalte. Diese speichert er in eine Variable und übergibt diese am Ende in das letzte OLE Objekt und speichert dort in die Zellen rein.

Ich finde es schade, dass es so kompliziert ist mit CALC Tabellen innerhalb von Writer zu arbeiten. Es wäre doch schön, wenn man einfach von einem auf ein anderes OLE Calc Objekt referenzieren könnte per Drag and Drop. Bei dem Programm Ragtime funktioniert dies ja auch.

Aber mit etwas Bastelei geht es dann auch in Writer :) Viel Spaß beim rumprobieren.

Achso und falls jemand weiß, wie man die erste Seite beim Druck auslassen kann also als Standardeinstellung für ein bestimmtes Dokument bin ich sehr dankbar für den Tipp :)

Code: Alles auswählen

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

Sub Summen
x = ThisComponent.Drawpage.CreateEnumeration
'Erster Loop durchläuft alle Elemente und speichert die Summenwerte ab
Do While x.hasMoreElements()
   akt = x.nextElement
   
   If akt.Name = "Objekt1" Then
   
        With akt.model.Sheets().getByIndex(0)
    	y = .Columns(3).queryEmptyCells() 'Spalte D
    	z = y(y.Count-1).RangeAddress.StartRow - 1  ' z speichert Index der letzten Zeile
        sMaler = akt.model.Sheets(0).getCellByPosition(3,z).Value 'Summe abspeichern
        
  		End With	
   End if
   
   If akt.Name = "Objekt2" Then
   
        With akt.model.Sheets().getByIndex(0)
    	y = .Columns(3).queryEmptyCells() 'Spalte D
    	z = y(y.Count-1).RangeAddress.StartRow - 1  ' z speichert Index der letzten Zeile
        sDach = akt.model.Sheets(0).getCellByPosition(3,z).Value 'Summe abspeichern
        
  		End With	
   End if
   
   If akt.Name = "Objekt3" Then
   
        With akt.model.Sheets().getByIndex(0)
    	y = .Columns(3).queryEmptyCells() 'Spalte D
    	z = y(y.Count-1).RangeAddress.StartRow - 1  ' z speichert Index der letzten Zeile
        sTisch = akt.model.Sheets(0).getCellByPosition(3,z).Value 'Summe abspeichern
        
  		End With	
   End if
   
   If akt.Name = "Objekt4" Then
   
        With akt.model.Sheets().getByIndex(0)
    	y = .Columns(3).queryEmptyCells() 'Spalte D
    	z = y(y.Count-1).RangeAddress.StartRow - 1  ' z speichert Index der letzten Zeile
        sSonst = akt.model.Sheets(0).getCellByPosition(3,z).Value 'Summe abspeichern
        
  		End With	
   End if
   
   If akt.Name = "Objekt5" Then
   
        With akt.model.Sheets().getByIndex(0)
    	y = .Columns(3).queryEmptyCells() 'Spalte D
    	z = y(y.Count-1).RangeAddress.StartRow - 1  ' z speichert Index der letzten Zeile
        sArchitekt = akt.model.Sheets(0).getCellByPosition(3,z).Value 'Summe abspeichern
        
        	End With	
   End if
Loop

x = ThisComponent.Drawpage.CreateEnumeration
'Zweiter Loop durchläuft alle Elemente und setzt die Werte ein
Do While x.hasMoreElements()
   akt = x.nextElement
   
   If akt.Name = "Zusammenstellung" Then
      akt.model.Sheets(0).getCellByPosition(1,0).Value = sMaler
      akt.model.Sheets(0).getCellByPosition(1,1).Value = sDach
      akt.model.Sheets(0).getCellByPosition(1,2).Value = sTisch
      akt.model.Sheets(0).getCellByPosition(1,3).Value = sSonst
      akt.model.Sheets(0).getCellByPosition(1,4).Value = sArchitekt     
   End if
Loop
End Sub
Antworten