[gelöst] Makro soll gestartet werden, wenn Zelle den Wert 1 hat

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

Moderator: Moderatoren

Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

[gelöst] Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von Andromeda_104 »

Hallo,

ein Makro mit dem Namen Reset soll dann gestartet werden, wenn der Inhalt von C1 den Wert 1 hat. Trifft diese Bedingung zu, dann trägt das Makro die Werte von A1 und B1 in die Spalten E und F ein; im Anschluss an die Eintragung werden beide Zellinhalte von A1 und B1 gelöscht. Die 1 wird durch eine WENN-Bedingung erzeugt.

Das Makro selbst funktioniert.

Allerdings habe ich trotz meiner Suche bisher keinen Hinweis darüber erlangt, wie diese Start-Bedingung definiert werden kann, da ein direkter Aufruf des Makros über eine WENN-Funktion nicht funktioniert. Auch eine Deklarierung nicht als Sub sondern als Function bleibt ohne Erfolg.

=WENN(C1=1;Reset();0) 'führt zu Fehler #NAME? (Makroname wird also nicht erkannt)

Zu einer ähnlichen Thematik gab es bereits schon einen älteren Diskussionsfaden, der letztlich allerdings ungelöst blieb. Dort ging es um das Einfügen eines Datums, wenn eine Zelle einen bestimmten Wert hatte.

Welche Methode ist zu wählen, um bei einem Erscheinen der 1 als Trigger das Makro automatisch zu starten?

Gruß
Andromeda_104
Dateianhänge
Zellinhalte A1 und B1 per Makro nach Spalte E und F sowie A1 und B1 löschen.ods
(8.48 KiB) 246-mal heruntergeladen
Zuletzt geändert von Andromeda_104 am Sa, 01.10.2016 22:29, insgesamt 1-mal geändert.
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von clag »

Moin Andromeda_104,

mir scheint dein Makrowunsch noch nicht ganz zu Ende gedacht.
Deine Formel =WENN(A1>0;1;WENN(B1>0;1;0)) entspricht letztlich einem =WENN(ODER(A1>0;B1>0);1;0).
Das bedeutet es wird immer gleich bein ersten Wert in A1 ODER B1 kopiert und gelöscht,
also deine Sammelspalten E F enthalten immer nur einen Wert ist das so gewollt?
Und eigentlich kann man auf die Formel in C1 ganz verzichten und ermittelt das im Makro.

Zudem ist es wichtig zu wissen wie die Daten in A1 oder B1 geändert werden, per manueller Eingabe oder als Verknüpfung?
Bei manueller Eingabe kann man einTabellenereignis abfragen bei einer Verknüpfung müsste man einen Listener bemühen.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von Toxitom »

Hey Andromeda,

zusätzlich zu den Hinweisen von Clag:
  • Es muss ein function() sein! Und sie sollte einen Rückgabewert haben - (was soll sonst aus der Wenn Bedingung werden?)
  • Der Name "reset()" ist sicher ungünstig gewählt - den gibt es wahrscheinlich 20-tausend mal intern. Insofern wird der nicht mehr erkannt.
Benenne ich die Funktion um und übergebe einen Rückgabewert - funktioniert alles wie gewünscht (bei manueller Veränderung des Wertes in Zelle C1

Code: Alles auswählen

function ZellTest()
.....
ZellTest = 0
end function
viele Grüße Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von Andromeda_104 »

Hallo clag,

Bitte nicht von der WENN-Funktion in C1 (auf A1 und B1 bezogen) irre machen lassen. Das war vielleicht ein ungünstiges Beispiel. Ebenso kann es in C1 lauten =H1. Ändert sich also im Feld H1 ein Wert auf 1, so wird dieser nur im Feld C1 abgebildet.

C1 ändert sich also nicht manuell, sondern inhaltsbezogen zu H1 (Gilt das bereits als Verknüpfung?/Abfrage Tabellenereignis noch möglich?).

C1 soll also nur ein sog. Trigger-Feld sein (0 = keine Aktion, 1 = Makro wird ausgeführt).

Die Werte in A1 und B1 sind nur als "Transportinhalt von Quelle zu Ziel" für das Makro wichtig, damit dieses die Werte in die Spalten E und F schreibt. Ein Listener ist dafür nicht nötig, da ja das Erscheinen der 1 als Trigger im Feld C1 das Makro starten soll und nicht der Inhalt von A1 und B1. Sozusagen als klar definierte Bedingung. Ein Listener könnte aber Sinn machen für die Überwachung des Triggerfeldes C1 selbst - das ist richtig.

Allerdings weiß ich nicht, wie ich dem Listener diese Bedingung (C1 = 1) dann als Startauslösung für das Makro begreiflich machen soll.

Kann das Makro unter Umständen auch so verändert werden, dass der Inhalt von C1 vom Makro aus abgefragt wird und bei 1 dann startet?

@Toxitom

Hallo Tom,

leider funktioniert es bei mir nicht. Weder als function mit altem Namen noch als function mit neuem Namen. Und weder bei manueller Änderung in C1 noch bei automatischer Änderung. Habe ZellTest = 0 mit eingebaut - - - nichts - - - Makro startet nicht. Was mir auffällt ist aber, dass in D1 die Wenn-Funktion =WENN(C1=1;ZELLTEST();0) jetzt keinen Fehler mehr erzeugt (#NAME?) wie es vorher der Fall gewesen ist.

Grüße von Andromeda_104
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von clag »

Hall Andromeda_104

habe dir eine Beispieldatei mit einem Listener erstellt der auf C1 reagiert
Deine Angaben sind aber irgendwie immer noch nicht schlüssig für mich
warum in C1 "=H1" ? warum nicht gleich H1 prüfen?
viel Spaß damit.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von Stephan »

... dann trägt das Makro die Werte von A1 und B1 in die Spalten E und F ein ...

Das Makro selbst funktioniert.

Allerdings habe ich trotz meiner Suche bisher keinen Hinweis darüber erlangt, wie diese Start-Bedingung definiert werden kann, da ein direkter Aufruf des Makros über eine WENN-Funktion nicht funktioniert. Auch eine Deklarierung nicht als Sub sondern als Function bleibt ohne Erfolg.

=WENN(C1=1;Reset();0) 'führt zu Fehler #NAME? (Makroname wird also nicht erkannt)

Mal abgesehen danvon das das Makro nicht erkannt wird (warum auch immer), funktioniert dort das ganze Verfahren nicht und ich bin etwas erstaunt das niemand hier im Thread auf diese bekannte Besonderheit direkt hinweist:

eine benutzerdefinierte Funktion (das was hier mit "Makro" gemeint ist wenn ich sehe das es per Zellfunktion aufgerufen werden soll) ist prinzipiell nicht in der Lage aktive Schreibzugriffe auf Zellen des Blattes vorzunehmen aus dem heraus sie gestartet wurde, wenn sie per Zellfunktion aufgerufen wird.
Es geht also beispielweise NICHT:

Code: Alles auswählen

Function schreibtest(zellname As String, texteintrag As String)
	tmp = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(zellname).String = texteintrag
	schreibtest = "hallo"
End Function 
und Aufruf per:

=WENN(C1=1;SCHREIBTEST("A1";"abc");0)

Ergebnis ist hierbei das zwar "hallo" in der aufrufenden Zelle steht, aber nicht "abc" in A1.

verschiedene Schreibzugriffe die keine Zugriffe auf Zellen sind, funktionieren unter gleichen Bedingungen hingegen schon, z.B. der Zugriff auf den Blattname des Tabellenblattes:

Code: Alles auswählen

Function schreibtest(neuname As String)
	ThisComponent.CurrentController.ActiveSheet.Name = neuname
End Function


und Aufruf per:

=WENN(C1=1;SCHREIBTEST("abc");0)



Gruß
Stephan
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von Andromeda_104 »

Hallo clag,

deine Beispieldatei funktioniert so wie gewünscht - ich danke dir dafür. Ich hatte zwischenzeitlich noch etwas probiert und bin bis zu dem Punkt gekommen, wo ich erkannt habe, dass man mit einer Überwachung via Tabellenereignisse/Inhalt geändert nur manuelle Änderungen in C1 dazu nutzen kann, die gewünschte Makro-Routine zu veranlassen.

Dies funktioniert aber nicht mehr, wenn ich mit =H1 arbeite. Dann ändert sich zwar auch der Inhalt von C1, wird aber nicht mehr als Tabellenereignis registriert. Das wollte ich unbedingt noch testen - deshalb auch der umständliche Weg mit dem Zellverweis =H1 in C1.

Anbei nochmal das Probe-Projekt mit dem Start des Makros bei einer händischen Abänderung von C1.

Deinen Listener werde ich mir jetzt mal noch etwas genauer anschauen; hatte ihn zunächst nur kurz ausprobiert und wollte dir erstmal Bescheid geben, dass alles funzt.

Grüße von Andromeda_104
Dateianhänge
Zellinhalte A1 und B1 per Makro nach Spalte E und F sowie A1 und B1 löschen.ods
(8.66 KiB) 285-mal heruntergeladen
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: Makro soll gestartet werden, wenn Zelle den Wert 1 hat

Beitrag von Andromeda_104 »

Hallo clag,

alles funktioniert prima; konnte deinen Listener sogar an mehrere andere Bereiche und Zellen anpassen. Ist zwar immer etwas "Fummelarbeit" für mich als Anfänger, aber nach einigen Versuchen hat es dann alles geklappt.

Hab nochmals vielen Dank.

Andromeda_104
Dateianhänge
Zellinhalte A1 und B1 per Makro nach Spalte E und F sowie A1 und B1 löschen++.ods
Ein Listener für zwei auseinanderliegende Trigger-Felder; Dateiname wurde nicht angepasst!
(9.89 KiB) 237-mal heruntergeladen
Antworten