Office: Function oder Sub

Helfe beim Thema Function oder Sub in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, ich stehe grade vor einem Problem. Und zwar habe ich mir eine Funktion geschrieben, die etwas erledigen soll. Allerdings hat diese... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Flämmchen, 14. März 2009.

  1. Function oder Sub


    Hallo zusammen,

    ich stehe grade vor einem Problem. Und zwar habe ich mir eine Funktion geschrieben, die etwas erledigen soll. Allerdings hat diese Funktion einen optional-wert. Hier zwei Beispielfunktionen: Code:
    Meine frage ist nun, wie kann ich mit 100%iger genauigkeit sagen, ob die Variable (Var2) angegeben wurde? Sie kann nämlich auch 0 bzw. leer sein. Kann man das überhaupt 100%ig rausfinden - oder geht das gar nicht?

    Danke im voraus,

    MFG Flämmchen

    :)
     
    Flämmchen, 14. März 2009
    #1
  2. Hallo Flämmchen,

    das geht nur, wenn du die Parameter als Variant deklarierst. Dann kannst du mit der IsMissing-Funktion abfragen ob etwas übergeben wurde.

    Option Explicit

    Private Function MyFunc(ByVal Var1 As String, Optional ByVal Var2 As Variant) As Boolean
    If IsMissing(Var2) Then
    MsgBox "nicht gesetzt !!"
    MyFunc = False
    Else
    MsgBox Var2
    MyFunc = True
    End If
    End Function

    Public Sub Test()
    Dim blnReturn As Boolean
    blnReturn = MyFunc("ABC")
    MsgBox blnReturn
    blnReturn = MyFunc("YXZ", 123)
    MsgBox blnReturn
    End Sub
     
    Nepumuk, 16. März 2009
    #2
  3. Das würde ich etwas relativieren wollen. Man kann einem optionalen Argument auch einen Standardwert mitgeben, um sich bspw. Argumentangaben (bewusst) zu sparen. Dies wird auch bei VBA-Standardfunktionen vielfach angewandt.
    Code:
    0 ist Teilmenge von Integer, eine Extraprüfung ist nur für Fälle wie Vermeidung von Division durch 0 u.ä. notwendig.

    Argumente, die Null enthalten können, können auch mit Nz entschärft werden:
    Code:
     
  4. Function oder Sub

    Moin, eberhard,

    Meines Wissens und durch Nachschlagen verifiziert im Objektkatalog ist Nz in Excel-VBA nicht vorhanden...
     
  5. Hallo Eberhard,

    das ist schon richtig, aber du weißt damit nicht, ob ein Parameter übergeben wurde. Wenn du einen Standardwert 0 setzt, kann ich ja trotzdem eine 0 übergeben wollen. Ich kann natürlich irgendwelche irrealen Werte als Standard setzen. Aber die muss ich dann auch überall wo ich verzweige abfragen. Das macht das ganze wartungsaufwendiger.
     
    Nepumuk, 16. März 2009
    #5
  6. Interessanter Gedanke. Ich würde aber die gezeigte Variante anwenden, um es mir einfacher zu machen. Für eine nicht vorhandene Zahl eine 0 zu verwenden, um rechnen zu können, ist so irreal nicht.

    Wenn Du prüfen willst, ob Argumente übergeben werden, ist die Verwendung von Variant natürlich passend. Eigentliches Ziel ist doch aber, dass eine Funktion einen Rückgabewert (Ergebnis einer Berechnung) liefert und dass eine Sub eine Prozedur ausführt, und das fehlerfrei auch bei teilweise unvollständigen Argumenten (die Datenquelle kann man nicht immer beeinflussen).
    Hier kann der Vorteil von Variant, alles sein zu können (String, Zahl, Array, Objekt, Null) schnell zur Falle werden. Nicht selten wird nicht nur ein Argument, sondern ein Argument mit richtigem Datentyp benötigt (Excel scheint hier recht tolerant zu sein, eine SQL-Anweisung steigt sofort aus). Diese zusätzliche Prüfung auf Datentyp kann ich mir ersparen, wenn ich per Funktionsdeklaration gleich den richtigen Datentyp einfordere.

    Dass man die deklarierte Funktion und den Aufruf dieser in Übereinstimmung bringt mit der vorhandenen Aufgabenstellung und der zugehörigen Datenbasis, versteht sich auch von selbst.

    Den Hinweis mit der Verzweigung verstehe ich nicht: Eine Funktion liefert im Normalfall ein Ergebnis (und das hoffentlich ohne festcodierten Objektbezug). Brauche ich mehrere Ergebnisse, rufe ich diese Funktion entsprechend oft auf mit entsprechend variierten Argumenten.

    @jinx: Guter Hinweis. Um solche Unterschiede kennenzulernen bin ich auch in diesem Forum unterwegs. Die IIf-Funktion macht aber das Gleiche und könnte als Nz-Ersatzfunktion herangezogen werden.
     
  7. Hallo Eberhard,

    ich rufe ja nicht nur Funktionen sondern auch ganz normale Routinen mit optionalen Parametern auf. Und diese Routine soll entweder das machen, oder das, oder das ...... Wenn ich damit rechnen muss, dass über die Parameter ganz unterschiedlichen Datentypen in wechselnder Anzahl ankommen können, benutze ich ein Parameterfeld (ParamArray).

    So habe ich z.B. eine Standardschleife über alle Zeilen in einem Projekt. Diese Schleife ruft ganz unterschiedliche Routinen auf. Die Namen der aufzurufenden Routinen bekommt die Schleife bei ihrem Aufruf erst mitgeteilt. Dazu bekommt sie auch ganz unterschiedliche Daten geliefert die in den aufgerufenen Routinen benötigt werden. Das können Workbooks sein, Worksheets, irgendwelche Zähler, einen String, welcher die Caption der Progressbar enthält die während der Abarbeitung der Schleife angezeigt wird usw. Da die Anzahl der Parameter variiert, ist das sogenannte ParamArray notwendig.

    Ansonsten habe ich meine Programme soweit im Griff, dass ich mir 100% sicher bin, das ich einer Routine, welche optional eine Zeilennummer oder nichts erwartet, kein Objekt übergebe.
     
    Nepumuk, 17. März 2009
    #7
  8. Function oder Sub

    \@Nepumuk:
    Ehe wir zu weit von der eingangs gestellten Frage abkommen: Dein Vorschlag in #2 ist in Ordnung. Die absolute Aussage ...
    ... ist aber falsch, weil unvollständig. Eine mögliche Alternative habe ich hinreichend dargestellt. Eine "Funktion ... die etwas erledigen soll" umfasst sicher mehr als eine Prüfung auf vorhandene Argumente.

    Über unterschiedliche Arbeitsweisen kann man trefflich diskutieren. Das ist aber an der Stelle nicht mein Wille. Meine Aussage, dass man sich mit genau definierten Eingangs- und Ausgangsparametern eine Reihe von sonst notwendigen Prüfungen ersparen kann, ist sicher nachvollziehbar und eben als möglicher Weg zu verstehen.
     
  9. Hallo Eberhard,

    die Ausgangsfrage war:

    Und meine Antwort "das geht nur, wenn du die Parameter als Variant deklarierst" ist absolut korrekt.

    Deine Alternative lässt es eben nicht zu, das mit 100% Sicherheit zu sagen.

    Wenn du einen optionalen boolschen Parameter mit False vorbelegst, wie willst du im Programm unterscheiden, ob es der übergebene Wert oder der Vorgabewert ist?
     
    Nepumuk, 17. März 2009
    #9
  10. Das ist korrekt. Meine Alternative beinhaltet aber einen definierten und einfachen Umgang mit einem nicht angegebenen Argument (= der Sinn von optional). Das ist für mich die eigentliche Problemstellung.

    Wenn die Funktion "etwas erledigen soll", ist ein Abbruch nach IsMissing(Var2)=True keine Lösung, wohl aber das Setzen eines verarbeitbaren Ersatzwertes. Das mache ich eben direkt.

    Das Parameterfeld ist ein tolles Beispiel: Hier muss nicht nur geprüft werden, ob Argument übergeben, sondern zusätzlich, wie viele Argumente übergeben wurden. Vorbeugend zur Antwort, dass immer die richtigen Parameter in der richtigen Anzahl und Reihenfolge übergeben werden und der Code auch funktioniert (im Griff ist), stelle ich gleich zusätzlich die Frage, ob Du eine Fehlerbehandlung verwendest, und wenn ja, warum?

    Meinen Vorschlag (es ist ein Vorschlag, nichts weiter) würde ich so zusammenfassen: Warum soll ich erst die Nadel auf den Heuhaufen werfen, wenn ich sie doch zwischen den Fingerspitzen halten will?

    Und: Letzten Endes wird nur Flämmchen beantworten können, was er/sie eigentlich wollte.
     
  11. Hallo zusammen,

    ich sehe schon, das hat zu einer regen diskussion geführt hier. Ich finde beide ansätze (sowohl Variant/ismissing als auch "alternativwerte") recht interessant und gut zu wissen. Letztendlich kann man dann ja je nach situation die variante anwenden.

    Von meiner seite aus ist dieser thread gelöst. Wenn ihr noch weiter diskutieren wollt, tut euch keinen zwang an :P

    Vielen Dank,

    MFG Flämmchen
     
    Flämmchen, 17. März 2009
    #11
  12. Hallo Flämmchen, ich für meinen Teil war auch fertig, und Dein Feedback gibt mir die Bestätigung, dass ich mich verständlich ausgedrückt hatte.
     
Thema:

Function oder Sub

Die Seite wird geladen...
  1. Function oder Sub - Similar Threads - Function Sub

  2. Function Sub und Makro

    in Microsoft Excel Hilfe
    Function Sub und Makro: Hallo zusammen. Ja, auch ich verzweifle gerade. Ich habe folgendes Problem: Da ich quasi ein Makro innerhalb einer Wenn-Dann-Bedingung starten möchte, muss ich den VBA Code in einer Function...
  3. Benutzerdefinierte Matrixfunktion (function) mit integrierten Arrayfunktionen

    in Microsoft Excel Hilfe
    Benutzerdefinierte Matrixfunktion (function) mit integrierten Arrayfunktionen: Hallo liebe Forumsmitglieder, nachdem ich nun schon einige Stunden nach einer Lösung im Netz und im Forum gesucht und selbst einiges probiert habe, wende ich mich nun mit folgender Frage an euch:...
  4. User Defined Functions (UDF) auch ohne VBA / Makro möglich ?

    in Microsoft Excel Hilfe
    User Defined Functions (UDF) auch ohne VBA / Makro möglich ?: Moin, Ich hab ne ganz einfache Frage, die sich wohl direkt mit Ja oder Nein beantworten läßt. Meine Tabelle ist 450 Zeilen hoch und 365 Spalten breit. *eek.gif* In jeder Zelle ist die gleiche...
  5. Solver aus function ohne worksheet-Berechnung?

    in Microsoft Excel Hilfe
    Solver aus function ohne worksheet-Berechnung?: hallo zusammen, nutze den solver für nichtlineare Fits, mit üblichen Weg der Berechnung der Abweichungsquadrate zwischen Soll- und Ist-Funktion, die via solver minimiert werden. Ganz einfaches...
  6. Fehler beim kompilieren sub oder Function nicht definiert

    in Microsoft Excel Hilfe
    Fehler beim kompilieren sub oder Function nicht definiert: Hallo zusammen erhalte Fehlermeldung: Fehler beim Kompilieren oder Function nicht definiert. übersehe ich etwas. (bin neuling) Bin dankbar für jede Unterstützung Private Sub cmdSpeichern_Click()...
  7. Aufruf einer function in excel mit =modul.1.name

    in Microsoft Excel Hilfe
    Aufruf einer function in excel mit =modul.1.name: Hallo zusammen, ich habe in VBA eine z.b. eine simple function, mit dem Namen: sum für das aufsummieren der zahlen von 1 bis 100 programmiert. Diese function möchte ich nun in Excel aufrufen, in...
  8. Excel VBA - Unterschied zwischen Sub & Function (beides mit Werteübergabe im Aufruf)

    in Microsoft Excel Hilfe
    Excel VBA - Unterschied zwischen Sub & Function (beides mit Werteübergabe im Aufruf): Hallo Forum, in einem aktuellen Projekt (Excel 2010) beschäftige ich mich endlich mal mit dem Thema "Function mit Werteübergabe", um immer wiederkehrenden Code nur einmal schreiben zu müssen....
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden