Funktion kann Zellenwert nicht verändern

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: Funktion kann Zellenwert nicht verändern

von Stephan » So, 10.04.2005 19:22

Hallo Frank,

möglicherweise ist das Folgende etwas philosophisch, deshalb sage ich mal es ist im Zweifel nur meine Meinung.
Mir ist beim versuchen jedoch noch etwas aufgefallen. Wenn die Funktion beim öffnen der Datei ausgeführt wird, ist der Zellenschutz nicht aktiv.
Das hängt mit Deiner Einstellung bezüglich der Sicherheit des Ausführens von Makros zusammen.
Ist das eurer Meinung ein Bug?
Ich denke nein, weil ich annehme die Sicherheitseinstellung von Makros ist Bei Dir so das es erlaubt ist. Calc führt beim Laden einer Datei quasi ein "kaltes" Update aller Berechnungen der Zellen aus, hierbei laufen auch alle Makros/Funktionen "vollständig" wenn Du das unter Makrosicherheit nicht verboten hast.

Auch bei Deiner Ausgangsfunktion ist das so:

Code: Alles auswählen

Function Testfunktion(wert) 
Testfunktion=wert 
OSheet = ThisComponent.Sheets(0) 
osheet.getCellByPosition(1,1).value = wert 
End Function 
Bei geöffneter Calc-Datei funktioniert der Zugriff:

Code: Alles auswählen

osheet.getCellByPosition(1,1).value = wert

nicht, weil die normale Aktualisierung immer eine "warme" ist.
Trägst Du jedoch die Formel ein kannst Du auch manuell eine "kalte" Aktualisierung durchführen, die die Ausführung erzwingt (vorausgesetzt die Datei wurde nicht mit "Makroausführungsverbot" geöffnet). Drücke hierzu STRG+UMSCHALT+F9.

(Das Ganze ist natürlich ein Sicherheitsrisiko und sollte nicht verwendet werden. Du wirst bei Prüfung feststellen das Deine spezielle Funktion bei "kaltem" Aktualisieren immer zwei Mal läuft. Da Deine Funktion einen Zugriff auf das Zellobjekt direkt durchführt, was sie ja eigentlich nicht sollte und was deshalb normalerweise geblockt wird, erwächst deshalb ein besonderes Risiko aus ThisComponent, in sofern wäre hier Stardesktop.CurrentComponent angebracht. Das ist insgesamt jedoch nur theoretisch weil ein Zugriff auf das Zellobjekt in der Art und Weise wie Du ihn durchführst ohnehin nicht angebracht ist deshalb abgeblockt wird.
Man kann nun darüber streiten ob diese Art der Implemetierung richtig ist, weil es ja durchaus Fälle gibt wo der Zugriff auf dass Objekt der Zelle in beschriebener Art und Weise nicht zu Problemen führen würde.
Nur was soll ich sagen, es wäre auch möglich das sich eine ungespeicherte Calc-Datei bei Klick auf Schließen ohne Nachfrage schließt und die ungespeicherten Änderungen einfach verloren gehen. Aus dieser Sicht ist das mit der Problematik "Zellobjekt" eben auch nur ein Sicherheitsnetz um die Integrität der Gesamtdatei/Tabelle zu gewährleisten weil Du ja in der Funktion auch weitere Aktionen durchführen kannst. Zerstört z.B. Deine Funktion die Integrität der Tabelle und erhält gleichzeitig eine Speichern-Routine wäre jeder Rückweg verbaut bzw. könnte verbaut sein.)




Gruß
Stephan

von Frank Lauer » So, 10.04.2005 12:19

Ich habe eine Möglichkeit gefunden, allerdings nicht über die Änderung einer Zelle direkt sonder über die Definition der Funktion als Matrixfunktion. Wenn ich dann einen Array stat eines Einzelwertes zurückgebe und die Funktion in Calc als Matrixfunktion mit den entsprechenden Zelle definiere werden die anderen Zellen auch gefüllt. Das ist für meine Anwendung sogar noch besser als das direkte Schreiben.

Mir ist beim versuchen jedoch noch etwas aufgefallen. Wenn die Funktion beim öffnen der Datei ausgeführt wird, ist der Zellenschutz nicht aktiv. Ist das eurer Meinung ein Bug?

von Frank Lauer » So, 10.04.2005 01:14

Mir ist eben noch was aufgefallen. Wenn die zu ändernde Zelle in einem anderen Sheet ist, fuktioniert die Änderung. Anscheinend ist nur das Aufrufende Sheet gesperrt.
Sieht aber alles in allem recht Hoffnungslos aus. Ich gebe aber noch nicht ganz auf, da meine Funktion dummerweise mehrere Werte berechnet, also für das ergebniss auch mehrere Zellen braucht. Die Funktion mit einem weiteren Parameter versehen, der Bestimmt, welcher Ergenisswert ausgegeben werden soll geht auch nicht, da die Funktion recht rechenaufwendig ist und damit calc sonst ausbremsen würde.

von Stephan » So, 10.04.2005 00:02

Warum ist das so.


Erstens, es ist genau so wie Du es beschreibst.
Das ist im weitesten Sinne wohl deshalb so um die Konsistenz der Gesamttabelle durch z.B. zirkuläre Bezüge nicht zu gefährden. Alle Zellen sind gegen Änderungen schreibgeschützt solange eine Funktion "läuft".
Gibt es eine Möglichkeit mit einer Calcfunktion weitere Zellen außer der aufrufenden zu verändern?


Mit ja, innerhalb nein. Also nein. Mit heißt wenn die Funktion fertig ist hat sich der Wert der Zelle geändert, dadurch kann sich der Wert anderer Zellen ändern, klar. Solange die Funktion läuft, d.h. heißt "End Function" nicht "durch" ist ist das nicht möglich.
Du brauchst auch nichts weiter zu versuchen, es geht nicht. Selbst wenn Du versuchst mit der Funktion ein externes Programm aufzurufen was versucht die Zelle zu ändern, es geht nicht solange die Funktion läuft. Ich sehe wirklich keinen Weg.
(Was natürlich nicht heißt das ich allwissend bin. Falls Du eine Lösung findest, nehme ich sie gerne entgegen. Nur ich weiß keine.)

Gruß
Stephan

Funktion kann Zellenwert nicht verändern

von Frank Lauer » Sa, 09.04.2005 22:48

Hallo zusammen,

ich habe folgendes Calc Makro geschrieben

REM ***** BASIC *****
Sub Macro1
Testfunktion(100)
End Sub

Function Testfunktion(wert)
Testfunktion=wert
OSheet = ThisComponent.Sheets(0)
osheet.getCellByPosition(1,1).value = wert
End Function

Wenn ich nun die Testfuktion über Macro1 aufrufe (wie dargestellt), dann ändert sich der Inhalt der Zelle B2 (getCellByPosition(1,1)) ordnungsgemäß auf 100.

Wenn ich die Testfunktion jedoch aus einer Calczelle über =Testfuktion(122) aufrufe ändert sich der Zelleninhalt B2 nicht.

Warum ist das so. Gibt es eine Möglichkeit mit einer Calcfunktion weitere Zellen außer der aufrufenden zu verändern?

Gruß Frank

Nach oben