Office: Excel VBA - Unterschied zwischen Sub & Function (beides mit Werteübergabe im Aufruf)

Helfe beim Thema Excel VBA - Unterschied zwischen Sub & Function (beides mit Werteübergabe im Aufruf) in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo Forum, in einem aktuellen Projekt (Excel 2010) beschäftige ich mich endlich mal mit dem Thema "Function mit Werteübergabe", um immer... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von fette Elfe, 3. August 2013.

  1. fette Elfe Erfahrener User

    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.
    Klappt soweit auch alles.
    Hier ein Beispiel:
    Code:
    ' Aufruf mit Werteübergabe
    Call udfCboPage1Save("VonAnSave", False)
    
    ' Function
    Private Function udfCboPage1Save(Ident As String, bol As Boolean)
    ' steuert die "Save" CBOs, je nachdem ob der Wert der dazugehörigen CBO in Stammdaten gefunden wurde, oder nicht
        With Me
            .Controls("CboPage1" & Ident).Enabled = bol
            
            Select Case bol
                Case True
                    .Controls("CboPage1" & Ident).BackColor = &H8080FF      ' rot
                    .Controls("CboPage1" & Ident).ListIndex = 1
                Case False
                    .Controls("CboPage1" & Ident).BackColor = &HE0E0E0      ' grau
                    .Controls("CboPage1" & Ident).ListIndex = -1
            End Select
        End With
    End Function

    In einem früheren Projekt, habe ich für sowas mal "Subs mit Werteübergabe" benutzt. Die Art und Weise hatte ich im Netz gefunden, und für mich angepasst.
    Hier ein Beispiel:
    Code:
    ' Aufruf mit Werteübergabe
    DatumSetzen Me.cboDatum, ThisWorkbook.Worksheets("Stammdaten").Range("Datum")
    
    ' Sub
    Public Sub DatumSetzen(cbo As ComboBox, RG As Range)
        
        With cbo
            .List = RG.Resize(RG.End(xlDown).Row - 1).Value
            .ListIndex = ThisWorkbook.Worksheets("Beispielname").Range("B1").Value - 1
            .DropDown
        End With
        
    End Sub

    Beides klappt und macht was es soll.
    Nun meine Frage dazu:
    Abgesehen von den unterschiedlichen Aufgaben, den leicht unterschiedlichen Schreibweisen, der Deklarierung "Private" und Public", und das sich die Sub in einem allgemeinen Modul und die Function im Modul einer UserForm befindet...
    Wo ist der Unterschied, ob man sowas mit einer Sub oder mit einer Function macht?
    Welche Vor- bzw. Nachteile haben die beiden Methoden?

    Bei den beiden Beispielen habe ich auch nur Werte durch den Aufruf an die Sub bzw. Function übergeben.
    Wie wären die Unterschiede bzw. Vorteile wenn es auch Rückgabewerte geben würde?


    Um Missverständnissen vorzubeugen:
    Es geht mir hier definitiv nur darum, wiederkehrenden Code zu kapseln und variabel aufrufen zu können.
    Ich möchte keine eigene Funktion im Arbeitsblatt erstellen.

    Ich sach schonmal ganz lieben Dank für Eure Zeit und Mühe mir mal wieder etwas zu erklären.
     
    fette Elfe, 3. August 2013
    #1
  2. Exl121150 Erfahrener User
    Hallo Achim,

    1) so wie Du die UDF "function udfCboPage1Save(...)" programmiert hast und so wie Du sie aufrufst "Call udfCboPage1Save(...)", so hättest Du sie genauso gut auch als "SUB udfCboPage1Save(...)" programmieren können, ohne dass irgendein Unterschied zu bemerken gewesen wäre.
    2) Der entscheidende Unterschied zwischen FUNCTION und SUB ist, dass die Function durch die Verwendung in einem Ausdruck einen Wert über ihren Funktionsnamen zurückliefert, während eine SUB niemals in einem Ausdruck verwendet werden kann.

    So wie Du die Funktion "udfCboPage1Save(...)" deklariert hast, müsste sie eigentlich einen Wert vom Typ "Variant" zurückliefern. Aber Du hast in der Funktion selbst nirgendwo eine Zuweisung "udfCboPage1Save = Ausdruck" stehen. Somit ist der Funktionswert Deiner Funktion vom Typ "Variant" stets "EMPTY". Da Du die Funktion so aufgerufen hast wie eine SUB ("call ...."), hast du ohnehin auf die Auswertung des Funktionswertes verzichtet.

    Eine typische Funktion simpelster Bauart (nur um eine Funktion zu zeigen) zB. vom Typ "Integer" müsste so aussehen:
    Code:
    Function Addiere(Summand1 As Integer, Summand2 As Integer) [COLOR=#ff0000]As Integer[/COLOR]
      [COLOR=#ff0000]Addiere =[/COLOR] Summand1 + Summand2
    End Function
    
    Die Deklaration einer Funktion schaut im Prinzip also immer so aus:
    Function Funktionsname(Parameterliste) As Funkionstyp
    Darüberhinaus hat die Funktion in ihrem Body mindestens eine Anweisungszeile, in der dem Funktionsnamen ein Wert zugewiesen wird, der dann als Rückgabewert in einem arithmetischen/logischen/string Ausdruck fungiert:
    Funktionsname = Wert

    Diese Funktion "Addiere" kann also an anderer Stelle im Programm so verwendet werden:
    Code:
      Dim Resultat As Integer
    '...
      Resultat = 3 * Addiere(5,4) + 2
    '...
    
    wodurch die Variable "Resultat" den Wert 29 zugewiesen bekommt.

    Man kann natürlich, wie Du es getan hast, den Funktionswert auch ignorieren, wobei 2 Schreibweisen möglich sind, zB:
    Code:
    '....
      Call Addiere(5,4)
    '....
    '.. oder wie folgt aufrufen (ohne CALL [U]und[/U] ohne Parameterklammern):
    '....
      Addiere 5,4
    '....
    
     
    Zuletzt bearbeitet: 3. August 2013
    Exl121150, 3. August 2013
    #2
  3. fette Elfe Erfahrener User
    Ganz lieben Dank Exl121150,

    das ist so gut erklärt, dass ich es auf Anhieb verstanden habe.
    Also sind meine Functions eigentlich völlig sinnlos (ausser der Inhalt), zumindest im Sinne von Functions.
    Werde dann mal alle in Subs umändern.
     
    fette Elfe, 5. August 2013
    #3
  4. Beverly
    Beverly Erfahrener User

    Excel VBA - Unterschied zwischen Sub & Function (beides mit Werteübergabe im Aufruf)

    Hi Achim,

    Da die von dir genutze Art von Function von ihrer Funktionalität her identisch mit einer Sub ist, musst du sie nicht in Subs umwandeln sondern kannst sie nach wie vor problemlos weiter verwenden. Es gibt keinen Vor- oder Nachteil, die eine oder die andere "Variante" zu verwenden.

    Bis später,
    Karin
     
    Beverly, 6. August 2013
    #4
  5. fette Elfe Erfahrener User
    Hallo Karin,

    jo, iss klar.
    Ist wohl eher eine Frage des Stils, bzw. in diesem Fall eine Frage der Gewöhnung.
    Da ich mich momentan mit dem Thema ausseinandersetze, möchte ich halt die Dinge möglichst sinnvoll verinnerlichen.
    Ich weiß zwar nicht wie andere diesen speziellen Fall handhaben, aber aus Gründen der Übersichtlichkeit und des Verständnisses für fremden oder alten eigenen Code, könnte ich mir eine strikte Trennung zwischen Subs und Functions als sinnvoll vorstellen. Sprich Functions nur benutzen, wenn Sie gebraucht werden, Subs benutzen wenn sie ausreichen...

    ich hoffe Du verstehst was ich meine?
     
    fette Elfe, 7. August 2013
    #5
Thema:

Excel VBA - Unterschied zwischen Sub & Function (beides mit Werteübergabe im Aufruf)

Die Seite wird geladen...
  1. Excel VBA - Unterschied zwischen Sub & Function (beides mit Werteübergabe im Aufruf) - Similar Threads - Excel VBA Unterschied

  2. VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.

    in Microsoft Excel Hilfe
    VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.: Hallo zusammen, Eine Tabelle mit 9 Worksheets, Datenblatt, Studien, Studie_1 ...Studie_7. Auf dem Deckblatt werden in Zelle B4-B10 die Namen der Studien eingetragen. Davon abhängig ob ein Name...
  3. Excel VBA Spalten mit Ordnerinhalt vergleichen

    in Microsoft Excel Hilfe
    Excel VBA Spalten mit Ordnerinhalt vergleichen: Hallo, Bin ehr Excel VBA Neuling, Würde aber gerne in einer bestehender Tabelle die Auflistung der Ordner mit dem eigentlichen Stand in den besagten Ordner kontrollieren. Also in der Spalte Q10...
  4. Array aus Excel Tabelle einlesen Word VBA

    in Microsoft Excel Hilfe
    Array aus Excel Tabelle einlesen Word VBA: Hallo, ich benötige in einer Word Datei die Werte einer Excel Datei. Ich würde gerne eine Spalte als Array einlesen. Wie das Array ein lesen in Excel geht weiß ich, aber wie schaffe ich den...
  5. Dynamische Tabellen mit automatischer Aktualisierung

    in Microsoft Excel Hilfe
    Dynamische Tabellen mit automatischer Aktualisierung: Hallo in die Runde! Vorab schon mal vielen Dank für alle Mühen und die Hilfe! Ich habe folgendes Anliegen: Ich habe eine Geräteliste als Excel Datei mit einigen verschiedenen Tabellenblättern...
  6. Daten Kopieren aus einer zweiten Datei

    in Microsoft Excel Hilfe
    Daten Kopieren aus einer zweiten Datei: Ich weiss nicht ob dies Hier schon existiert. Leider habe ich noch nichts gefunden. Ich habe eine Excel Datei (Kunden Angaben) und eine zweite Datei (Mappe1). Wenn beide geöffnet sind kann ich aus...
  7. Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox

    in Microsoft Excel Hilfe
    Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox: Ich habe ein Formular mit mehr als 20 Textboxen, in die abhängig von der Textbox unterschiedliche Daten eingegeben werden sollen. In einige sollen numerische Daten, in andere Buchstaben (d.h....
  8. VBA Code-automatisches Kopieren von Excel-Inhalten; unterschiedliche Speicherorte

    in Microsoft Excel Hilfe
    VBA Code-automatisches Kopieren von Excel-Inhalten; unterschiedliche Speicherorte: Liebes Forum, ich melde mich mal wieder mit einer Frage zu einem VBA Code. Meine Excel-Masterdatei liegt auf einem Sharepoint im Ordner "A" und soll automatisch mit einem einzigen Button...
  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