Seite 1 von 1

[gelöst] Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Fr 26. Feb 2016, 14:37
von Fischreiher
Ich habe für MS Office hier http://www.office-loesung.de/ftopic211118_0_0_asc.php eine Lösung gesehen, finde aber kein Äquivalent für Libreoffice.

Ich suche einen Weg, beim Klick auf eine Schaltfläche deren Größe und Position an die Zellgröße anzupassen.
Zeile und Spalte der Zelle, in der sich die Schaltfläche befindet, sind dabei bekannt.

Mein Ansatz, überhaupt erst mal die Schaltfläche zu greifen, wirft schon einen Fehler in der letzten Zeile:

Code: Alles auswählen

Sub myTestFunction(Event As Object)

   activeSheetNumber = thisComponent.getCurrentSelection.CellAddress.sheet

   Dim oForm As Object
   Dim oButton As Object
   oForm=Event.Source.Model.Parent
   oButton=oForm.GetByName("myTest") 'NoSuchElementException
End Sub
Kann mir jemand helfen?

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Fr 26. Feb 2016, 20:10
von mikele
Hallo,

darf ich mal fragen wozu?
Wenn die Schaltfläche an der Zelle verankert ist, ändert sich die Größe der Schaltfläche doch automatisch mit der Größe der Zelle.

Unabhängig davon: Um auf den Button zuzugreifen reicht:

Code: Alles auswählen

oButton=Event.Source.Model

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Sa 27. Feb 2016, 09:40
von Fischreiher
Oh danke, das mit dem Button-Zugriff war mir zu einfach, um darauf zu kommen ;) .

Ich möchte lediglich, dass der Button "schön aussieht", also das Feld exakt ausfüllt, auch wenn die Feldgröße geändert wird oder anderswo Zeilen/Spalten eingefügt werden, so dass der Button sich verschiebt.

Wenn es eine Lösung gibt, den Button
- an eine bestimmte Zelle zu heften
- ihn bei (0,0) innerhalb der Zelle zu positionieren und
- die Größe "wie die Zellgröße" zu wählen,
wäre mir damit geholfen.

Davon habe ich aber nur den ersten Punkt gefunden
- Verankerung - an der Zelle
, und das auch nur in der Ausprägung, dass der Button an eine nicht näher benannte Zelle geheftet wird. Wenn der Button ein klein wenig in die Nachbarzelle übersteht, weiß ich schon nicht, an welche Zelle er angeheftet ist.
- Position X / Y
werden dabei weiterhin relativ zum Ursprung des Blattes angezeigt und lediglich angepasst, wenn sich andere Zeilen/Spalten ändern.

Ich suche also eine "Snap to Grid" - Funktion, egal ob im Macro oder außerhalb.

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Sa 27. Feb 2016, 13:23
von mikele
Hallo,

das folgende Makro positioniert alle Buttons, die an Zellen verankert sind, wie gewünscht an der Position (0,0) und passt sie exakt der Größe der Zelle an.

Code: Alles auswählen

Sub button_zellanpassung
	odoc=thiscomponent
	otab=odoc.sheets(0)
	odraw=otab.drawpage
	for i=0 to odraw.count-1
		oshape=odraw.getbyindex(i)
		ozelle=oshape.anchor
		if ozelle.supportsservice("com.sun.star.sheet.SheetCell") and oshape.control.supportsservice("com.sun.star.form.component.CommandButton") then
			oshape.position=ozelle.position
			oshape.size=ozelle.size
		end if
	next
End Sub
Lässt du "and oshape.control.supportsservice("com.sun.star.form.component.CommandButton")" weg, dann erfolgt die Anpassung für alle an Zellen verankerten Kontrollelementen.
Werden nun Zeilen/Spalten eingefügt wird der Button nicht verschoben, da an der Zelle verankert. Ändert sich allerdings die Größe der Zelle, muss das Makro erneut aufgerufen werden. Du könntest natürlich das Makro auch bei jedem Klick auf den Button auslösen (zusätzlich zur sonst geplanten Aktion), sodass es bei einer Zelländerung nach dem nächsten Klick alles wieder hübsch aussieht.

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Sa 27. Feb 2016, 15:40
von Fischreiher
Ganz heißen Dank, mikele, das hat auf den meisten Sheets sofort funktioniert.

Auf manchen Sheets scheint es zusätzliche Shapes zu geben, die kein ".Control" haben, daher musste ich noch per

Code: Alles auswählen

if HasUnoInterfaces(oShape, "com.sun.star.drawing.XControlShape") then
filtern, um eine Fehlermeldung zu vermeiden.

Etwas adaptiert auf meine Bedingungen (Anpassung auf die Größe einer CellRange) sieht der Code jetzt so aus:

Code: Alles auswählen

Sub AdjustButtonSize(IColMin,iRowMin,IColMax,iRowMax)
	oSheet=ThisComponent.getCurrentController().getActiveSheet()
	oDraw=oSheet.drawpage
	for i=0 to oDraw.count-1
		oShape=oDraw.getbyindex(i)
		'oCell=oShape.anchor
		oCell=oSheet.getCellByPosition(IColMin,iRowMin)
		oCellRange=oSheet.getCellRangeByPosition(IColMin,iRowMin,IColMax,iRowMax)
		if HasUnoInterfaces(oShape, "com.sun.star.drawing.XControlShape") then
			if oShape.Control.Name = "berechnen" then
				if oCell.supportsservice("com.sun.star.sheet.SheetCell") and oShape.control.supportsservice("com.sun.star.form.component.CommandButton") then
					oShape.position=oCell.position
					'oShape.size=oCell.size
					oShape.size=oCellRange.size
				end if
			end if
		end if
	next
End Sub

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Sa 27. Feb 2016, 18:53
von Fischreiher
Es funktioniert alles prima, bis ich das Dokument abspeichere und neu lade. Dann haben manche Buttons wieder eine Größe und Position, die sie früher einmal hatten, und manche sind kleiner als sie je zuvor waren. Auf manchen Blättern stimmen die Positionen und Größen, ohne dass ich ein Schema erkenne.

Muss man evtl. noch einen Befehl zum "Zurückschreiben" der Werte ergänzen?

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Sa 27. Feb 2016, 21:31
von mikele
Hallo,
das dürfte eigentlich nicht passieren. Welche Programmversion nutzt du?
Kannst du deine, ggf. anonymisierte, Datei zum Check hochladen?

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Sa 27. Feb 2016, 21:53
von Fischreiher
Das ist nicht mehr nötig. Beim Reduzieren auf ein Testfile für Dich lief es plötzlich, ich habe dann gemerkt, dass ich die Funktion versehentlich innerhalb von

Code: Alles auswählen

		ThisComponent.lockControllers()
		ThisComponent.addActionLock()
		[...]
		AdjustButtonSize(iColButtonMin,iRowButtonMin,IColButtonMax,iRowButtonMax)
		[...]
		ThisComponent.removeActionLock()
		ThisComponent.unlockControllers()
aufgerufen hatte.

Trotzdem vielen Dank für Dein Angebot, Dir das anzusehen.

Re: Schaltfläche per Makro an Zellgröße anpassen

Verfasst: Sa 27. Feb 2016, 22:50
von mikele
Hallo,
schön, dass es funktioniert.
Nebenbei, da es offensichtlich "nur" um das eine Control namens "berechnen" geht (der ja die entsprechenden Eigenschaften besitzt), kannst du dir den 2. if-then- Zweig sparen
Anstelle von

Code: Alles auswählen

if oShape.Control.Name = "berechnen" then
            if oCell.supportsservice("com.sun.star.sheet.SheetCell") and oShape.control.supportsservice("com.sun.star.form.component.CommandButton") then
sollte

Code: Alles auswählen

if oShape.Control.Name = "berechnen" then
reichen.