Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1676to1680
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Function mit Optional

Function mit Optional
07.03.2019 23:54:25
Niclaus
Hallo
Ich habe eine Function, die in etwa der Formel =FORMELTEXT() entspricht:
Function myFormelInhalt(Zelle As Range)
If Zelle.HasFormula Then
myFormelInhalt = Zelle.FormulaLocal
Else
myFormelInhalt = "##"
End If
End Function

Diese Function funktioniert. Wenn ich irgendwo in der Tabelle eingebe
"= myFormelInhalt(A1)" wird mir die Formel von A1 zurückgegeben.
Nun möchte ich - zu Uebungszwecken - mit "Optional" arbeiten, damit folgendes möglich wird: Ich gebe in B2 die Formel so ein:
"=myFormelInhalt()", also ohne Zell-Bezug.
Es soll mir dann die Formel aus der linken Zelle zurückgegeben werden, hier also die Formel von A2.
Die Function heisst dann so:
Function myFormelInhalt(Optional Zelle As Range)
If IsMissing(Zelle) Then
Set Zelle2 = Selection.Offset(0, -1)
If Zelle2.HasFormula Then
myFormelInhalt = Zelle2.FormulaLocal
Else
myFormelInhalt = "##"
End If
Else
If Zelle.HasFormula Then
myFormelInhalt = Zelle.FormulaLocal
Else
myFormelInhalt = "##"
End If
End If
End Function

Wenn ich "=myFormelInhalt()" ohne Bezug verwende, gibt sie "#WERT!" aus.
Meine Fragen: Setze ich Optional ganz falsch ein?
Muss ich anstelle von "IsMissing" einen andern Ausdruck verwenden?
Bin ich ganz auf dem Holzweg?
Und eine weitere Frage: Ich schreibe
myFormelInhalt = "##"
Ich möchte aber, dass der Fehlerwert #NV ausgegeben wird: als wirklicher Fehlerwert, nicht als Text.
Kann man diesen Fehlerwert so einfach "produzieren"?
Vielen Dank für Eure Hilfe
Niclaus

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Function mit Optional
08.03.2019 00:31:16
Luschi
Hallo Nicolaujs,
das funktioniert so:

Function myFormelInhalt(Optional Zelle As Variant) As String
Dim Zelle2 As Range
If TypeName(Application.Caller)  "Range" Then
myFormelInhalt = "falscher Aufruf"
Exit Function
End If
If IsMissing(Zelle) Then
Set Zelle2 = Selection.Offset(0, -1)
Else
Set Zelle2 = Zelle
End If
If Zelle2.HasFormula Then
myFormelInhalt = Zelle2.FormulaLocal
Else
myFormelInhalt = "##"
End If
End Function
Gruß von Luschi
aus klein-Paris
PS: siehe Vba-Online-Hilfe:
IsMissing (Argname)
Das erforderliche argname-Argument enthält den Namen eines optionalen Variant-Prozedurarguments.
Anzeige
Das UDF-Pgm kann deutlich kürzer wdn, ...
08.03.2019 02:27:08
Luc:-?
…Niclaus,
wenn du vom richtigen Leerwert eines optionalen Objekts (wie Range) ausgehst. Außerdem ließe sich mit Luschis Variante keine spe­zielle F-Wert-Ausgabe realisieren, denn er hat das Ergebnis der UDF auf den Datentyp String festgelegt, was idR kontraproduktiv ist und nur den Standard­Fehler #WERT! erlaubt, den dann der FmlText-Interpreter von Xl setzt.
Im Prinzip reichen 4 Zeilen, um deine Wünsche zu erfüllen:
Function FText(Optional Zelle As Range)
If Zelle Is Nothing Then Set Zelle = Application.ThisCell.Offset(, -1)
If Zelle.HasFormula Then FText = Zelle.FormulaLocal Else FText = CVErr(xlErrNA)
End Function
Du kannst den gewonnenen Platz aber auch nutzen, um das Ergebnis zu verfeinern, zB so:
Function FText(Optional Zelle As Range)
Const fmArr$ = "{ }"
If Zelle Is Nothing Then Set Zelle = Application.ThisCell.Offset(, -1)
If Zelle.HasFormula Then
FText = Zelle.FormulaLocal
If Zelle.HasArray Then FText = Replace(fmArr, " ", FText)
Else: FText = CVErr(xlErrNA)
End If
End Function
Es wäre aber natürlich auch möglich, durch Angabe eines 2.Arguments zwischen den 4(-5)* Formen der .Formula-Eigenschaft zu wählen. Dieses Argument kann ebenfalls optional sein. Und es ist auch noch mehr möglich, wie Fmln von Gültigkeits- und Bedingt­For­mat-Re­geln, üblicherweise lokal (dt), aber auch im US-Original (was bei BedFormatRegeln leider wenig nutzt, obwohl es bei inter­na­tio­nalen Pgmm wichtig wäre), auszulesen. RegelFml-Wiedergabe, vor allem im Original, wäre aber deutlich komplexer, falls das alles nur eine UDF machen soll.
Man könnte aber auch noch die Adresse der betroffenen Zelle oder - bei MatrixFmln - des Bereichs davorsetzen. So etwas kannst du oft bei meinen eigenen Fml-Vorschlägen im Forum sehen.
* .FormulaArray gibt's nur im US-Original und ggf auch nur im R1C1-Format. Deshalb könnte man evtl darauf verzichten und eine der anderen wie gezeigt mit {} versehen.
Morhn, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
AW: an Luschi und Luc
08.03.2019 09:29:34
Niclaus
Hallo Luschi, hallo Luc
@Luschi: Ein kleines Schrittchen für die Menschheit, ein grosser Schritt für mich: Dein Hinweis auf
IsMissing (Argname). Vielen Dank!
@Luc: Was mir bei Deiner Kurzversion zuerst aufgefallen ist:
Du schreibst: Set Zelle = Application.ThisCell.Offset(, -1)
Ich hatte geschrieben: Set Zelle2 = Selection.Offset(0, -1)
Du kannst Dir sicher vorstellen, was für ein Chaos es bei meiner Version gibt, wenn ich irgendeine Zelle markiert habe und "Application.CalculateFull" aufrufe.
Das ist mein zweiter grosser Erkenntnis-Schritt: Der Unterschied zwischen ThisCell, ActiveCell und Selection!
Dann habe ich selber noch einen Schritt gemacht. Ich habe in Deine "grosse" Function als erste Zeile eingefügt:
Application.Volatile
Wenn ich in Spalte A eine Formel ändere, wird in Spalte B nun sofort die richtige Formel angezeigt. Ohne diese Zeile ist das nicht immer der Fall: Wenn ich z. B. in A3 die Formel "=MIN(C5:C10)" ändere zu "=MAX(C5:C10)", wird in B3 weiterhin angezeigt "=MIN(C5:C10)".
Was Du als weitere Möglichkeiten erwähnst, das muss ich gelegentlich in Ruhe anschauen.
Euch beiden vielen Dank
Niclaus
Anzeige
Bitte sehr! ;-)
08.03.2019 15:39:41
Luc:-?
Luschis .Caller macht im Prinzip dasselbe wie .ThisCell, Niclaus,
ist aber umfassender und verursachte wohl in meinen älteren UDFs (möglicherweise auf Grund erforderlicher zusätzlicher PrüfMaß­nah­men) häufig ZirkelBezugsWarnungen, so dass ich dann Fml-BerechnungsIteration zulassen musste.
Für das Auslesen von ZellEigenschaften wie hier die Fml ist das entsprd Objekt zwingend erforderlich. Eine Variant-Variable kann zwar auch (unspezifiziert) Objekte beinhalten, aber eben auch anderes, weshalb sie in solchen Fällen Überprüfungen erforderlich macht. Des­halb ist es bei eindeutigem Erfordernis wie hier besser, gleich die zutreffenden Begriffe zu benutzen (von seltenen Ausnahmen mal abge­sehen). IsMissing kann tatsächlich nur Variants zugeordnet wdn, denn alle anderen Datentypen haben einen Anfangswert (0, False, "" u.a.), der einem fehlenden Argument zugewiesen wird.
Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige