Selbst definierte Funktion erzeugt Fehler beim Öffnen Calc

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

ch.schmidt
Beiträge: 9
Registriert: Mo, 26.03.2007 07:21

Selbst definierte Funktion erzeugt Fehler beim Öffnen Calc

Beitrag von ch.schmidt »

Hallo,

ich habe eine umfangreiche Tabelle, in der es einige selbst programmierte Funktionen gibt.
Beim Öffnen bekomme ich dann die Fehlermeldung "BASIC-Laufzeitfehler Eigenschaft oder Methode nicht definiert". Diese Fehlermeldung kommt anscheinend für jede Zelle, in der die Formel auf eine (einzige) der selbst geschriebenen Funktionen verweist.
Habe ich dann die vielen Fenster mit "ESC" endlich besträtigt dann steht in den Zellen mit der anscheinend betreffenden Funktion der Fehlercode "Err:502"-"Ungültiges Argument".
Wenn ich aber eine der Zellen bearbeite (entfernen der letzten schließenden Klammer) und mit Enter bestätige wird die Formel korrekt berechnet. Eine Neuberechnung der Arbeitsmappe mit Strg+Shift+F9 (F9 allein hat keine Auswurkungen) führt zu dem Ergebnis, dass alle Zellen in der die Funktion steht korrekt berechnet werden.
Eine Formel heißt zum Beispiel "=VKHOLZFRONTEN(I211;C211)" I211 enthält "315,156,156,44" und C211 enthält "300"
Die Funktion ist so definiert:

Code: Alles auswählen

Function VKHolzfronten(strFronthoehen as String, iSchrankBreite as integer)
    ...
end function
Kann sich jemand das Verhalten erklären?
Die Funktion arbeitet korrekt, scheint nur zu spät geladen zu werden. Vielleicht hat es auch etwas mit der Tatsache zu tun, dass sich die Funktion Daten aus benannten Bereichen einer Tabelle holt.

Im Voraus schon mal vielen Dank für Eure Hilfe.

Viele Grüße Christian
hawe
****
Beiträge: 151
Registriert: Di, 05.08.2008 19:47

Re: Selbst definierte Funktion erzeugt Fehler beim Öffnen Calc

Beitrag von hawe »

Hallo Christian,
Die Funktion arbeitet korrekt, scheint nur zu spät geladen zu werden. Vielleicht hat es auch etwas mit der Tatsache zu tun, dass sich die Funktion Daten aus benannten Bereichen einer Tabelle holt.
Ob es damit zu tun weiss ich nicht, was ich aber sicher weiss ist das das großer Krampf ist. Die Funktion arbeitet eben nicht korrekt...
Daten die nicht über den Funktionskopf übergeben werden, man bezeichnet das als Nebeneffekte, führen dazu, dass die Funktion bei Änderungen in den Nebeneffektbereichen nicht aktualisiert (neu berechnet) wird und damit flasche Werte anzeigt.
Gruss HW
Win7/SuSe 11.2 - LO 3.3
ch.schmidt
Beiträge: 9
Registriert: Mo, 26.03.2007 07:21

Re: Selbst definierte Funktion erzeugt Fehler beim Öffnen Calc

Beitrag von ch.schmidt »

gelöst

Ich habe jetzt alle Daten die für die Berechnung benötigt werden als Argumente der Funktion mitgegeben.
Der benannte Bereich wird in Base als mehrdimensionales Array übernommen.
Ein kleiner Umbau der Funktion löste dann das Problem.


Christian
ch.schmidt
Beiträge: 9
Registriert: Mo, 26.03.2007 07:21

Re: Selbst definierte Funktion erzeugt Fehler beim Öffnen Calc

Beitrag von ch.schmidt »

Hallo Ferris,

dein Problem scheint wirklich dieselbe Ursache zuhaben. Auch in meiner Funktion habe ich ursprünglich einen Bereich mit oZellen = oSheet.getCellRangeByName("DefinierterName") zugewiesen.
Wie du schon erkannt hast, scheinen diese Bereiche (Einfügen -> Namen -> Festlegen) beim Laden noch nicht zu existieren.

Da es sich bei meiner Funtion immer um den gleichen Bereich handelt habe ich den Bereich der Funktion als Argument mitgegeben MyFunc(Bereich as Object, Parameter2 as..., ...). Und siehe da, der Fehler beim öffnen kommt nicht mehr.

Grüße
Christian
hawe
****
Beiträge: 151
Registriert: Di, 05.08.2008 19:47

Re: Selbst definierte Funktion erzeugt Fehler beim Öffnen Calc

Beitrag von hawe »

Ich verstehe die Diskussion irgendwie net.
Was hindert Dich daran die Function mit einem entsprechenden Argument der bezogenen Zellen auszustatten? Alles andere ist schlicht Krampf und arbeitet an der Tabellenkalkulation vorbei...
In Makrofunktionen, die man in Calc-Zellen als Formel einträgt, ist es nicht möglich steuernd auf die Calc-Tabelle zuzugreifen, also z.B. Den Inhalt oder die Farbe einer anderen Zelle zu ändern?
Wenn Du jetzt Dein Ansinnen zuende denkst, dann wirst DU erkennen, dass das eine Endlosschleife erzeugen und eine Codekollision würde.

- die Funktion ändert eine Zelle durch Nebeneffekte
- diese Änderung der Zelle löst eine Neuberechnung aus
- Die Neuberechnung löst eine Berechnung der Funktion aus
- die Funktion ändert eine Zelle durch Nebeneffekte
- ...
Gruss HW
Win7/SuSe 11.2 - LO 3.3
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Selbst definierte Funktion erzeugt Fehler beim Öffnen Calc

Beitrag von Stephan »

Wenn Du jetzt Dein Ansinnen zuende denkst, dann wirst DU erkennen, dass das eine Endlosschleife erzeugen und eine Codekollision würde.


Nee, wo soll es zu einer Kollision kommen, außer der Nutzer verursacht sie selbst durch unüberlegten Formeleinsatz.

Das beste Gegenbeispiel ist eine benutzerdefiniete Funktion die auf einem nicht aktiven Tabellenblatt Werte schreibt, beispielsweise:

Code: Alles auswählen

Function schreiben()
ThisComponent.Sheets(1).getCellRangeByName("B1").Value = 4
End Function
wird diese Funktion im Tabellenblatt mit Index ungleich 1 in einer Zelle aufgerufen greift sie problemlos schreibend auf die Zelle B1 des Blattes mit dem Index Eins zu und trägt eine 4 ein, diese 4 ist nun durch Verknüpfung auch in jede beliebige Zelle des aktiven Blattes zu bekommen, was ja angeblich Deiner Meinung nach zur 'Katastrophe' führen sollte, i.S.:
- die Funktion ändert eine Zelle durch Nebeneffekte
- diese Änderung der Zelle löst eine Neuberechnung aus
- Die Neuberechnung löst eine Berechnung der Funktion aus
- die Funktion ändert eine Zelle durch Nebeneffekte
- ...
tut es aber nur bei unüberlegter Verwendung.

Da solche Art der Zirkelbezüge auch mit normalen Formeln nur durch überlegten Einsatz von Formeln vermieden werden können, ist auch das Argument als Solches hinfällig.


Ebenfalls unsinnig ist Deine Begründung angesichts der Tatsache das z.B. eine Formel:

=ZELLE("FILENAME")

beispielsweise liefert:

'file:///C:/Dokumente und Einstellungen/internet/Desktop/funktionstest.ods'#$xxx

wobei xxx der Name der aktiven Tabelle ist. Nun kann ich diesn Namen aber problelos mit einer benutzerdefinierten Funktion, die ich auf dem selben Tabellenblatt aufrufe ändern:

Code: Alles auswählen

Function schreiben2(x As String)
ThisComponent.CurrentController.ActiveSheet.setName(x)
End Function
und schon stimmt das Ergebnis von =ZELLE("FILENAME") nicht mehr, weil ja die formel nicht automatisch aktualisiert wird, ich das also ggf. zusätzlich in der benutzerdefinierten Funktion auslösen müßte.

Auch hier schert sich Calc überhaupt nicht an der potentiellen Schädlichkeit des Wirkens der benutzerdefinierten Funktion.


Kurzum - wenn ich das Ausgangsanliegen sehe, kann ich nur erkennen das es eine durchaus sinnvolle Funktionalität sein könnte.




Gruß
Stephan
Antworten