vertikale Mitte von Calc-Zelle per Makro bestimmen
Moderator: Moderatoren
vertikale Mitte von Calc-Zelle per Makro bestimmen
Hallo,
die Überschrift ist evtl. ein wenig unverständlich, es geht um Folgendes:
Allgemein dürfte bekannt sein das sich mit Calc nicht vernünftig layouten lässt weil die Summe von Zellhöhen und Zellbreiten sich nicht mit den Koordinaten von Objekten in Einklang bringen lassen, die auf dem Tabellenblatt angeordnet werden. [1]
Meine Frage ist deshalb: Kann man, und wenn ja wie, per Makro die optisch genaue vertikale Mitte einer bestimmten Zelle ermitteln?
Mögliche zu beachtende Nebenbedingungen wären mir zunächst egal, z.B. hätte ich nichts dagegen feste Zellhöhen definieren zu müssen und somit nicht mit automatisch optimaler Höhe arbeiten zu können.
Gruß
Stephan
[1]
Beispiel zur Erklärung:
Zeile 1 bis 100 eines Tabellenblattes haben die Höhe 1 cm. Ordnet man ein Rechteck genau auf der unteren Zellgrenze von A1 an so entspricht das y=0,99 cm (wenn man nach der Bildschirmdarstellung geht). Dieses Rechteck müsste mit y=99 cm somit deckungsgleich zu Zelle A100 sein, ist es aber nicht.
(Unnötig zu erwähnen das auch die Einführung einer proportionalen Korrektur nicht hilft, denn die Abweichung zwischen A1 und A10 entspricht 0,06, verzehnfacht man die Korrektur für A100 passt es trotzdem nicht.)
die Überschrift ist evtl. ein wenig unverständlich, es geht um Folgendes:
Allgemein dürfte bekannt sein das sich mit Calc nicht vernünftig layouten lässt weil die Summe von Zellhöhen und Zellbreiten sich nicht mit den Koordinaten von Objekten in Einklang bringen lassen, die auf dem Tabellenblatt angeordnet werden. [1]
Meine Frage ist deshalb: Kann man, und wenn ja wie, per Makro die optisch genaue vertikale Mitte einer bestimmten Zelle ermitteln?
Mögliche zu beachtende Nebenbedingungen wären mir zunächst egal, z.B. hätte ich nichts dagegen feste Zellhöhen definieren zu müssen und somit nicht mit automatisch optimaler Höhe arbeiten zu können.
Gruß
Stephan
[1]
Beispiel zur Erklärung:
Zeile 1 bis 100 eines Tabellenblattes haben die Höhe 1 cm. Ordnet man ein Rechteck genau auf der unteren Zellgrenze von A1 an so entspricht das y=0,99 cm (wenn man nach der Bildschirmdarstellung geht). Dieses Rechteck müsste mit y=99 cm somit deckungsgleich zu Zelle A100 sein, ist es aber nicht.
(Unnötig zu erwähnen das auch die Einführung einer proportionalen Korrektur nicht hilft, denn die Abweichung zwischen A1 und A10 entspricht 0,06, verzehnfacht man die Korrektur für A100 passt es trotzdem nicht.)
- Dateianhänge
-
- Abweichung.gif (14.68 KiB) 5203 mal betrachtet
Re: vertikale Mitte von Calc-Zelle per Makro bestimmen
Ach, falls jemand die Originaldatei zum 'rumprobieren' braucht ...
- Dateianhänge
-
- Layouten_mit_Calc.ods
- (8.8 KiB) 123-mal heruntergeladen
Re: vertikale Mitte von Calc-Zelle per Makro bestimmen
Hallo,
wenn man sich die Position der Zelle A1 und die des ersten Rechtecks per Makro ansieht, dann befindet sich die Zelle bei y=1000 und das Rechteck bei y=993. Optisch erscheint das Rechteck genau auf dem oberen Rand, aber in Wirklichkeit 0,7 mm darüber.
Die Mitte einer Zelle wäre doch einfach der Mittelwert aus der Anfangsposition der Zelle und der der nachfolgenden Zelle? Ich glaube, ich habe das eigentliche Problem noch nicht erfasst.
wenn man sich die Position der Zelle A1 und die des ersten Rechtecks per Makro ansieht, dann befindet sich die Zelle bei y=1000 und das Rechteck bei y=993. Optisch erscheint das Rechteck genau auf dem oberen Rand, aber in Wirklichkeit 0,7 mm darüber.
Die Mitte einer Zelle wäre doch einfach der Mittelwert aus der Anfangsposition der Zelle und der der nachfolgenden Zelle? Ich glaube, ich habe das eigentliche Problem noch nicht erfasst.
Gruß,
mikeleb
mikeleb
Re: vertikale Mitte von Calc-Zelle per Makro bestimmen
ja, stimmt, die Angaben im Screenshot in cm waren ein 'Lapsus' meinerseits. Ich weiß das die Angaben per Makro in 1/100 mm erfolgen.bei y=1000 und das Rechteck bei y=993
Ganz genau. Nun ist aber die Anfangsposition einer Zelle nur dadurch zu bekommen das man alle Zeilenhöhen oberhalb der Zelle addiert und das funktioniert nicht und das ist der Inhalt meiner Frage, also wie man das so löst das es funktioniert.Die Mitte einer Zelle wäre doch einfach der Mittelwert aus der Anfangsposition der Zelle und der der nachfolgenden Zelle?
Das eigentliche Problem ist das ich Objekte (Zeichnungen, Bilder, Steuerelemente, Diagramme ...) vertikal mittig zum Zelltext einer beliebigen Zelle, automatisiert per Makro ausrichten will.Ich glaube, ich habe das eigentliche Problem noch nicht erfasst.
Oder anders gesagt (das liefe auf Adäquates hinaus): Wie positioniere ich per Makro das im Screenshot sichtbare Rechteck (in Nähe von Zelle A100) so das es vertikal exakt zentriert zur 'Trennlinie' zwischen Zelle A100 und Zelle A101 ausgerichtet ist.
Gruß
Stephan
Re: vertikale Mitte von Calc-Zelle per Makro bestimmen
Hallo,
Code: Alles auswählen
Sub Main
oDoc=ThisComponent
oDrawings=oDoc.Drawpages(0)
For i=0 to oDrawings.Count-1
oDraw=oDrawings.getByIndex(i)
oAnkerzelle=oDraw.anchor
'Höhe des Zeichnungsobjekts
hoch=oDraw.size.height
'Position und Höhe der Ankerzelle
y_Anker=oAnkerzelle.Position.y
h_Anker=oAnkerzelle.Size.Height
'Neupositionierung
y_neu=y_Anker+h_Anker-hoch/2
oPosition=oDraw.Position
oPosition.y=y_neu
oDraw.setPosition(oPosition)
Next
End Sub
Gruß,
mikeleb
mikeleb
Re: vertikale Mitte von Calc-Zelle per Makro bestimmen
Danke, aber das hilft mir noch nicht ausreichend.mikeleb hat geschrieben: ↑So, 22.03.2020 22:42 Hallo,Code: Alles auswählen
Sub Main oDoc=ThisComponent oDrawings=oDoc.Drawpages(0) For i=0 to oDrawings.Count-1 oDraw=oDrawings.getByIndex(i) oAnkerzelle=oDraw.anchor 'Höhe des Zeichnungsobjekts hoch=oDraw.size.height 'Position und Höhe der Ankerzelle y_Anker=oAnkerzelle.Position.y h_Anker=oAnkerzelle.Size.Height 'Neupositionierung y_neu=y_Anker+h_Anker-hoch/2 oPosition=oDraw.Position oPosition.y=y_neu oDraw.setPosition(oPosition) Next End Sub
Unter Realbedingungen 'zerschlägt' dieses Makro das Layout, weil überhaupt nicht gewährleistet ist das Objekte immer an der Zelle verankert sind zu welcher sie ausgerichtet werden müssen. z.B. siehe Beispieldatei, dort ist das 'erste' Rechteck mit 0,99 an A1 verankert, wenn das auf 1,00 erhöht wird, was optisch fast nicht zu sehen ist, ändert infolge das Makro die Verankerung um eine ganze Zellhöhe.
Hilfreich Ist:
Code: Alles auswählen
y_Anker=oAnkerzelle.Position.y
Oder ich bin inzwischen schon betriebsblind?
Gruß
Stephan
Re: vertikale Mitte von Calc-Zelle per Makro bestimmen
Hallo,
die Positionierung ist offensichtlich nicht so ganz ohne.
An sich sollte (!) oAnkerzelle.Position.y die vertikale Position der Zelle liefern. Das funktioniert bei mir (getestet unter LO 4.3 + Win, LO5.3+Linux) auch.
Damit die Verankerung an der Zelle bleibt, muss die Position des Zeichnungsobjekts innerhalb der Zelle bleiben.
Soweit ganz einfach, aber ...
Es gibt schon einen Unterschied zwischen Zellenhöhe und Zeilenhöhe (mind. 1/100 mm). In einer ausgeblendeten Zeile ist die Zeilenhöhe 0, die Zellenhöhe aber 1. Noch spannender wird es, wenn man die Höhe eines Bereiches betrachtet.
Dazu habe ich mal in deine Datei ein Testmakro eingebuat, dass in einem Bereich die entsprechenden Größen anzeigt.
Vielleicht hilft es ja, einen sinnvollen Zusammehang herzustellen.
die Positionierung ist offensichtlich nicht so ganz ohne.
An sich sollte (!) oAnkerzelle.Position.y die vertikale Position der Zelle liefern. Das funktioniert bei mir (getestet unter LO 4.3 + Win, LO5.3+Linux) auch.
Damit die Verankerung an der Zelle bleibt, muss die Position des Zeichnungsobjekts innerhalb der Zelle bleiben.
Soweit ganz einfach, aber ...
Es gibt schon einen Unterschied zwischen Zellenhöhe und Zeilenhöhe (mind. 1/100 mm). In einer ausgeblendeten Zeile ist die Zeilenhöhe 0, die Zellenhöhe aber 1. Noch spannender wird es, wenn man die Höhe eines Bereiches betrachtet.
Dazu habe ich mal in deine Datei ein Testmakro eingebuat, dass in einem Bereich die entsprechenden Größen anzeigt.
Vielleicht hilft es ja, einen sinnvollen Zusammehang herzustellen.
- Dateianhänge
-
- Layouten_mit_Calc.ods
- (41.3 KiB) 110-mal heruntergeladen
Gruß,
mikeleb
mikeleb