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
Funktion kann Zellenwert nicht verändern
Moderator: Moderatoren
-
- ***
- Beiträge: 88
- Registriert: Mi, 30.07.2003 18:06
- Wohnort: Wiesloch
Funktion kann Zellenwert nicht verändern
OOo 2.1 , Win XP
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
-
- ***
- Beiträge: 88
- Registriert: Mi, 30.07.2003 18:06
- Wohnort: Wiesloch
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.
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.
OOo 2.1 , Win XP
-
- ***
- Beiträge: 88
- Registriert: Mi, 30.07.2003 18:06
- Wohnort: Wiesloch
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?
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?
OOo 2.1 , Win XP
Hallo Frank,
möglicherweise ist das Folgende etwas philosophisch, deshalb sage ich mal es ist im Zweifel nur meine Meinung.
Auch bei Deiner Ausgangsfunktion ist das so:
Bei geöffneter Calc-Datei funktioniert der Zugriff:
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
möglicherweise ist das Folgende etwas philosophisch, deshalb sage ich mal es ist im Zweifel nur meine Meinung.
Das hängt mit Deiner Einstellung bezüglich der Sicherheit des Ausführens von Makros zusammen.Mir ist beim versuchen jedoch noch etwas aufgefallen. Wenn die Funktion beim öffnen der Datei ausgeführt wird, ist der Zellenschutz nicht aktiv.
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.Ist das eurer Meinung ein Bug?
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
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