Makros blockieren Weitergabe von Daten beim Serienbrief

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

Moderator: Moderatoren

fre-d
Beiträge: 5
Registriert: Fr, 04.10.2019 10:39

Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von fre-d »

Hallo zusammen,

ich habe ein Problem mit einem Serienbrief und ich hoffe, jemand kennt sich hier gut aus und kann mir weiterhelfen.

Das Problem ist: Die Daten bestimmter Tabellenzellen (ods-Datei), die dort über ein Makro berechnet werden, werden im Serienbrief nicht angezeigt.

Jetzt alles etwas genauer:
  • Ich verwende LibreOffice Version: 6.2.7.1 (x64)
  • In der Datei Datenbank.ods befinden sich mehrere Tabellen. Die Daten aus Tabelle1 sollen in einen Serienbrief überführt werden.
  • Datenbank.ods enthält außerdem Makros. Eines davon ist dieses hier:

    Code: Alles auswählen

    function gewichteterDurchschnitt ( n1 as double, p1 as double, n2 as double, p2 as double, optional n3 as double, optional p3 as double, optional n4 as double, optional p4 as double, optional n5 as double, optional p5 as double )
    
    if n1 <> 0 then
    	faktor1 = p1
    else
    	faktor1 = 0
    end if
    
    if n2 <> 0 then
    	faktor2 = p2
    else
    	faktor2 = 0
    end if
    
    if n3 <> 0 then
    	faktor3 = p3
    else
    	faktor3 = 0
    end if
    
    if n4 <> 0 then
    	faktor4 = p4
    else
    	faktor4 = 0
    end if
    
    if n5 <> 0 then
    	faktor5 = p5
    else
    	faktor5 = 0
    end if
    
    dim faktor as double
    faktor = 1 / ( faktor1 + faktor2 + faktor3 + faktor4 + faktor5 )
    
    dim note as double
    note = faktor * ( n1 * p1 + n2 * p2 + n3 * p3 + n4 * p4 + n5 * p5 )
    
    gewichteterDurchschnitt = note
    
    End function
    
  • Dieses Makro macht so etwas ähnliches wie MITTELWERT, nur dass nicht alle Werte (n1 bis n5) gleich gewichtet werden (bei fünf Werten also jeweils ein Fünftel = 20 %), sondern man die Gewichtung festlegen kann. Die Gewichtung erfolgt durch p1 bis p5. Falls die Prozensätze p1 bis p5 in der Summe (fälschlicherweise) nicht 100 % = 1 ergeben, wird die Berechnung angepasst und es stimmt trotzdem.
  • Die Daten aus Datenbank.ods sollen in Serienbrief.odt verwendet werden.
Fast alles funktioniert wie es soll, d.h. die Feldern, die ich über Feldbefehl hinzugefügt habe, enthalten die richtigen Werte.

Nur zeigt Writer bei den Feldern, deren Wert in Calc durch das Makro berechnet wird, statt z.B. "12,1" leider nur "#WERT!" an.

Auf der Suche nach dem Fehler habe ich festgestellt, dass sich dies genauso bei Zellen verhält, in denen ein anderes Makro die Daten lieferte. Daher komme ich zu der Ansicht, dass es zu einem Problem kommt, wenn Writer durch den Serienbrief die Daten aus Calc abruft, die durch ein Makro entstehen.

In Calc werden die Werte in den entsprechenden Zellen korrekt angezeigt.
Wenn ich jedoch zuerst Serienbrief.odt öffne, und danach Datenbank.ods, wird die Calc-Datei zunächst einmal nur mit Schreibschutz geöffnet, was normal sein müsste. Allerdings steht jetzt auch in Calc in den Zellen, deren Werte durch Makros entstehen, nicht mehr die entsprechenden Werte, sondern nun ebenfalls "#WERT!".

Ich sehe zwei Auswege:
1. Entweder muss ein Formel-Ersatz für das Makro GewichteterDurchschnitt gefunden werden, um das Problem zu umgehen. Gibt es das oder kennt jemand so etwas?
2. Oder irgendwie müssen in diesem Kontext die Makros zum Laufen gebracht werden. Hat jemand einen Rat oder eine Vermutung?

Vielen Dank im Voraus an alle, die etwas beisteuern können.

Viele Grüße
Freddy
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von Toxitom »

Hey Freddy,

noch ein paar Verständnisfragen:

Wann und wo werden denn die berechneten Zellen durch die Makros gefüllt? Besser: Wann werden die Makros aufgerufen? Bestimmte Ereignisse?

Eine als Datenbank verwendete Calc-Tabelle muss feste Werte drin stehen haben - die können nicht erst beim Öffnene berechnet werden oder so (per Makro). Auch Makros können nicht in schreibgeschütze Bereiche schreiben (- schreibgeschütztes Dokument) - zuden sollte die Sicherheitseinstellung die Ausführung von Makros verhindern bei Verwendung als Serienbrief-DB.... da sind noch einige Fragestellungen zu lösen;)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
fre-d
Beiträge: 5
Registriert: Fr, 04.10.2019 10:39

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von fre-d »

Hallo Tom,

vielen Dank für deine Rückfragen und die Infos!

Also die Makros werden über Formeln aufgerufen.

In Tabelle1 steht z.B. in Zelle AQ7:

Code: Alles auswählen

=WENN(
	A7=""; 
	""; 

	WENN(
		ZÄHLENWENN(AL7:AP7; ">0")>0; 
		GEWICHTETERDURCHSCHNITT(AL7; AL$6; AM7; AM$6; AN7; AN$6; AO7; AO$6; AP7; AP$6); 
		""
	)
)
Wenn ich deine Erklärung richtig verstehe, dann hat Calc nicht den Wert der Zelle zusätzlich parat, sondern muss beim Abfragen des Wertes das Makro ausführen, was verhindert wird.

Habe ich dich richtig verstanden?
Und hast du eine Lösungsidee? :)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von Toxitom »

Hey Fred,

also... benutzerdefinierte Funktionen (Makros). Tia, da haste wirklich Pech... die werden so nicht ausgeführt (beim Öffnen mit Schreibschutz). Das wird so also nicht funktionieren. Falls Du es nicht mit nativen Forrmeln lösen kannst, dann müsstest Du dein Programm so umbauen, dass die Makros nicht als "benutzerdefinierte Funktionen" ausgeführt werden (werden bei jedem Öffnene des Dokuments neu berechnet) - sondern die Werte Fest in die Zellen schreiben. Dann würde es funktionieren - da die Ausführung zwar verhindert wird, die Werte aber noch drinnstehen.

Nicht so einfach ....

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von Stephan »

Wenn ich deine Erklärung richtig verstehe, dann hat Calc nicht den Wert der Zelle zusätzlich parat, sondern muss beim Abfragen des Wertes das Makro ausführen, was verhindert wird.
Eigentlich nicht.
Schalte Extras-Zellinhalte-automatisch berechnen ab und einmal berechnete Werte sollten in den Zellen bleiben, also auch die Werte die von benutzerdefinierten Funktionen kommen.
Du müsstest dann also die Calc-Tabellen zwischendurch manuell öffnen um Werte zu aktualisieren.


Gruß
Stephan
fre-d
Beiträge: 5
Registriert: Fr, 04.10.2019 10:39

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von fre-d »

Hallo Stephan,

vielen Dank für den Hinweis!

Ein Frage habe ich dazu:
Eigentlich nicht.
Schalte Extras-Zellinhalte-automatisch berechnen ab und einmal berechnete Werte sollten in den Zellen bleiben, also auch die Werte die von benutzerdefinierten Funktionen kommen.
Du müsstest dann also die Calc-Tabellen zwischendurch manuell öffnen um Werte zu aktualisieren.
Ist damit
Daten > Berechnen > Automatisch berechnen (Haken weg)
gemeint? Oder muss ich unter Extras in den Optionen etwas umstellen?
fre-d
Beiträge: 5
Registriert: Fr, 04.10.2019 10:39

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von fre-d »

Toxitom hat geschrieben: Fr, 04.10.2019 11:46 also... benutzerdefinierte Funktionen (Makros). Tia, da haste wirklich Pech... die werden so nicht ausgeführt (beim Öffnen mit Schreibschutz). Das wird so also nicht funktionieren. Falls Du es nicht mit nativen Forrmeln lösen kannst, dann müsstest Du dein Programm so umbauen, dass die Makros nicht als "benutzerdefinierte Funktionen" ausgeführt werden (werden bei jedem Öffnene des Dokuments neu berechnet) - sondern die Werte Fest in die Zellen schreiben. Dann würde es funktionieren - da die Ausführung zwar verhindert wird, die Werte aber noch drinnstehen.

Nicht so einfach ....
Okay, dann weiß ich schon mal, dass ich es anders angehen muss.

Meine Idee wäre jetzt, dass die Werte in eine zweite Tabelle kopiert werden, via Makro, und dort dann nicht mit Formeln, sondern als tatsächliche Werte gespeichert sind. Dann müsste ich nur das Makro ausführen, bevor ich den Serienbrief öffne.
Wäre das auch deine Lösung oder gibt es noch was besseres?
Kann man ein Makro z.B. beim Speichern ausführen lassen? Dann wäre das Problem auch vollständig gelöst für mich.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von Stephan »

Ist damit
Daten > Berechnen > Automatisch berechnen (Haken weg)
gemeint?
Ja.

Die gesetzte Einstellung lässt sich dann im konkreten Dokument speichern(*), wenn Du nach Änderung der Einstellung nochmals auf Speichern klickst. (ist das nicht möglich, mache vorher eine belanglose sonstige Änderung im Dokument damit das Speichern-Icon aktiv wird)

(*)
d.h. die Einstellung kann in unterschiedlichen Dokumenten unterschiedlich sein und also auch unabhängig von der quasi generellen Einstellung (die beim Anlegen eines neuen Dokumentes gilt)


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von Stephan »

Meine Idee wäre jetzt, dass die Werte in eine zweite Tabelle kopiert werden, via Makro, und dort dann nicht mit Formeln, sondern als tatsächliche Werte gespeichert sind. Dann müsste ich nur das Makro ausführen, bevor ich den Serienbrief öffne.
Ja, gute Idee.

(eher ist die Idee überhaupt ein Tabellendokument als Datenquelle für die Datenbank zu nutzen nicht optimal, aber das ist wegen der durchzuführenden Berechnungen wohl eine Zweckmäßigkeitsfrage)


Gruß
Stephan
fre-d
Beiträge: 5
Registriert: Fr, 04.10.2019 10:39

Re: Makros blockieren Weitergabe von Daten beim Serienbrief

Beitrag von fre-d »

Vielen Dank, Toxitom und Stephan, für eure Hilfe!!!!
Das Problem ist dank euch nun gelöst!
Antworten