Seite 1 von 2
"Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 14:15
von hylli
Für eigen erstellte Tabellenkalkulationen, sollen wir technische Dokumentationen erstellen, welche gemäß Definition wohl auch eine Liste aller in Zellen verwendeten Funktionen sein kann.
Natürlich kenne ich die Möglichkeit über Ansicht -> Formel die jeweilige Funktion in einer Zelle anzeigen zu lassen, jedoch bekommt man so je nach Tabelle und länge der Funktion, keine vernünftigen Ausdrucke mehr hin.
Viel besser wäre eine Möglichkeit, als Anlage sämtliche verwendete Funktionen auf den einzelnen Tabellenblättern auszugeben, sozusagen:
Tabellenblatt | Zelle | Funktion
Im Prinzip also vergleichbar mit irgendwelchen Verzeichnissen in Writer, nur eben mit Calc.
Kann man so etwas mit einfachen Mitteln mit LibreOffice Calc bewerkstelligen?
Hylli
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 16:20
von hylli
Vielleicht ergänzend noch folgende Info, auf die ich bei meinen Recherchen gestoßen bin:
https://www.excel-ist-sexy.de/alle-formeln-auflisten/
So etwas (Variante 2 für alle Arbeitsblätter!) würde mir auch vorschweben, jedoch weiß ich nicht, wie man das Makro "übersetzt", so dass es LibreOffice auch versteht?
Hylli
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 17:01
von F3K Total
Hallo Hylli,
ich habe ein Makro geschrieben.
Lege ein Tabellenblatt mit dem Namen
Funktionen an, und führe das folgende Makro aus:
Code: Alles auswählen
sub show_Used_Functions()
oController = ThisComponent.CurrentController
oSheets = ThisComponent.Sheets
oTargetSheet = oSheets.getbyName("Funktionen")
oController.activeSheet = oTargetSheet
nCounter = 1
for i = 0 to oSheets.count - 1
oSheet = oSheets(i)
if not (oSheet.Name = "Funktionen") then
oCursor = oSheet.CreateCursor
oCursor.gotoendofusedArea(false)
nEndcolumn = oCursor.Rangeaddress.Endcolumn
nEndRow = oCursor.Rangeaddress.EndRow
for j = 0 to nEndcolumn
for k = 0 to nEndRow
oCell = oSheet.getCellbyPosition(j,k)
if oCell.Type = com.sun.star.table.CellContentType.FORMULA then 'enthält die Zelle eine Formel?
oTargetCellAbsoluteName = oTargetSheet.GetCellByPosition(0,nCounter)
oTargetCellFormula = oTargetSheet.GetCellByPosition(1,nCounter)
oTargetCellAbsoluteName.String = oCell.AbsoluteName
oTargetCellFormula.String = oCell.Formula
nCounter = nCounter + 1
endif
next k
next j
endif
next i
End Sub
Dann sollten auf dem Tabellenblatt
Funktionen in Spalte A die Adressen aller Formelzellen und in Spalte B die Formeln erscheinen.
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 17:30
von karolus
Hallo
Eine Zelle enthält (optional ) eine Formel, in der Formel können dann nur Operatoren auftauchen , und|oder auch FUNKTIONEN in beliebiger Anzahl.
falls du nur die Formel brauchst gibts dafür eine Funktion und die heisst =FORMEL(…)
falls du aber wirklich jede einzelne verwendete Funktion dokumentieren willst wirds wohl etwas schwieriger.
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 17:58
von karolus
Hallo
@F3k
Der Teil ist ja einfach:

- formeln.png (44.61 KiB) 3988 mal betrachtet
Wenns jetzt aber um die
einzelnen Funktionen geht, ( alle violetten Namen im Screenshot ) wirds bisserl komplizierter!
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 18:40
von F3K Total
Hallo Karolus,
Die Sache mit dem queryContentCells ist ja richtig gut!
Und ja, wenn Hylli die einzelnen Funktionen sucht wirds kompliziert.
Bin gespannt.
Gruß R
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 18:57
von karolus
Hallo
@screenshot oben: Ich finde es witzig das die Ausgabe von print aus
rich schon freiwillig die Funktionsnamen
violett präsentiert.
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 20:34
von gogo
Einzeiler gefällig?:
Code: Alles auswählen
...
sAlleFormeln=""
for cell in formulas.Cells:
...
sAlleFormeln += ";" + cell.Formula
print("verwendete Funktionen:" + chr(10) + chr(10).join(set([x[:x.index("(")].replace(" ","") + "()" for x in ";".join(sAlleFormeln.replace('""','').split('"')[::2]).replace("(","(;").replace("=",";").replace("&",";").replace("+",";").replace("-",";").replace("*",";").replace("/",";").split(";") if "(" in x])))
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 20:36
von gogo
... oder doch besser so
Code: Alles auswählen
...
sAlleFormeln=""
for cell in formulas.Cells:
...
sAlleFormeln += ";" + cell.Formula
print(strip_functionnames(sAlleFormeln))
def strip_functionnames(s):
# lösche alle ""-Strings aus dem Funktionsstring
s = ";".join(s.replace('""','').split('"')[::2])
# lösche alle Leerzeichen (steht im Einzeiler weiter hinten)
s = s.replace(" ","")
# trenne alle aufeinanderfolgenden Funktionen
s = s.replace("(","(;")
# ersetze alle syntaktischen Trenner
for r in "=,+-*/^<>":
s = s.replace(r,";")
#Suche alle Elemente mit einem Funktionsbeginn "("
l = [x[:x.index("(")] + "()" for x in s.split(";") if "(" in x]
# entferne doppelte Funktionen und Finish
return "verwendete Funktionen:" + chr(10) + chr(10).join(set(l))
Re: "Technische Dokumentation" anhand aller verwendeten Funktionen?
Verfasst: Di 6. Dez 2022, 23:19
von karolus
Hallo
@gogo: so richtig pythonisch ist das noch nicht, aber deine Methode die literalen Strings zu entfernen ist genial.
in python musst du nicht
chr(10) nehmen, dafür gibts escape-sequenzen
\n
Code: Alles auswählen
import re
rex= re.compile(r"([A-ZÄÖÜ._0-9]+)\(")
alle = "\n".join(cell.Formula for cell in formulas.Cells)
func_string = "\n".join(f'{entry}()' for entry in sorted(set(rex.findall(alle))))
print(f"verwendete Funktionen:\n{func_string}")