Seite 1 von 1

CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Mi, 19.12.2012 13:07
von balu
Hallo liebe Gemeinde,

hat schon mal einer von euch in einem Calc-Tabellenblatt verbundene Zellen gesucht, gefunden, UND auswerten können in welche Richtung der Verbund geht, UND um wieviele Zellen es sich dabei handelt, wenn man nicht die direkten Zelladressen angibt?

Mir ist klar das ich z.B. mit

Code: Alles auswählen

ThisComponent.Sheets(0).getCellRangeByName("C2").IsMerged
herausfinden kann ob eine Zelle verbunden ist. Auch das verbinden und wieder lösen wäre kein Problem. Mehr aber auch nicht.
Jedoch finde ich keinen Weg um mein oben beschriebenes Problem zu lösen.

Ja! Ich habe hier die SuFu benutzt, auch google z.B. mit "merge cells basic openoffice" gefüttert, und auch Andrew so wie die deutsche Übersetzung helfen mir nicht weiter. Irgendwie habe ich fast das Dumme Gefühl, als wäre das noch nicht wirklich so gut dokumentiert. Kann mich aber auch täuschen, da ich vielleicht irgendwo etwas übersehen habe.

Auch z.B. mit CurrentController, Selection etc. hatte ich bis jetzt keinen Erfolg gehabt.

Habt ihr mein Problem verstanden?
Wer kann mir helfen?

Freue mich auf eure Antworten.



Gruß
balu

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Mi, 19.12.2012 14:40
von Karolus
Hallo
Anschlussfrage:
Was möchtest du mit den angefragten Informationen anfangen?

Ich habe hier (Python)code mit dem sich zeilenweise zusammengefasste Zellen(Zeilen) wieder "normalisieren" lassen.
Dabei sammle ich zuerst die Spaltenindeces ein die nicht 'ismerged' sind ( ==die 'verdeckten' Zellen ) und gleichzeitig leer sind, und führe mit denen dann von rechts nach links

Code: Alles auswählen

sheet.removeRange( cell_by_index( col, row).getRangeAddress, 2 ) 
das Argument 2 steht für 'verschiebe die Zeile rechts davon nach links'

dadurch werden die Zusammenfassungen indirekt aufgelöst.

Karolus

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Mi, 19.12.2012 15:09
von Karolus
Hallo

Hilft dir:

Code: Alles auswählen

Sub Main
doc = thisComponent
sel = doc.CurrentSelection 'einzelne Zelle mglw. "ismerged"
sheet = sel.Spreadsheet
cursor = sheet.createCursorbyRange(sel)
cursor.collapseToMergedArea(true)
mri (cursor) 'Bereich "unter" der Zusammenfassung
End Sub
Karolus

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Mi, 19.12.2012 15:36
von balu
Hallo Karo,
Was möchtest du mit den angefragten Informationen anfangen?
Kurze Frage, lange Antwort.

Ich will mir ein Kopier-Erstellungs-Tool erstellen. Das heißt, mit dieser Datei(Tool) öffne ich eine bestehende Datei und erstelle gleichzeitig eine leere Datei. Das Tool untersucht in der geöffneten bestehenden Datei jede Zelle in einem bestimmten Bereich und auf einem bestimmten Blatt, und wenn es z.B. verbundene Zellen findet, dann sollen auch in der leeren Datei in einem bestimmten Blatt an der gleichen Stelle die Zellen verbunden werden.

Wenn also z.B. in der bestehenden Datei im Blatt1 die Zellen C2:D4 verbunden sind, dann sollen auch in der leeren Datei im Blatt1 die gleichen Zellen verbunden werden.

Jetzt deutlicher geworden was ich vorhabe?


Wenn mein Ziel mittels Python realisierbar wäre, wäre das auch gut, nur müsstest Du mir dabei intensiv behilflich sein.


Ach ja, was mir grad wieder einfällt!
Wenn ich eine verbundene Zelle, z.B die C2 von C2:D4, mit XRAY untersuche, dann erfahre ich wohl das C2 verbunden ist. Setze ich dann aber XRAY auf D2 an, dann ist diese Zelle nicht verbunden obwohl sie aber zu dem verbundenen Zellbereich gehört.

Mit anderen Worten, XRAY gibt bei einem Zellverbund immer nur diejenige aus bei der der Zellverbund beginnt. Die Zellen die zu dem Verbund gehören werden aber mit False von XRAY ausgewertet.


Och menoooo Karo! Warum bist Du so schnell?
Da wollt ich auf deine erste Antwort schreiben, als Du mit der zweiten daher kommst.
Hilft dir:
JAAAA!
Habe mri gegen xray getauscht, und schwupp-di-wupp kann ich folgendes lesen.

Code: Alles auswählen

AbsoluteName - string - "$Tabelle1.$C$2:$D$4"
Und das ist wirklich der Zellbereich den ich zu testzwecken verbunden hatte. Und damit müsste ich jetzt doch weiterkommen.


Eine Frage hätt ich da aber dennoch.
Ist MRI für solche Zwecke ehern geeignet, oder spielt das keine Rolle?


Karo, ich danke dir schon mal recht herzlich :D.



Gruß
balu

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Mi, 19.12.2012 16:52
von Karolus
Hallo
Ich will mir ein Kopier-Erstellungs-Tool erstellen. Das heißt, mit dieser Datei(Tool) öffne ich eine bestehende Datei und erstelle gleichzeitig eine leere Datei.
Evtl. ginge das leichter per
thisComponent.Sheets.importSheet( url_source_doc , sheet_Name, positions_index )

vmtl. gibts die Methode aber nur in LO
Eine Frage hätt ich da aber dennoch.
Ist MRI für solche Zwecke ehern geeignet, oder spielt das keine Rolle?
subjektive Antwort:
Ja, natürlich weil das in Python geschrieben ist und daher sowieso besser ist 8)

objektive Antwort:
ja da gibts ein paar Vorteile:
  • Mri blockiert nicht den Codeablauf und man kann gleich mehrere Objekte in einem Rutsch untersuchen.
  • Man hat mehrere Möglichkeiten Mri über →Extras→AddOns... auszuführen.
  • Mri hat nebenbei ein ganz brauchbare 'Code aufzeichnung' wahlweise für Basic, Python, Java etc.
  • Mri wird in meinen '(Python)Entwicklungsmodulen ganz einfach mit einer Zeile

    Code: Alles auswählen

    mri = createUnoService( "mytools.Mri" )
    aktiviert, und eingebunden in der Syntax:

    Code: Alles auswählen

    mri.inspect( irgendwas )
    Die Einbindung von Xray ist aus Python heraus etwas aufwendiger.
Wenn mein Ziel mittels Python realisierbar wäre, wäre das auch gut, nur müsstest Du mir dabei intensiv behilflich sein.
Da bei der Aufgabenstellung sowieso das meiste über API-methoden gemacht wird, wäre der Code relativ ähnlich egal ob Basic oder Python - du kannst aber gerne mal deinen Code posten wenn du 'fertig' bist, und ich 'übersetze' das dann nach Python.(vielleicht !)

Karolus

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Mi, 19.12.2012 20:33
von balu
Hallo Karo,
Ich will mir ein Kopier-Erstellungs-Tool erstellen. Das heißt, mit dieser Datei(Tool) öffne ich eine bestehende Datei und erstelle gleichzeitig eine leere Datei.
Evtl. ginge das leichter per
thisComponent.Sheets.importSheet( url_source_doc , sheet_Name, positions_index )

vmtl. gibts die Methode aber nur in LO
Also in OOo 3.3.0 ist diese Methode nicht vorhanden.

Da Du jetzt aber das Thema sowieso "vorgegeben" hast, werde ich deswegen einen neuen Thread im Forum "Generelle Diskussion" demnächst eröffnen der sich speziell nur um dieses Verfahren dreht. Ich war nämlich schon am überlegen ob ich wegen dem Thema: "Komplettes Blatt kopieren" einen eigenständigen Thread eröffnen sollte. Dort wirst Du dann auch sehen warum.

Ja, natürlich weil das in Python geschrieben ist und daher sowieso besser ist
Echt jetzt!? In Python?
Es ist schon eine ganze Weile her als ich das letzte mal Mri bei mir installiert hatte, und von daher nicht weiß das es in Python geschrieben ist. Das wäre aber wohl natürlich eine gute Vorlage um sich das eine oder andere abzuschauen, zumal es ja auch einen Dialog hat.


Und danke für die paar aufgelisteten Vorteile von Mri. Da spricht wirklich so einiges für Mri.


Da bei der Aufgabenstellung sowieso das meiste über API-methoden gemacht wird, wäre der Code relativ ähnlich egal ob Basic oder Python - du kannst aber gerne mal deinen Code posten wenn du 'fertig' bist, und ich 'übersetze' das dann nach Python.(vielleicht !)
Danke für dein Angebot. Ich werde später darauf zurück kommen. Und ich werde es dir allein überlassen ob Du das dann übersetzen willst, oder nicht.



Gruß
balu

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Di, 25.12.2012 18:57
von DPunch
Servus
balu hat geschrieben:Ich will mir ein Kopier-Erstellungs-Tool erstellen. Das heißt, mit dieser Datei(Tool) öffne ich eine bestehende Datei und erstelle gleichzeitig eine leere Datei. Das Tool untersucht in der geöffneten bestehenden Datei jede Zelle in einem bestimmten Bereich und auf einem bestimmten Blatt, und wenn es z.B. verbundene Zellen findet, dann sollen auch in der leeren Datei in einem bestimmten Blatt an der gleichen Stelle die Zellen verbunden werden.
Möglicherweise hilft Dir auch ein einfacher SheetLink?
Beispielcode (aus einem gespeicherten Dokument heraus ausführen):

Code: Alles auswählen

	sSourceSheetName = "Tabelle1"
	oDoc = thisComponent
	sSourceURL = oDoc.URL
	Dim args(0) as new com.sun.star.beans.PropertyValue
	args(0).Name = "Hidden"
	args(0).Value = False
	oNewDoc = StarDesktop.loadComponentFromUrl("private:factory/scalc","_blank",0,args)
	oTargetSheet = oNewDoc.Sheets.getByIndex(0)
	oTargetSheet.LinkMode = 1
	oTargetSheet.LinkURL = ConvertToURL(sSourceURL)
	oTargetSheet.LinkSheetName = sSourceSheetName
	oTargetSheet.LinkMode = 0
	oTargetSheet.clearContents(31)

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Di, 25.12.2012 21:57
von balu
Aloha DPunch,

erstmal ein Danke schön für deine Antwort.
Möglicherweise hilft Dir auch ein einfacher SheetLink?
Kurze Antwort: Nein.

Ausführlicher.

Ich meine ich hatte so etwas im laufe der letzten Wochen bei meinen recherchen zu dem Kopier-Erstellungs-Tool gelesen, aber auch gleich wieder verworfen. Und das aus dem einfachen Grund, weil ich bis vorhin nur vermutet hatte das dabei alles kopiert und eingefügt wird. Und aus der Vermutung wurde vorhin Gewissheit, als ich deinen Beispielcode getestet hatte. Aber das möchte ich ja unbedingt vermeden, das alles kopiert wird. Auch wenn man mittels

Code: Alles auswählen

clearContents(xx)
diverse Parameter einstellen kann, so wird ja erst einmal alles eingefügt, und erst im Anschluß daran werden dann z.B. je nach Parameter Formeln oder Werte gelöscht. Was man aber wohl nicht löschen kann, sind die Benutzerdefinierten Format-Codes, oder ich habe die Parameter noch nicht richtig verstanden.

Diese Codes spielen aber bei meinem Problem momentan weniger eine Rolle. Denn das ist allein schon von meiner Grundüberlegung her etwas Umfangreicher, und deshalb hatte ich einen extra Thread deswegen eröffnet der das wohl hoffentlich besser schildert.

CALC: Blätter zwischen Dateien kopieren, Ja oder Nein?



Gruß
balu

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Di, 25.12.2012 23:26
von F3K Total
Hallo Balu,
ich habe es noch nicht komplett gelöst, kann Dir aber immerhin einen Ansatz geben, denn ich habe mit Xray die folgende Eigenschaft eines Cursors gefunden:

Code: Alles auswählen

.collapseToMergedArea(true)
Angenommen du hast auf Tabelle1 einen Zellbereich verbunden, und es steht in der verbundenen Zelle etwas drin oder rechts bzw. drunter,
dann kannst du den verbundenen Bereich so finden:

Code: Alles auswählen

Sub S_findmergedcellrange
    osheet = thiscomponent.sheets.Tabelle1
    ocursor = osheet.createCursor
    ocursor.gotoendofusedarea(false)
    nEndcolumn = ocursor.rangeaddress.endcolumn
    nEndrow = ocursor.rangeaddress.endrow
    for i = 0 to nEndcolumn
       for k = 0 to nEndrow
       ocell = osheet.getcellbyposition(i,k)
       if ocell.ismerged then
           ocursor = osheet.createCursorbyrange(ocell)
           ocursor.collapseToMergedArea(true)
           exit for
       endif
       next k
    next i
    msgbox "Merged cells found: "+ocursor.AbsoluteName
End Sub
Aus dem aktuellen Cursor kannst Du die .RangeAddress des gemergten Bereiches auslesen.

Beste Grüsse von R

Edit: Hier nun schon ein verbessertes Makro, das alle verbundenen Zellbereiche im benutzen Bereich (.gotoendofusedarea) findet und in ein Array von Rangeaddresses oMergedRanges() schreibt.

Code: Alles auswählen

Sub S_findmergedcellranges
    dim oMergedRanges(0) as new com.sun.star.table.CellRangeAddress
    osheet = thiscomponent.sheets.Tabelle1
    ocursor = osheet.createCursor
    ocursor.gotoendofusedarea(false)
    nEndcolumn = ocursor.rangeaddress.endcolumn
    nEndrow = ocursor.rangeaddress.endrow
    sAbsoluteName = ""
    counter = 0
    for i = 0 to nEndcolumn
       for k = 0 to nEndrow
       ocell = osheet.getcellbyposition(i,k)
       if ocell.ismerged then
           ocursor = osheet.createCursorbyrange(ocell)
           ocursor.collapseToMergedArea(true)
           sNewAbsoluteName = ocursor.AbsoluteName
           if sAbsoluteName <> sNewAbsoluteName then
               msgbox "Merged cells found: "+ocursor.AbsoluteName
               redim preserve oMergedRanges(counter)
               oMergedRanges(counter) = ocursor.Rangeaddress
               sAbsoluteName = sNewAbsoluteName
               counter = counter + 1
           endif
       endif
       next k
    next i
    xray oMergedRanges()
End Sub
...und hier ein kleines Beispiel ... gefundene verbundene Zellbereiche werden eingefärbt ...

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Do, 27.12.2012 14:49
von balu
Hallo Rik,
ich habe es noch nicht komplett gelöst, kann Dir aber immerhin einen Ansatz geben
Danke schön dafür.
Ich brauchte gar nicht mehr so viel zu ändern, damit es für meine Situation passt. Deine Idee mit dem Array ist gut und schnell, und so nebenbei hast Du mir dadurch einen Arbeitsschritt abgenommen :D.

Code: Alles auswählen

collapseToMergedArea
Hatte auch Karolus mir schon vorgestellt. Wenn man erstmal den richtigen Weg zum weitersuchen findet, dann fällt einem wohl vielles leichter. Jedoch muss man ja erst mal den Weg finden.


Code: Alles auswählen

thiscomponent.sheets.Tabelle1
:shock:
Was muss ich denn da lesen und sehen? Das wiederspricht ja dem was ich bis jetzt so gelernt habe.

Code: Alles auswählen

thiscomponent.Sheets.getByName("Tabelle1")
Okay, deine Variante funktioniert wohl, aber ich persönlich bleibe wohl bei dem was ich bis jetzt so gelernt habe. Das ist jetzt aber nichts gegen dich.



Gruß
balu

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Do, 27.12.2012 15:00
von F3K Total
Hallo Balu,
balu hat geschrieben:Hatte auch Karolus mir schon vorgestellt.
... hatte ich überlesen ... :roll:

Code: Alles auswählen

thiscomponent.sheets.Tabelle1
funktioniert nur, wenn man weiß, was man tut.
  • keine Leerzeichen
  • keine Sonderzeichen
  • Groß-/Kleinschreibung beachten
... aber spart Tipparbeit ... sei öfter mal ein Faultier ... :D
funktioniert übrigens auch bei Formularen z.B:

Code: Alles auswählen

oform = thiscomponent.drawpage.forms.MainForm.SubForm
Gruß Rik

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Do, 27.12.2012 16:08
von Karolus
Hallo
thiscomponent.sheets.Tabelle1
Diese 'Abkürzung' funktioniert zu meinem Erstaunen auch in Python:

Code: Alles auswählen

def aaa_test():
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets.Tabelle1
Karolus

Re: CALC: verbundene Zellen suchen, finden und auswerten.

Verfasst: Fr, 28.12.2012 01:41
von balu
Hallo Rik,
funktioniert nur, wenn man weiß, was man tut.
Danke für die Aufklärung der "neuen-deutschen-BASIC-Rechtschreibreform" :lol: .

Spaß beiseite. Gut zu Wissen das es dabei auch Stolperfallen gibt.



Gruß
balu