[GELÖST] Calc: WENNFEHLER nachprogrammieren

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

Moderator: Moderatoren

GR-Thunderstorm
Beiträge: 4
Registriert: Sa, 29.07.2017 23:21

[GELÖST] Calc: WENNFEHLER nachprogrammieren

Beitrag von GR-Thunderstorm »

Hallo an alle!
Ich möchte ein Dokument in OO Calc erstellen und dabei die aus Excel bekannte Funktion WENNFEHLER() einbauen. Da diese in OO Calc fehlt, möchte ich diese nachprogrammieren.
Ich habe bereits etwas MS Office VBA-Erfahrung und hatte mir das eigentlich ganz leicht vorgestellt, aber der Code will nicht so recht klappen. Mit Open Office Basic hatte ich aber erst ein einziges Mal zu tun...

Derzeit hänge ich bereits daran, die entsprechenden Werte an meine Funktion zu übergeben. :oops:

Ich wollte mich nach und nach an die Sache herantasten und ersteinmal herausfinden, was denn genau in einer Variable gespeichert wird, wenn ein fehlerhafter Wert übergeben wird.

Code: Alles auswählen

Public Function WENNFEHLER(EingabeWert As Variant, WertWennFehlert As Variant) As Variant
	MsgBox EingabeWert
	
	WENNFEHLER = WertWennFehlert
End Function
Folgendes habe ich daraufhin in eine beliebige Zelle eingetragen:
=WENNFEHLER(1;2) -> Es erscheint die Bildschirmausgabe "1" und in der Zelle wird eine 2 eingetragen.
=WENNFEHLER(NV();2) -> Es erscheint KEINE Ausgabe und in der Zelle wird ein NV eingetragen. :shock:
Bei letzterem bringt es auch nichts, einen Debugging-Haltepunkt auf die MsgBox zu legen... Die Funktion wird praktisch überhaupt nicht ausgeführt.

Könnt ihr mir bitte weiterhelfen? Vielen Dank!
Zuletzt geändert von GR-Thunderstorm am So, 30.07.2017 15:52, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: WENNFEHLER nachprogrammieren

Beitrag von Stephan »

Ich möchte ein Dokument in OO Calc erstellen und dabei die aus Excel bekannte Funktion WENNFEHLER() einbauen. Da diese in OO Calc fehlt, möchte ich diese nachprogrammieren.
Ich sehe keinen Weg diese spezielle Funktion nachzuprogrammieren, weil bei mir bereits durch Übergabe eines Fehlerwerts JEDE benutzerdefinierte Funktion einen Fehler ausgibt, ohne Rücksicht auf den Inhalt der Funktion. Man müsste also mit ISTFEHLER() in der Zelle arbeiten um das zu unterdrücken, dann jedoch macht eine benutzerdefinierte Funktion wenig Sinn.

Ich würde deshalb gleich statt:

=WENNFEHLER(NV();2)

ersatzweise verwenden:

=WENN(ISTFEHLER(NV());2;"")

oder statt OpenOffice Libreoffice nutzen (LibreOffice kennt WENNFEHLER()).
Ich bekomme es generell nicht hin, einen zuvor zu berechnenden Wert an mein Makro zu übergeben. :(
=WENNFEHLER(1+2; 2) -> In die Zelle wird #Wert eingetragen und es erscheint ebenfalls keine Bildschirmausgabe...
kann ich nicht nachvollziehen, funktioniert bei mir problemlos (Beispieldatei anhängend)


Gruß
Stephan
Dateianhänge
WENNFEHLER_Test.ods
(9.63 KiB) 195-mal heruntergeladen
GR-Thunderstorm
Beiträge: 4
Registriert: Sa, 29.07.2017 23:21

Re: Calc: WENNFEHLER nachprogrammieren

Beitrag von GR-Thunderstorm »

Hallo Stephan,
zunächst einmal vielen Dank für deine Antwort!
Stephan hat geschrieben: So, 30.07.2017 01:18 ersatzweise verwenden:

=WENN(ISTFEHLER(NV());2;"")
Der Wert 2 war nur ein Beispiel. Auch in diesem Fall müsste ich dann ggf. die komplette Formel zwei mal eingeben.
Quasi:
=WENN(NICHT(ISTFEHLER(<sehr sehr lange Funktion>)); <sehr sehr lange Funktion>; "")
Stephan hat geschrieben: So, 30.07.2017 01:18oder statt OpenOffice Libreoffice nutzen (LibreOffice kennt WENNFEHLER()).
Guter Hinweis, das wusste ich noch nicht. *daumenhoch*

Das nächste Problem hierbei: Die Tabelle soll für meine Frau sein, damit sie sie auf ihrer Arbeit verwenden kann. Und dort hat sie nur OpenOffice... :(

Stephan hat geschrieben: So, 30.07.2017 01:18
Ich bekomme es generell nicht hin, einen zuvor zu berechnenden Wert an mein Makro zu übergeben. :(
=WENNFEHLER(1+2; 2) -> In die Zelle wird #Wert eingetragen und es erscheint ebenfalls keine Bildschirmausgabe...
kann ich nicht nachvollziehen, funktioniert bei mir problemlos (Beispieldatei anhängend)
Das hatte sich bereits erledigt (deshalb im ursprünglichen Post auch wieder gelöscht). Ich wusste nicht, dass sich OO so piekig hat, wenn man den Speicherpfad des Dokuments nicht als vertrauenswürdigen Ort festlegt...


Dann werde ich wohl doch mit
=WENN(NICHT(ISTFEHLER(<sehr sehr lange Funktion>)); <sehr sehr lange Funktion>; <Ersatzwert>)
arbeiten müssen...
Aber wird die Formelberechnung dadurch nicht enorm verlangsamt, wenn OO alles doppelt berechnen muss? Diese Funktion wird vermutlich weit über 1000 mal auf meinem Tabellenblatt auftauchen.
GR-Thunderstorm
Beiträge: 4
Registriert: Sa, 29.07.2017 23:21

Re: Calc: WENNFEHLER nachprogrammieren

Beitrag von GR-Thunderstorm »

Ich habe mich jetzt an einem Work-Around probiert, aber auch das klappt nicht...

Meine Idee war folgende:

Code: Alles auswählen

Dim Sicherung As Variant

Public Function WERTSPEICHER(Optional Wert As Variant) As Variant
	If IsMissing(Wert) Then
		WERTSPEICHER = Sicherung
	Else
		Sicherung = Wert
		WERTSPEICHER = Wert
	End If
End Function
Somit soll das Ergebnis aus dem letzten korrekt übergebenen Wert zwischengespeichert und bei Bedarf erneut aufgerufen werden.

=WENN(ISTFEHLER(WERTSPEICHER(<sehr lange Funktion>));<WertWennFehler>;WERTSPEICHER())

Leider wird in meiner Speichervariable nichts dauerhaft gespeichert! :cry:

Ein einfaches Beispiel zum Testen:

Code: Alles auswählen

Sub Main()
	MsgBox Sicherung
	WertSpeicher(3)
	MsgBox Sicherung
End Sub
Spätestens beim zweiten Aufruf sollten beide MsgBoxes den Wert 3 anzeigen! Aber der Speicher wird jedes mal wieder gelöscht. :'( Gibt es wie bei VBA soetwas wie CustomDocumentProperties? Alternativ müsste ich den Wert in einer Zelle zwischenspeichern, aber das wäre aus meiner Sicht etwas "unsauber"...
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: WENNFEHLER nachprogrammieren

Beitrag von Stephan »

Aber wird die Formelberechnung dadurch nicht enorm verlangsamt, wenn OO alles doppelt berechnen muss?
Keine Ahnung. Ich würde das an Deiner Stelle einfach ausprobieren.


Gruß
Stephan
GR-Thunderstorm
Beiträge: 4
Registriert: Sa, 29.07.2017 23:21

Re: Calc: WENNFEHLER nachprogrammieren

Beitrag von GR-Thunderstorm »

Ich habe den Work-Around nun fertiggestellt und damit das Problem zufriedenstellend gelöst. :-)

Anbei der Code:

Code: Alles auswählen

Public Function ZWISCHENSPEICHER(Optional Wert As Variant) As Variant
	If IsMissing(Wert) Then
		On Error Goto NewProp1
		Weiter1:
		ZWISCHENSPEICHER = ThisComponent.DocumentProperties.UserdefinedProperties.ZwischenSpeicher
	Else
		On Error Goto NewProp2
		Weiter2:
		ThisComponent.DocumentProperties.UserdefinedProperties.ZwischenSpeicher = Wert
		ZWISCHENSPEICHER = Wert
	End If
	Exit Function
	
NewProp1:
	ThisComponent.DocumentProperties.UserdefinedProperties.AddProperty("ZwischenSpeicher", 0, "")
	Goto Weiter1
	
NewProp2:
	ThisComponent.DocumentProperties.UserdefinedProperties.AddProperty("ZwischenSpeicher", 0, "")
	Goto Weiter2
End Function
Ein Beispiel zum Aufrufen:
=WENN(ISTFEHLER(ZWISCHENSPEICHER(SVERWEIS(A1;A2:G3;7;FALSCH())));0;ZWISCHENSPEICHER())
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: [GELÖST] Calc: WENNFEHLER nachprogrammieren

Beitrag von balu »

Hallo Thunderstorm,
Auch in diesem Fall müsste ich dann ggf. die komplette Formel zwei mal eingeben.
Quasi:
=WENN(NICHT(ISTFEHLER(<sehr sehr lange Funktion>)); <sehr sehr lange Funktion>; "")
Ich frag mich ganz ernsthaft, ob Du das Pferd nicht verkehrt herum aufzäumst?
Musst Du wirklich mit WENNFEHLER arbeiten, oder reicht es nicht wenn die ursprüngliche Formel anders aufgebaut wird?

Nicht nur bei Excel-Anwendern, sondern auch bei OpenOffice-Anwendern, sehe ich immer wieder Formelkonstrukte die total unüberlegt sind. Teilweise aus unwissenheit, und teilweise nach dem Motto: "Hauptsache es Funktioniert."

Beispiel.
Es soll in einem Datenbereich in der ersten Datenspalte etwas gesucht werden, und dann das zurückgegeben werden was in der gleichen Zeile ein paar Spalten weiter rechts daneben steht. Das ist also ein Fall für SVERWEIS.
Also würde dies so aussehen.

Code: Alles auswählen

=SVERWEIS(A1;W10:Z50;4;0)
Und jetzt stellt jemand fest:

"Es kann da ja ein Fehler auftreten, wenn das gesuchte nicht in dem Datenbereich vorhanden ist. Also muss da eine Fehlerabfrage eingebaut werden, damit es nicht zu einer Fehlerausgabe kommt."

Alles so weit korrekt. Nur das dumme ist, das die meisten es sich jetzt doch zu einfach machen. Und deshalb die eigentliche Abfrage in eine Fehlerabfrage packen, das wie folgt aussieht.

Code: Alles auswählen

=WENN(ISTFEHLER(SVERWEIS(A1;W10:Z50;4;0));"Kein Treffer";SVERWEIS(A1;W10:Z50;4;0))
Okay, sieht ja auch echt logisch aus. Wenn SVERWEIS ein Fehler zurück gibt, dann wird dieser durch die ISTFEHLER ausgewertet, und es wird dann halt der Text "Kein Treffer" ausgegeben.

Und jetzt kommt WENNFEHLER ins Spiel.

Code: Alles auswählen

=WENNFEHLER(SVERWEIS(A1;W10:Z50;4;0);"Kein Treffer")
Na das sieht doch echt super, schön, einfach und Kurz aus!
Stimmt! Es sieht aus. Mehr aber auch nicht!
Denn der Arbeitsaufwand intern ist der gleiche wie der bei der vorherigen längeren Formel. Und es wird auch genau so vorgegangen. Erst wird die erste SVERWEIS abgearbeitet, und wenn es zu keinem Fehler kommt, dann wird die zweite SVERWEIS auch noch abgearbeitet.

Aber wer macht sich denn überhaupt noch Gedanken darum durch was der Fehler eigentlich entsteht, in diesem Beispiel mit der SVERWEIS?
Da wird einfach das Symptom behandelt, aber die Ursache wird einfach ausgeblendet.

Also, die Ursache dafür das SVERWEIS einen Fehler zurückgibt, liegt dadrin, das das Suchkriterium in der Suchspalte des Datenbereichs nicht vorhanden ist, es existiert nicht. Das ist also die Ursache. Nun muss man sich nur noch überlegen wie man dies Wissen als eine Fehleruntersuchung einbauen kann. Und das ist eigentlich recht simpel. Und zwar wie folgt.

Code: Alles auswählen

=WENN(ZÄHLENWENN(W10:W50;A1);SVERWEIS(A1;W10:Z50;4;0);"Kein Treffer")
ZÄHLENWENN geht jetzt einfach daher und schaut nach ob Das Suchkriterium in der 1. Spalte des Datenbereichs vorhanden ist. Wenn ja, wird die SVERWEIS ausgrführt, und wenn nein, dann wird der Text ausgegeben, und Fertig.
Diese Formel ist wohl etwas länger als die WENNFEHLER, aber dafür kürzer als die andere längere.

Ist ja wohl ganz gut und schön das Du dich mit so einer Thematik auseinander setzt, und ich habe auch einen gewissen Respekt davor allein schon wegen dem auseinandersetzen mit der Programmierung, aber irgendwie ist das ersetzen der WENNFEHLER in meinen Augen überflüssig.

Ich habe jetzzt dein vorläufiges Endergebnis ein klein wenig reduziert, das FALSCH() kann man durch 0 ersetzen.

Code: Alles auswählen

=WENN(ISTFEHLER(ZWISCHENSPEICHER(SVERWEIS(A1;A2:G3;7;0)));0;ZWISCHENSPEICHER())
Und hier im Gegenzug meine Formel die ohne zusätzliches Makro auskommt.

Code: Alles auswählen

=WENN(ZÄHLENWENN(A2:A3;A1);SVERWEIS(A1;A2:G3;7;0);0)
Egal ob Du meine Überlegung für dich für später aufhebst, oder nicht, hab deinen Spaß daran. Denn eines hast Du ja auf alle Fälle geschaft; Du hast wohl so einiges über die Programmierung gelernt, und das ist auch sehr viel Wert 8)



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten