Seite 1 von 2

Quersumme

Verfasst: Sa, 30.08.2008 17:41
von Hago
Hallo,

ich möchte von Zahlen automatisch die Quersumme errechnen lassen und kann die notwendige Formel nicht herausfinden.
Kann mir bitte jemand helfen?

Viele Grüße, Hago

Re: Quersumme

Verfasst: Sa, 30.08.2008 19:33
von chrk
Hallo Hago,
schau mal in die Calc-Hilfe unter dem Stichwort "Benutzerdefinierte Funktionen" und binde dann nach der Anweisung folgenden Code ein (außerhalb der SUB Main, die automatisch angelegt wird):

Code: Alles auswählen

Function QUERSUMME(a as Integer) as Integer
dim b as Integer
meinString=CStr(a)
for i=1 to len(meinString)
	b=b+CInt(mid(meinString,i,1))
next i
QUERSUMME=b
End Function

Die Funktion steht dann aber nur auf Deinem Rechner zur Verfügung, wenn Du das Dokument woanders einsetzen willst, musst Du die Funktion in ein Makromodul in der Datei speichern.


P.S. Ich bin in StarBasic nicht firm - Fehleingaben sind überhaupt nicht abgefangen. Wenn Du also irgendetwas anderes als eine Ganzzahl in die Eingangszelle gibst, passiert irgendwas, nur nicht das, was Du erwartest.

Re: Quersumme

Verfasst: Sa, 30.08.2008 20:15
von chrk
freedom hat geschrieben: [läßt sich die Formel
=SUMMENPRODUKT(TEIL(A1;ZEILE(INDIREKT("1:"&LÄNGE(A1)));1)*1)
Calc-gerecht anpassen, weiß das jemand]?
:shock: Das muss ich mir erst mal inden Formelassistenten laden.
und bin auf diesen Beitrag gestoßen
http://www.ooo-portal.de/index.php?modu ... topic=3580

Der Vorschlag von FranzX trägt dem Umstand Rechnung, dass man in Tabellenfunktionen keine Schleifen unterbringen kann, und die Quersumme ist eben ein prototypisches Schleifenproblem.

Re: Quersumme

Verfasst: Sa, 30.08.2008 20:48
von chrk
Ok, ich hab's gefunden (nachdem ich eine Quelle für Dein Beispiel gefunden habe, freedom):

Code: Alles auswählen

=SUMMENPRODUKT(WERT(TEIL(A1;ZEILE(INDIREKT("A1:A"&LÄNGE(A1)));1))*1)
Zwei Dinge funktionieren in Calc nicht wie in der ursprünglichen Formel: Die Referenz im INDIREKT-Abschnitt kann nicht in 1:1-Notation angegeben werden, und TEIL()liefert einen String zurück, der nicht automatisch gecastet wird.

Re: Quersumme

Verfasst: Sa, 30.08.2008 21:21
von chrk
Wieso nicht? - Schau noch mal auf die Unterschiede zwischen Deinem Zitat und meiner Variante.

Bei mir hat das so funktioniert.

Re: Quersumme

Verfasst: Sa, 30.08.2008 21:54
von Hago
Hallo,
Vielen Dank für all die Antworten.
chrk hat geschrieben:

Code: Alles auswählen

=SUMMENPRODUKT(WERT(TEIL(A1;ZEILE(INDIREKT("A1:A"&LÄNGE(A1)));1))*1)
Das funktioniert perfekt.
Ich bedanke mich recht herzlich!

Grüße, Hago

Re: Quersumme

Verfasst: Sa, 30.08.2008 22:57
von jansch
chrk hat geschrieben:

Code: Alles auswählen

=SUMMENPRODUKT(WERT(TEIL(A1;ZEILE(INDIREKT("A1:A"&LÄNGE(A1)));1))*1)


Leider meldet v1.1.5 Error 504 in (WERT(TEIL(A1;
Scheinbar haben sich Parameter in 2.4.1 verändert.

Leider habe ich keinen blassen Schimmer, wie ich die Funktion an 1.1.5 anpassen soll.
Hat jemand eine Idee und kann mir helfen? Danke i.V.

Re: Quersumme

Verfasst: Sa, 30.08.2008 23:09
von Hago
Hallo chrk,

auch Deine basic-Funktion klappt prima.
Vielen Dank.

Allerdings bräuchte ich eine einstellige Quersumme.
Jetzt mache ich eben die Quersumme der Quersumme der Quersumme usw., bis sie einstellig ist.

Vielleicht kannst Du ja die Funktion so ändern, dass sie eine einstellige Quersumme herstellt.
Ich krieg's nicht hin :-)

Hago

Re: Quersumme

Verfasst: So, 31.08.2008 12:23
von chrk
Hallo Hago,
das mit der einstelligen Quersumme hättest Du ja eher sagen können, aber so gibt's eben zwei Funktionen, jetzt hatte ich auch mal Zeit für ein Bißchen Kommentar, was da passiert:

Code: Alles auswählen

Function QUERSUMME(a as Integer) as Integer
dim b as Integer
dim meinString as String
meinString=CStr(a)					'Eingabe in String umwandeln, um Anzahl der Stellen zu ermitteln und mit den Stellen zu rechnen
for i=1 to len(meinString)			'Anzahl Stellen bestimmt Anzahl Durchläufe
	b=b+CInt(mid(meinString,i,1))	'Stelle für Stelle addieren
next i
QUERSUMME=b							'Ergebnis zurückgeben
End Function

Function QUERSUMMEEINSTELLIG(a as Integer) as Integer
'Benötigt QUERSUMME()!
Dim b as Integer
Dim meinString as String
meinString=CStr(a)					'Eingabe in String umwandeln, um Anzahl der Stellen zu ermitteln und mit den Stellen zu rechnen

While len(meinString) >1			'Rechne weiter bis einstellig
	b=QUERSUMME(a)					'Berechne die QUERSUMME()
	meinString=CStr(b)				'Belege meinString neu, damit im nächsten Umlauf die Anzahl der Stellen stimmt
	a=b								'Belege a neu, damit  die Quersumme errechnet werden kann
Wend
QUERSUMMEEINSTELLIG=b				'Ergebnis zurückgeben
End Function
QUERSUMMEEINSTELLIG() ruft QUERSUMME() auf, das heißt einerseits, dass Du sie nicht alleine irgendwohin kopieren kannst. Andererseits kannst Du QUERSUMME() für die einfache Quersumme weiter verwenden.

Die Kommentare scheinen hier vielleicht ein wenig flatterhaft, aber in der BASIC-IDE stimmen die Tabs.

Re: Quersumme

Verfasst: So, 31.08.2008 16:07
von Hago
Hallo chrk,
chrk hat geschrieben:das mit der einstelligen Quersumme hättest Du ja eher sagen können...
Ja, entschuldige.
Jedenfalls klappt alles bestens.
Vielen Dank, eine tolle Hilfe.

Viele Grüße, Hago

Re: Quersumme

Verfasst: Mo, 01.09.2008 21:23
von MarkusKauer
chrk hat geschrieben:

Code: Alles auswählen

 =SUMMENPRODUKT(WERT(TEIL(A1;ZEILE(INDIREKT("A1:A"&LÄNGE(A1)));1))*1)[[[code][/quote]
[quote="jansch"]Leider meldet v1.1.5 Error 504[/quote] 
Hey Jan,
ich bin auch an der Lösung interessiert.
Weißt Du mittlerweile, warum es  nicht funktioniert?
Oder noch besser, wie die Formel in 1.1.5 funktioniert?
Meine Dankbarkeit wäre Dir sicher :D .

Markus

Re: Quersumme

Verfasst: Mo, 01.09.2008 22:13
von Karolus
Hallo
Ich hab zwar kein OOo1.15 zum testen, aber ZEILE kann dort evtl freiwillig nur mit einzelnen Zelladressen arbeiten - ?
Versuch mal die Formel als Matrixformel mit 'strg+shift+enter' abzuschliessen bzw der Option 'Matrixforme' im Formelassistenten

Funktioniert das ?

Gruß Karo

Re: Quersumme

Verfasst: Mo, 01.09.2008 22:44
von chrk
Hallo Karo,

OOo 1.5 portable gibt es noch bei OOodev.de.

Der Fehler tritt im TEIL()-Abschnitt der Formel auf. Der scheint nicht mit der Matrix klarzukommen, und lässt sich auch mit Eingabe als Matrixformel nicht überreden.

Wenn ich anders herum

Code: Alles auswählen

=ZEILE(INDIREKT("A1:A"&LÄNGE(A1))))[
eingebe, werden mir schön alle stellen des Eingebewertes untereinander als Matrix ausgegeben.

Der Rest ist Schulterzucken.

Re: Quersumme

Verfasst: Di, 02.09.2008 00:23
von MarkusKauer
Hallo Karo, hallo Christian,

danke für die Tipps.
Das richtige Schulterzucken muss ich wohl noch üben :lol:
Wenn ich versuche Christians Erkenntnis umzusetzen, habe ich die Fehlermledung 508.

Code: Alles auswählen

=ZEILE(INDIREKT("A1:A"&LÄGE(A1))))[


hier sehe ich eine runde Klammer mehr als vorher und die eckige Klammer am Ende ist ein Versehen, oder doch nicht.?

Markus

Re: Quersumme

Verfasst: Di, 02.09.2008 06:46
von chrk
Moin,
MarkusKauer hat geschrieben: hier sehe ich eine runde Klammer mehr als vorher und die eckige Klammer am Ende ist ein Versehen, oder doch nicht.?
Die eckige Klammer ist ein Artefakt der Forensoftware, in erster Linie hat sie mit schöner Unregelmäßigkeit Zitate verhunzt, aber manchmal nimmt sie sich auch andere Tags vor. Ich habe alle mir bekannten Tricks versucht, es zu vermeiden (inklusive Beitrag löschen und aus der Zwischenablage rekonstruieren).

Ich hatte dann aber gestern abend keine Nerven mehr, den Beitrag noch mal zu editieren, um darauf hinzuweisen.

Das Problem ist älter, siehe auch Fehlerhaftes Absenden neuer Beiträge, [gelöst] ZITAT im Forum und Neuer Bug im Board? - Phantomquotes.

Aber wenn sich Stephans Hoffnung (viewtopic.php?f=17&t=15929&p=82323#p82319) im ersten (jüngsten) der drei Threads bewahrheitet, könnten wir jetzt Ruhe haben.