Seite 1 von 2
Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Do 6. Feb 2014, 23:09
von gerwin
Hallo!
Ich möchte für Calc eine Funktion in LibreOffice-Basic programmieren, mit der ich die Zellinhalte eines übergebenen Bereichs abarbeiten kann.
Die Funktion soll ähnlich wie die interne Summenfunktion in der Tabelle mit =sfunktion(B3:C19) oder ähnlich aufgerufen werden können und dann den Inhalt jeder Zelle dieses Bereichs mit verschiedenen Werten multiplizieren und addieren und das Ergebnis als double zurückgeben.
Ich habs mit
Function sfunktion (Bereich as object) as double
versucht, und wollte dann irgenwie mit Bereich.StartColumn, Bereich.StartRow, Bereich.EndColumn und Bereich.EndRow integer-Werte erhalten mit denen ich dann die einzelnen Zellinhalte abfragen kann.
In Excel war das mit 'Bereich as Range' kein Problem.
Jetzt möchte ich allerdings Microsoft Office endgültig entsorgen, brauche bei dieser hoffentlich letzten Hürde Hilfe.
danke im voraus
gerwin

Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Do 6. Feb 2014, 23:33
von karolus
Hallo
Kannst du das was die Funktion tun soll ein wenig konkreter beschreiben, mglw. muss man da nicht gleich mit Kanonen auf Spatzen schiessen.
Karolus
Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 00:09
von gerwin
Hallo!
In der tatsächlichen Funktion sollen dann zwei Bereiche übergeben werden.
Jeder numerische Zelleninhalt aus dem ersten Bereich soll mit der Zahl aus dem zweiten Bereich, die in der gleichen Spalte steht multipliziert werden. Die Summe aus diesen Produkten wird dann durch die Summe aus dem zweiten Bereich dividiert und das Ergebnis zurückgegeben.
z.B. =Auswertung (b4:w4; b$17:w$17)
Konkret stehen im ersten (einzeiligen) Bereich die erreichten Punkte bei verschiedenen Aufgaben eines Teilnehmers. Da aber die Aufgaben verschiedene Wertigkeiten haben, gibt es einen zweiten (einzeiligen) Bereich, der gleich viele Spalten hat wie der Bereich mit den erreichten Punkten, in dem die Gewichtung der einzelnen Aufgeben steht. Für jede Aufgabe sollen die erreichten Punkte mit ihrer Gewichtung multipliziert werden. Die Summe dieser Produkte dividiert durch die Summer der Gewichtungen ergibt eine Art "gewichteten Durchschnitt", den ich als Ergebnis dieser Funktion benötige.
(für die Summe der Gewichtungen dürfen nur Gewichtungen jener Aufgaben berücksichtigt werden, bei denen der Teilnehmer auch tatsächlich teilgenommen hat (in der Zelle mit den Punkten steht eine Zahl).
Mein Problem ist der Zugriff auf die Inhalte der Zellen in diesen Bereichen. Diese einzeiligen Bereiche können an verschiedenen Stellen in Tabellenblättern vorkommen und auch unterschiedlich viele Zellen (Aufgaben) enthalten.
Die Übergabe des Zellbereichs in der Funktion hat auch den Vorteil, dass dabei relative oder auch absolute Addressierungen verwendet werden können.
hoffentlich ist diese Erklärung jetzt nicht noch verwirrender!
Ich denke aber, dass eine Funktion wie =summe2(b4:w4), die in einer Schleife alle Zellinhalte aus diesem Bereich addiert und das Ergebnis zurückgibt schon alle wichtigen Befehle enthalten würde, die ich für meine Auswertungsfunktion brauche.
danke für die rasche Rückmeldung
gerwin
Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 07:57
von karolus
Hallo
Code: Alles auswählen
=SUMMENPRODUKT( bereich_1 ; bereich_2) / SUMME( bereich_2 )
Code: Alles auswählen
=SUMMENPRODUKT( B4:W4 ; B$17:W$17 ) / SUMME( B$17:W$17 )
Karolus
Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 08:27
von gerwin
danke Karolus!
Ich habe unter excel selber (ev. unnötigerweise) eine Funktion programmiert, weil nicht jeder Teilnehmer alle Aufgaben macht. Diese werden dann aber auch in die Wertung nicht miteinbezogen.
Wenn als jemand in z.B. E4 keinen Wert oder 0 eingetragen hat, darf auch im zweiten Bereich E17 nicht in die Summe der Gewichtungen miteinbezogen werden.
ev. gehts mit SUMMEWENN, muss ich aber erst am Nachmittag probieren.
Es wäre trotzdem auch interessant, wie ich eine Funktion in Basic erstelle, die einen übergebenen Bereich abarbeitet.
Danke für deine Tipps
Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 10:24
von karolus
Hallo
Code: Alles auswählen
=SUMMENPRODUKT( B4:W4 ; B$17:W$17 ) / SUMMENPRODUKT( B4:W4<>"";B$17:W$17 )
Karolus
Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 13:49
von gerwin

- Screenshot einer Testtabelle
- screenshotCalc.jpg (102.6 KiB) 4336 mal betrachtet
Danke für die Antwort!
Ich habe den Vorschlag getestet, bekomme aber ein unerwartetes Ergebnis in P5
Anstatt der 82 hätte ich wie in M13 77 erwartet.
Wenn ich in J4 0 eintrage, erhalte ich plötzlich in P6 33 statt 28

Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 14:41
von karolus
Hallo
Hätte ich auch so erwartet, ist anscheinend ein Bug in LO 4.2, das
leere Zellen in dem Fall den Wert 1 bekommen.
Erweitere die Formel zu
Code: Alles auswählen
=SUMMENPRODUKT( B4:W4<>"";B4:W4 ; B$17:W$17 ) / SUMMENPRODUKT( B4:W4<>"";B$17:W$17 )
Ich werde mal schauen ob es schon einen Bugreport gibt.
Karolus
Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 15:54
von karolus
Hallo
Hier ist der
Link zur Bugmeldung wäre nützlich wenn den jemand bestätigen könnte.
Karolus
Re: Bereich in benutzerdefinierter Calc-Funktion abarbeiten
Verfasst: Fr 7. Feb 2014, 15:55
von gerwin
Hallo Karolus!
Vielen Dank für die Mühen!
Die neue Formel macht genau was ich brauche.
Damit ist mein vordringliches Problem gelöst.
Vielleicht kommt jemandem im Forum einmal eine Anleitung unter, wie man die Zellen eines Bereichs, der einer benutzerdefinierten Funktion als Argument übergeben wird, zellenweise abarbeiten kann, dann bitte um eine Nachricht.
Ich habe dazu alle LibreOffice-Basic Anleitungen die ich im Internet finden konnte durchsucht, habe aber nichts passendes gefunden. Es gab nur Anleitungen zum Programmieren eigener Funktionen bzw. zu Prozeduren, die einen bekannten Bereich bearbeiten.
Ich glaube,eine Anleitung wie man z.B. selber eine Summenfunktion der Art 'SUMME2(D2:D9)' programmieren kann, würde schon alles notwendige enthalten.
Das wichtigste ist für mich allerdings jetzt gelöst.
Vielen Dank für die rasche Hilfe!
gerwin