Gibt es eine Funktion um...

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

el Larso
*
Beiträge: 10
Registriert: Mi, 28.07.2004 20:55

Gibt es eine Funktion um...

Beitrag von el Larso »

...oder besser gesagt, kann man eine Funktion erstellen welche:
eine Menge von Zahlen in die hälfte der größeren und kleineren teilt, um anschließend die Summe der größeren durch die Menge ihrer selbst zu teilen?

Vielleicht zum Verständnis ein kleines Beispiel:

1,6,2,5,3,4 --> 1,2,3 4,5,6 --> 10 (4+5+6) --> 3,333 (10:3)

D.h. wenn die Zahlen 1-6 in den für die Funktion markierten Feldern stehen, möchte ich den Wert 3,33 erhalten!


Freue mich riesig über jeden Lösungsansatz und deshalb danke ich euch schon jetzt...
Don't Panic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

eine Menge von Zahlen in die hälfte der größeren und kleineren teilt, um anschließend die Summe der größeren durch die Menge ihrer selbst zu teilen?


aber
D.h. wenn die Zahlen 1-6 in den für die Funktion markierten Feldern stehen, möchte ich den Wert 3,33 erhalten!


Ich hoffe hier liegt nur ein Schreibfehler vor!? denn: (4+5+6)/3=5

Ansonsten:
Ist die Anzahl der Werte (im Beispiel 6) vorher bekannt oder muß das variabel verarbeitet werden können? Wie hoch ist die Anzahl ungefähr?
Stehen alle zu berücksichtigen Werte in einem geschlossenen Zellbereich z.B. A1:A6 oder können sie auch über das Blatt verteilt sein?
Was soll geschehen wenn die Anzahl der Werte nicht geradzahlig ist (denn dann lassen sich nicht zwei Gruppen mit gleicher Anzahl von Werten bilden)?
Was soll geschehen wenn einer (oder mehrere) der Werte beiden Gruppen angehören, z.B. wenn die Werte 1,2,4,4,5,6 vorliegen?


Gruß
Stephan
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

Re: Gibt es eine Funktion um...

Beitrag von Niels »

el Larso hat geschrieben:...oder besser gesagt, kann man eine Funktion erstellen welche:
eine Menge von Zahlen in die hälfte der größeren und kleineren teilt, um anschließend die Summe der größeren durch die Menge ihrer selbst zu teilen?
Interessante Funktion! Ich denke, dass wird nur mit einem Makro gehen.
Zu den Fragen von Stephan kann ich noch eine hinzufügen. Sind die größeren Zahlen von Ihrem Zahlenwert größer oder von Ihrer Position?

Ergibt also: 1,3,5,2,4,6 das Ergebnis 4 (12<2+4+6>/3) oder das Ergebnis 5 (15<6+5+4>/3)?
Darf die Reihenfolge denn durch Calc verändert werden, sprich darf man die Zahlen sortieren und ist dann die ganze Zeile/Spalte nur mit den betroffenen Zahlen gefüllt oer steht da noch mehr, was es unmöglich macht, die ganze Zeile/Spalte zu sortieren?

Ciao
Niels
Wer lesen kann ist klar im Vorteil.
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

ich habe da mal was gebastelt

Beitrag von Niels »

Das Makro liest in der aktiven Zeile die Werte von Spalte B an ein (bis Zelle leer) und sortiert diese. Danach müsste das Ergebnis berechnet werden und ich scheitere an den banalsten Ding, dem Runden. Ich finde da keine Funktion für, will das aber eigentlich nicht glauben. Aber da gibt es ja Leute für, die das sicher wissen.
Spalte A habe ich nicht benutzt um da nacher das Ergebnis einzutragen

Code: Alles auswählen

'Deklarationen
'=========================================================================================
	Dim oDoc as Object 'das aktive Dokument
	Dim oZelle as Object 'die zu befummelde Zelle
	Dim oZeile as Integer 'die zu befummelnde Zeile
	Dim Sheet As Object 'das zu befummelnde Arbeitsblatt
	Dim Cell As Object 'die zu befummelnde Zelle
	Dim i1 As Integer 'die berühmte Zaehlvariable
	Dim i2 As Integer 'davon kann man nie genug haben
	Dim i3 As Integer 'darum gleich noch eine
	Dim Wert (0) as Long 'das Array für die Werteliste erst einmal mit nur einem Eintrag
	Dim Ergebnis as Long 'irgendwoher brauchen wir ja noch das Ergebnis

' Zugriff auf das Dokument bekommen
'=========================================================================================
    oDoc=thisComponent 'Dokument festlegen
    oZelle=oDoc.getCurrentSelection().getCellAddress() 'aktive Zelle auslesen
    oZeile=oZelle.row 'die aktive Zeile extrahieren
	Sheet = oDoc.Sheets(0) 'es wird hier immer mit dem ersten Arbeitsblatt gearbeitet


' Werte auslesen
'========================================================================================
	i1 = 1
	do
		Cell = Sheet.getCellByPosition(i1, oZeile)
		ReDim Preserve Wert (i1) As long
		if Cell.String = "" then 
			i1 = i1 - 1
			exit do
		end if
		Wert (i1) = Cell.Value
		i1 = i1 + 1				
	loop
	if i1 = 1 then exit sub 'mit einem Wert macht das keinen Spass

' Werte sortieren
'=========================================================================================
	for i2 = 1 to i1
		for i3 = i2 + 1 to i1
			if Wert (i2) > Wert (i3) then
				Wert (0) = Wert (i2)
				Wert (i2) = Wert (i3)
				Wert (i3) = Wert (0)
			end if
		next i3
	next i2

' Ergebnis berechnen
'========================================================================================
	for i2 = i1 to i1/2+1 step -1
		Ergebnis = Ergebnis + Wert (i2)
	next i2
	msgbox Ergebnis

End Sub
Entschuldigung, habe die "=" etwas vermindert sonst ist die Bildschirmdarstellung so schlecht (Ich muß bei 1024x768 horizontal scrollen) -->hat aber nicht geholfen, irgendwie ist der Thread falsch formatiert, ich laß das jetzt so

Stephan (Moderator)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Da ich noch keine Rückmeldung zu meinen Fragen habe, habe ich erstmal eine Funktion entworfen, welche für 6 Zahlen funktioniert:

Code: Alles auswählen

Function GRUTEI (a,b,c,d,e,f)
'==================================
'Funktion GRUppieren-TEIlen
'"Vorabversion"    Datum:28.07.2004
'==================================
Dim W(5)
W(0) = a
W(1) = b
W(2) = c
W(3) = d
W(4) = e
W(5) = f
For i = 0 to 4
	For j = i to 5
	If W(i) > W(j) Then
		tmp = W(i)
		W(i) = W(j)
		W(j) = tmp
	end if
	Next j
Next i
wert = 0
For x = 3 to 5
	wert = wert + W(x) 
next   
GRUTEI = wert/3
end function
Hinweis:
den obenstehenden Code in ein Modul der Bibliothek "Standard" von OpenOffice kopieren
die Funktion kann nun in calc an beliebiger Stelle eingefügt werden mit:

=GRUTEI(Zelle1;Zelle2;Zelle3;Zelle4;Zelle5;Zelle6)

Beispiel:
=GRUTEI(A1;A2;A3;A4;A5;A6)
es werden die drei höchsten Werte der Werte in den Zellen A1 bis A6 bestimmt, summiert und durch 3 geteilt.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Niels,

haben wir genau zur gleichen Minute gepostet...

Ich glaube aber der User wollte eine Funktion die das Ergebnis automatisch neu berechnet wenn sich die Ausgangszahlen ändern und in eine beliebige Zelle eingefügt werden kann...

Wollen wir erst mal abwarten, welche Antwort uns el Larso auf unsere Vorschläge gibt.


Gruß
Stephan
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

@Stephan

Beitrag von Niels »

Stephan hat geschrieben:Hallo Niels,

haben wir genau zur gleichen Minute gepostet...
Hei, das haben wir ja drauf! Zum 2. Mal schon :lol: .

Leider kann ich das nicht so elegant wie Du. Werde mir Deine Function mal zu Gemüte führen, das ist ja interessant, was Du mir hier offenbarst.

Hast Du eine Ahnung zum Runden? Habe das Handbuch komplett nach "Runden" und "round" durchsucht, aber keine Fundstellen gefunden. Hier im Forum fand ich einen Hinweis auf "Format", lt. Handbuch ist Format aber nur für Strings gedacht und auch mein Test war nicht erfolgreich.

Ciao
Niels
Wer lesen kann ist klar im Vorteil.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Niels,

In einem Tabellenblatt kannst Du die Funktionen ABRUNDEN, AUFRUNDEN und RUNDEN verwenden, aber das war wohl nicht die Frage.
Es gibt möglicherweise ein eleganteres Verfahren für StarBasic, aber spontan würde ich mit Zeichenketten arbeiten. Es ist nun die Frage wie Du runden willst (z.B. "mathematisch" oder kaufmännisch), der Einfachheit halber runde ich mit dem folgenden Makro nicht, sondern schneide einfach nur überflüssige Stellen ab. Ich hoffe das (weiter ausbaubare) Prinzip wird deutlich:

Code: Alles auswählen

Sub demo_runden
'Makro ist noch nicht fehlerresistent
'deshalb: sinnvolle Eingaben verwenden
zahl = InputBox ("Bitte geben Sie eine Dezimalzahl ein: "
stellen =  InputBox ("Wieviele Nachkommastellen ? ")
zahl1 = STR(zahl)
do
	x = x + 1
	teil = Left(zahl1, x)
Loop While Right(teil,1) <> "."
nach = Right(zahl1, Len(zahl1)-x)
nach = left(nach,stellen)
msgbox "Ergebnis= " & teil & nach, , "Noch String ..."
msgbox "Ergebnis= " & Val(teil & nach), , "Jetzt Zahl ..."
end sub
Da das Makro sich erweitern läßt ist somit auch ein echtes Runden erreichbar.


Hier ein eleganteres Beispiel zum Runden, allerdings mit der Einschränkung der Genauigkeit auf 16 Stellen gesamt, weil (bezüglich des Rundens) rein numerische Verarbeitung erfolgt.

Code: Alles auswählen

Sub demo_runden_II
'Achtung: die Genauigkeit der Basic-IDE ist bezüglich
'INT() offensichtlich auf 16 Stellen beschränkt
'16 = Summe von Vor- und Nachkommastellen 
zahl = InputBox ("Bitte geben Sie eine Dezimalzahl ein: "
stellen =  InputBox ("Wieviele Nachkommastellen ? ")
For x = 1 to Len(zahl)
	teil_v = left(zahl,x)
	if Right(teil_v,1) = "," Then
		gesamt = left(zahl,x-1) & "." & right(zahl,Len(zahl)-x)
		Exit For
	end if	
Next x
gerundet = INT(Val(gesamt)*(10^Val(stellen))+0.5)/10^Val(stellen)
msgbox gerundet
end sub
Gruß
Stephan
Zuletzt geändert von Stephan am Fr, 30.07.2004 13:08, insgesamt 1-mal geändert.
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

Danke

Beitrag von Niels »

Das ist ja krank, dass es hierfür keine Funktion gibt. Ich dachte echt, ich mache etwas falsch bei der Befehlssuche.

Ciao
Niels
Wer lesen kann ist klar im Vorteil.
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

Schade

Beitrag von Niels »

el Larso meldet sih gar nicht mehr zu unseren Lösungsansätzen :!: :?: :!:
Wer lesen kann ist klar im Vorteil.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

el Larso meldet sih gar nicht mehr zu unseren Lösungsansätzen
Ja, versteh ich auch nicht.

Übrigens war in meinem letzten Codebeispiel ein Fehler "," statt "." habe das gerade berichtigt.

Gruß
Stephan
el Larso
*
Beiträge: 10
Registriert: Mi, 28.07.2004 20:55

Danke, danke, danke...

Beitrag von el Larso »

Hallo zusammen,

meine "Antwort Benachrichtigung" ist im "Spam Verdacht" gelandet, daher die zurückhaltung...

Im Moment bin ich erstmal von euren Lösungsansätzen erschlagen, doch die Fülle eurer Ideen stimmt mich doch arg optimistisch das Problem in den Griff zu bekommen...

Jetzt mal zu euren Fragen:

Stephan; Do, 29.07.04 1:33:
1. (4+5+6)/3=5 na klar!
2. Die Werte sind variabel!
3. Sie stehen in einer Spalte (z.B. J7 bis J48)
4. Zur gradzahligkeit... gute Frage! In dem Fall würde der "größeren Hälfte" eine weitere Zahl hinzugefügt.
5. Für den Fall 1,2,4,4,5,6 (der sehr wahrscheinlich ist) würde 1,2,4 - 4,5,6 getrennt (es geht darum die max. Summe aus der Hälfte der Werte zu bekommen).

Niels; Do, 29.07.04 10:21:
1. Größer meint den Zahlenwert (1<2)
2. Die Werte stehen alleine in einer Spalte (s.o) dürfen jedoch nicht sortiert werden, da sich die Variable aus den Werten ihrer Zeile ergibt.
Und diese sind gruppiert und sortiert.

Niels; Do, 29.07.04 12:05:
Ehrlich gesagt verstehe ich die Funktion nicht vollständig, werde sie aber nocheinmal in ruhe durchgehen...

Stephan; Do, 29.07.04 12:05:
Ja im Prinzip ist es das was ich suche, jedoch müsste die Funktion bis zu vierzig Werte berechnen...

Stephan; Do, 29.07.04 12:11:
Und noch mal JA, die Funktion muß Flexibel auf jede Veränderung der Spalte mit einem neuen Ergebnis aufwarten...

ZUM RUNDEN:
Ich weiß eure Diskussion geht über "meine" Funktion hinaus, wollte aber anmerken das zwei Stellen nach dem Komma sehr nett wären.

So das wars erstmal... Also noch mal vielen, vielen Dank...
Gruß Lars
Don't Panic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Ja im Prinzip ist es das was ich suche, jedoch müsste die Funktion bis zu vierzig Werte berechnen...
Hier habe ich derzeitig noch ein Problem weil ich nicht weiß, wie ich eine Parameterübergabe im Stil A1:A39 auswerten kann. Ich habe eine Frage diesbezüglich in das englische Forum gepostet und muß erst einmal abwarten.
Falls Du bereit wärst alle Parameter auszuschreiben (A1;A2;...;A39) wäre das funtionieren kein Problem, ist jedoch erhöhter Schreibaufwand.
Ich weiß eure Diskussion geht über "meine" Funktion hinaus, wollte aber anmerken das zwei Stellen nach dem Komma sehr nett wären.
Ich kann das integrieren, ist aber nicht unbedingt nötig weil das Ergebnis meiner Funktion in einer Zelle steht und Du das dort normal über das Zahlenformat einstellen kannst.

Sobald ich eine Lösung bezüglich der Parameterübergabe (A1:A39) habe, werde ich den code posten.


Gruß
Stephan
el Larso
*
Beiträge: 10
Registriert: Mi, 28.07.2004 20:55

el Larso

Beitrag von el Larso »

Hallo,
...über das Zahlenformat einstellen...
Danke für den Tipp
...erhöhter Schreibaufwand.
Im Prinzip ok, freue mich jedoch wenn Du Antwort aus dem besagtem Forum erhälst.

OH! Ganz vergessen...
die Werte liegen zwischen 0 und 15

Gruß Lars
Don't Panic
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

noch eine Frage

Beitrag von Niels »

Steht denn hinter der Zahlenreihe noch etwas in der nächsten Zelle der Zeile? Ansonsten könnte man doch die Zeile bis zum Ende des Blattes auf Ändrungen überwachen und braucht als Parameterübergabe nur die Startzelle. Dann liest man, bis man auf die 1. leere Zelle kommt und rechnet dann los.

@Stephan: Oder habe ich da etwas falsch verstanden mit der Funktion Deiner Funktion?

Gruß
Niels
Wer lesen kann ist klar im Vorteil.
Antworten