CellRange an eine Funktion übergeben

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: CellRange an eine Funktion übergeben

von Falkan » Mo, 10.04.2006 14:46

Hallo Stephan,
Stephan hat geschrieben: Eine Parameterübergabe in Form eines Arrays welches die reinen Zellwerte repräsentiert ist hingegen problemlos möglich
Ahh, ein Array wird da übergeben. Das ist genau das, was ich suchte!

Gruß
--Holger

von Stephan » Mo, 10.04.2006 13:42

Hallo Holger,

Du mußt zwei Dinge sorgfältig unterscheiden, ich weiß das Thomas es weiß aber er hat es nicht so ganz klar hingeschrieben.

Eine solche Konstruktion:
function foo ( oRange )
for i = oRange.getRangeAddress.startRow to ...
end function
wäre rein wie sie dasteht nicht behindert, solange Du nur lesen willst. Zugegeben geht es praktisch nicht, aber nicht vorrangig weil Du den CellRange nicht als Objekt übergeben kannst, sondern weil Du mit einer Funktion nicht schreibend auf Zellen zugreifen kannst.
Eine Funktion liefert immer nur einen Rückgabewert, keine Rückgabeaktion die auf Zellen angewendet werden kann - alle Zellen des aktuellen Blattes sind gegen Veränderungen gesperrt solange eine Funktion läuft, die Wertänderung in der Zelle wo die Funktion steht ist nur der Rückgabewert der Funktion.

Ich hoffe einigermaßen verständlich.

Eine Parameterübergabe in Form eines Arrays welches die reinen Zellwerte repräsentiert ist hingegen problemlos möglich, auch so das die Bereiche sich automatisch anpassen.

Beispiel:
( http://www.bcwin.ch/ooo/basic/calc/calc.html )

Code: Alles auswählen

Function summenTest ( vArgument as Variant )
' ist das argument ein Array (Zellbereich)
if Not IsArray(vArgument) then
' ist der einzelne Wert numerisch
if IsNumeric( vArgument ) then
' Rückgabewert ist gleich Eingabewert
summenTest = vArgument
else
' Summe ist gleich 0 wenn kein numerischer Wert
' übergeben wurde
summenTest = 0
end if
' funktion beenden
exit function
End If
Dim nSumme as Long
Dim i as Integer
Dim j as Integer
' der spätere Rückgabewert
nSumme = 0
' Schleife durch 1 Dimension (Zeilen)
for i=1 to UBound(vArgument,1)
' Schleife durch zweite Dimension (Spalten)
for j=1 to UBound(vArgument,2)
' numerisch?
if IsNumeric( vArgument(i,j) ) then
' Wert dazuzählen
nSumme = nSumme + vArgument(i,j)
end if
next j
next i
' Rückagbewert in Zelle
summenTest = nSumme
End Function
Sowas läuft also, läuft auch so das beim Aufruf mittels:

=SUMMENTEST(A1:D5)

automatische Aktualisierung des Bereiches in der Formel selbst erfolgt wenn Du sie auf dem Blatt kopierst. Die Einschränkung ist eben nur das Dir bei dieser Art der Handhabung ausschließlich die Zellwerte des Bereiches zur Verarbeitung in Deiner benutzerdefinierten Funktion zur Verfügung stehen.


Gruß
Stephan

von Falkan » Mo, 10.04.2006 10:23

Hallo Thomas,

danke für die wenn auch traurige Nachricht. Das Problem bei Deinem Vorschlag ist, dass man die Segnungen der relativen Addressierung verliert.

Mir ist dann doch noch ein

Code: Alles auswählen

=FOO(COLUMN(A1:D5);ROW(A1:D5);COLUMNS(A1:D5);ROWS(A1:D5))
mit einer Funktion FOO(x,y,w,h) eingefallen, was aber hässlich wie die Nacht wäre :-)

Schade, dass ADDRESS keinen Range akzeptiert, damit man wenigstens so etwas wie =FOO(ADDRESS(A1:D5;...)) hinschreiben kann.

Danke für Deine Hilfe
--Holger

von Toxitom » Mo, 10.04.2006 07:57

Hey Holger,

Ich fürchte, das wird nicht gehen. In Calc kannst du keine "Objekte" definieren, die du dann an Benutzerdefinierte Funktionen weitergeben kannst.

Gehen müsste es wie folgt:

In der Zelle:

Code: Alles auswählen

=foo("A1:D10")
also als Stiring übergeben
Funktion:

Code: Alles auswählen

function foo(sRange)
  oRange = thisComponent.Sheets(0).getCellRangeByName(sRange)
  ...
end function
Dabei musst du natürlich das Tabellenblatt entsprechend definieren.

Viele Grüße
Thomas

CellRange an eine Funktion übergeben

von Falkan » So, 09.04.2006 21:15

Hallo,

ich möchte aus Calc heraus einen Bereich an eine StarBasic Funktion übergeben, d.h. in der Zelle soll stehen

Code: Alles auswählen

=FOO(A1:D10)
und die Funktion sollte ungefähr so aussehen:

Code: Alles auswählen

function foo ( oRange )
  for i = oRange.getRangeAddress.startRow to ...
end function
Aber ich finde in den Dokumentationen nirgends einen Hinweis, was das für ein Objekt ist, das in der Funktion FOO ankommt, und wie man aus diesem Objekt startRow oder ähnliche Attribute extrahiert.

Kann mir jemand weiterhelfen? (Ich benutzte OpenOffice 2.0.2 unter Debian/Sid)

Gruß
Holger

Nach oben