🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

LO Calc Makro DrawPage.getByName geht nicht

Alles zur Programmierung im LibreOffice.
Antworten
MaLe
Beiträge: 5
Registriert: Sa 26. Apr 2025, 05:25

LO Calc Makro DrawPage.getByName geht nicht

Beitrag von MaLe » Sa 26. Apr 2025, 05:43

Hallo

Ich habe in LO Calc 24.8.6.2 ein Sheet mit zwei Schaltflächen die jeweils eine DrawPage einblenden oder ausblenden.
Wenn ich die DrawPage mit "getByIndex" anspreche geht alles wie gewollt. Wenn ich sie aber mit "getByName" ansprechen will kommt der BASIC-Laufzeitfehler "Eigenschaft oder Methode nicht gefunden: getByName.".

Ich sehe den Fehler nicht (komme aus der JavaScript/PHP Ecke).

Code: Alles auswählen

Sub S_ShowHide1_InfoBox1
	oThisSheet = ThisComponent.CurrentController.ActiveSheet
	oThisDrawPage = 	oThisSheet.DrawPage.getByIndex(0)
	
	oThisDrawPageName = oThisDrawPage.Name
	MsgBox "Drawpage heisst: "+oThisDrawPageName

	oDrawPageInfoBox1 = 	oThisDrawPage
	if oDrawPageInfoBox1.Visible then
		oDrawPageInfoBox1.Visible = false
	else
		oDrawPageInfoBox1.Visible = true
	endif
End Sub

Sub S_ShowHide2_InfoBox1
	oThisSheet = ThisComponent.CurrentController.ActiveSheet
	oThisDrawPage = 	oThisSheet.DrawPage.getByName("InfoBox1")
	
	oThisDrawPageName = oThisDrawPage.Name
	MsgBox "Drawpage heisst: "+oThisDrawPageName

	oDrawPageInfoBox1 = 	oThisDrawPage
	if oDrawPageInfoBox1.Visible then
		oDrawPageInfoBox1.Visible = false
	else
		oDrawPageInfoBox1.Visible = true
	endif
End Sub
NB.
Die Schaltfläche 1 steuert "S_ShowHide1_InfoBox1", Die Schaltfläche 2 steuert "S_ShowHide2_InfoBox1", siehe Anhang.

Kann mir da jemand helfen?

Gruss
MaLe
Dateianhänge
TESTSchaltfläche.ods
(17.61 KiB) 98-mal heruntergeladen

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

Re: LO Calc Makro DrawPage.getByName geht nicht

Beitrag von mikele » Sa 26. Apr 2025, 11:59

Hallo,
zunächst eine begriffliche Klarstellung: Die drawpage ist pratisch die Ebene des Tabellenblattes auf der sich alle Zeichnungs- und Grafikobjekte befinden. Dazu gehören auch die Schaltflächen etc.
Du möchtes nun auf ein solches Element names "InfoBox1" zugreifen (nicht auf eine ganze drawpage).
Die drawpage hat aber (leider) keine Methode .getByName. Daher musst du, wenn du nur den Namen kennst, alle Elemente durchsuchen bis du das richtige gefunden hast, z. B. so:

Code: Alles auswählen

Sub S_ShowHide1_InfoBox1
	oThisSheet = ThisComponent.CurrentController.ActiveSheet
	oThisDrawPage = 	oThisSheet.DrawPage.getByIndex(0)
	
	oThisDrawPageName = oThisDrawPage.Name
	MsgBox "Drawpage heisst: "+oThisDrawPageName

	oDrawPageInfoBox1 = 	oThisDrawPage
	if oDrawPageInfoBox1.Visible then
		oDrawPageInfoBox1.Visible = false
	else
		oDrawPageInfoBox1.Visible = true
	endif
End Sub

Sub S_ShowHide2_InfoBox1
	oThisSheet = ThisComponent.CurrentController.ActiveSheet

	oThisDrawPage =  getelement(oThisSheet.DrawPage, "InfoBox2")
	if not isnull(oThisDrawPage) then
		oThisDrawPageName = oThisDrawPage.Name
		MsgBox "Drawpage heisst: "+oThisDrawPageName
	
		oDrawPageInfoBox1 = 	oThisDrawPage
		if oDrawPageInfoBox1.Visible then
			oDrawPageInfoBox1.Visible = false
		else
			oDrawPageInfoBox1.Visible = true
		endif
	end if
End Sub

function getElement(dp as object, sName as string) as object
	
	
	for i=0 to dp.count-1
		if dp.getByIndex(i).Name=sName then
			getelement=dp.getByIndex(i)
		end if
	next
	


end function
oder einfach nur mit einer Schaltfläche zum Switchen der Sichtbarkeit:

Code: Alles auswählen

Sub Showhide
	
	oThisSheet = ThisComponent.CurrentController.ActiveSheet
	oBox =  getelement(oThisSheet.DrawPage, "InfoBox1")
	if not isnull(oThisDrawPage) then
		oBox.Visible=not(oBox.Visible)
	end if

	
end sub

function getElement(dp as object, sName as string) as object
	
	for i=0 to dp.count-1
		if dp.getByIndex(i).Name=sName then
			getelement=dp.getByIndex(i)
		end if
	next

end function
Gruß,
mikele

MaLe
Beiträge: 5
Registriert: Sa 26. Apr 2025, 05:25

Re: LO Calc Makro DrawPage.getByName geht nicht

Beitrag von MaLe » Sa 26. Apr 2025, 14:46

Hallo mikele,
vielen Dank für die begriffliche Klarstellung! Das wusst ich nicht. Dann hat also jedes Zeichnungs- und Grafikobjekt eine eigene Drawpage. Wenn ich nämlich weitere Grafikobjekte einfüge ist es dann "drawpage(1)", "drawpage(2)" usw. Der Grund sehe ich jetzt nicht. Es ist mir jetzt aber auch klar das getByName nicht geht weil die dann keinen Namen haben (oder ich sehe nicht wo ich den Namen definieren könnte).

Es geht mir ja darum das ich eine Struktur und Regel für weitere Projekte einführe die Möglicherweise diese InfoBox haben aber Möglicherweise noch weitere in unterschiedlicher Anzahl. Die Tabelle(n) sind dann alle geschütz damit niemand aus versehen eine Formel in einer Zelle löscht die Teilweise sehr komplexe berechnungen sind.

Ich danke Dir auch für die Programmier-Vorschläge das hilft sehr!

Gruss
MaLe

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

Re: LO Calc Makro DrawPage.getByName geht nicht

Beitrag von mikele » Sa 26. Apr 2025, 15:12

Hallo,
Dann hat also jedes Zeichnungs- und Grafikobjekt eine eigene Drawpage.
Eben gerade nicht. Es gibt eine Drawpage und darauf sind alle Zeichnungs- und Grafikobjekte.
.drawpage(1) ist nur die Kurzform für .drawpage.getByIndex(1) was bedeutet "nimm' von der Drawpage das Element mit dem Index 1 "
Gruß,
mikele

MaLe
Beiträge: 5
Registriert: Sa 26. Apr 2025, 05:25

Re: LO Calc Makro DrawPage.getByName geht nicht

Beitrag von MaLe » Sa 26. Apr 2025, 16:10

Hallo
Wenn ich ein zweites Grafikobjekt anlege kann ich das erste mit drawpage(0) und das zweite mit drawpage(1) ansprechen, bei einem dritten ist es dann drawpage(3). Deshalb habe ich angenommen die Index sind auf "drawpage" bezogen und nicht auf die Objekte in "drawpage". Jetzt habe ich die Struktur begriffen.
Danke!

Gruss
MaLe

MaLe
Beiträge: 5
Registriert: Sa 26. Apr 2025, 05:25

Re: LO Calc Makro DrawPage.getByName geht nicht

Beitrag von MaLe » So 27. Apr 2025, 19:27

Hallo
Das wird alles so nicht funktionieren wie ich es möcht!
Ich will ja nur ein Makro schreiben das für ein Textfeldobjekt in jedem Tabellenblatt funktioniert.
Ich kann in einem anderen Tabellenblatt keine Textfeldobjekt mit dem gleichen Namen erstellen um über das Makro darauf zugreifen zu können.
Grundsätzlich würde mein Ansatz funktionieren. Ich habe zB. das Tabellenblatt "gedoppelt" und da heisst es Tatsächlich gleich und das Makro funktioniert dann einwandfrei. Nur eben kann ich in einem neuen Tabellenblatt keine neues Textfeldobjekt mit dem gleichen Namen erstellen und wenn ich es Kopiere und einfüge heisst es anders und ich kann es nicht mit gleichen Namen speichern.
Ob das mit dem "doppeln" des Tabellenblatt von den LO Entwickler wirklich so gewollt ist weiss ich nicht.
Es bleibt also die Voraussetzung:
- 1 Makro für alle Tabellenblätter für die jeweilige Schaltfläche und Textfeldobjekt
Alles andere ist ein gefrikel, unprofessionel und ineffizient
Gruss
MaLe

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

Re: LO Calc Makro DrawPage.getByName geht nicht

Beitrag von mikele » So 27. Apr 2025, 21:44

Hallo,
- 1 Makro für alle Tabellenblätter für die jeweilige Schaltfläche und Textfeldobjekt
Kein Problem.
Ich halte es für durchaus sinnvoll, dass die Bezeichnung der Grafikelemente eindeutig ist. Warum es beim Duplizieren eines Tabellenblattes nicht passiert, halte ich eher für eine programmtechnische Inkonsequenz. Es erklärt aber, warum es keine Methode .getByName gibt, weil der Name eben nicht zwingend eindeutig ist.
Nun zur Umsetzung deines Ziels:
1) Auf jedem Tabellenblatt eine Schaltfläche die auf dasselbe Makro zielt ist unproblematisch.
2) Gib dem Textfeldobjekt einen Namen, der auf dem Tabellenblatt nur einmal vorkommt (wenn es überhaupt das einzige Textfeldobjekt ist würde es sogar nich anders gehen), z. B. eben "InfoBox1". Beim Kopieren auf ein anderes Blatt wird daraus "InfoBox2" etc.
3) Passe das Makro an, so dass es nciht nach dem vollen Namen sondern nur nach dem Anfang "InfoBox" sucht.

Code: Alles auswählen

Sub Showhide
	
	oDp = ThisComponent.CurrentController.ActiveSheet.DrawPage
	sName="InfoBox"
	for i=0 to oDp.count-1
		if left(oDp.getByIndex(i).Name, len(sName))=sName then
			oDp.getByIndex(i).Visible=not(oDp.getByIndex(i).Visible)
		end if
	next	
	
end sub
Dateianhänge
TESTSchaltfläche.ods
(17.21 KiB) 125-mal heruntergeladen
Gruß,
mikele

MaLe
Beiträge: 5
Registriert: Sa 26. Apr 2025, 05:25

Re: LO Calc Makro DrawPage.getByName geht nicht

Beitrag von MaLe » Mo 28. Apr 2025, 07:11

Hallo
Danke Dir!
Auf diesen Lösungsansatz bin ich letzte Nacht auch gekommen.
Ja das ist in Libre Office Calc wirklich inkonsequent und sollte angepasst werden.
Ich habe das mal so in meinem Tests umgesetzt und funktioniert nach meinem Wunsch.
Für alle anderen die irgendwann mal das durchlesen:

Bedingung:
a) Ein Makro das über eine Schaltfläche ein Textobjekt auf dem aktiven Tabellenblatt ein/ausblendet.
b) Die Textobjekte sollten auf weitere Tabellenblätter kopiert werden können und über eine neue Schaltfläche in diesem Tabellenblatt mit dem Makro gesteuert werden.

Umsetzung:
1. Textobjekt auf Tabellenblatt erstellen und nach Wunsch formatieren. Der Name muss dabei zwingend mit dem Suchwort im Makro beginnen und mit einer Zahl ergänzt werden (zB. InfoBox1, das Suchwort ist hier InfoBox und die Ergänzung 1).
2. Makro erstellen, zB.:

Code: Alles auswählen

Sub S_ShowHide_InfoBox
	oDrawPage = ThisComponent.CurrentController.ActiveSheet.DrawPage
	sInfoBoxName = "InfoBox"
	for i = 0 to oDrawPage.Count-1
		if left(oDrawPage.getByIndex(i).Name, len(sInfoBoxName)) = sInfoBoxName then
			oDrawPage.getByIndex(i).Visible = not(oDrawPage.getByIndex(i).Visible)
		end if
	next	
end sub
3. Schaltfläche auf Tabellenblatt erstellen und als Ereigniss > Aktion ausführen das Makro definieren, zB. S_ShowHide_InfoBox
4. Für weitere, gleiche Textobjekte mit gleicher Funktionalität auf anderen Tabellenblätter kann das Textobjekt und die Schaltfläche kopiert und eingefügt werden. Der Name dieses Textobjekt mus dann zwingend mit dem gleichen Suchwort beginnen (zB. InfoBox2 usw.)

Gruss
MaLe


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten