Seite 1 von 1
LO Calc Makro DrawPage.getByName geht nicht
Verfasst: Sa 26. Apr 2025, 05:43
von MaLe
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
Re: LO Calc Makro DrawPage.getByName geht nicht
Verfasst: Sa 26. Apr 2025, 11:59
von mikele
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
Re: LO Calc Makro DrawPage.getByName geht nicht
Verfasst: Sa 26. Apr 2025, 14:46
von MaLe
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
Re: LO Calc Makro DrawPage.getByName geht nicht
Verfasst: Sa 26. Apr 2025, 15:12
von mikele
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 "
Re: LO Calc Makro DrawPage.getByName geht nicht
Verfasst: Sa 26. Apr 2025, 16:10
von MaLe
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
Re: LO Calc Makro DrawPage.getByName geht nicht
Verfasst: So 27. Apr 2025, 19:27
von MaLe
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
Re: LO Calc Makro DrawPage.getByName geht nicht
Verfasst: So 27. Apr 2025, 21:44
von mikele
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
Re: LO Calc Makro DrawPage.getByName geht nicht
Verfasst: Mo 28. Apr 2025, 07:11
von MaLe
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