Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Sub kontra Function

Sub kontra Function
edie
Hallo zusammen,
ein Makro beginnt immer mit Sub und oder Function, was ist der Unterschied und
was sollte man beachten? In welchen fällen funktioniert bzw. Function nicht?
Kann mir jemand sagen worauf ich achten muss? Danke im Voraus.
Grüße-edie
Anzeige
AW: Sub kontra Function
19.08.2010 16:33:45
Hajo_Zi
Hallo Eddie,
eine Funktion benutzt Du um wiederholende Prozeduren auszuführen. z.B. Berechnung Kalenderwoche. Einer Funktion übergibst Du meist auch eine oder mehrere Parameter.

AW: Sub kontra Function
19.08.2010 16:38:40
edie
Hallo Hajo_Zi,
ist es schlimm, wenn ich auch einfache Makros mit Funktion beginne?
Vielen Dank.
Grüße-edie
Anzeige
AW: Sub kontra Function
19.08.2010 16:40:32
Hajo_Zi
Hallo Edie,
wie ist das gemeint?
Du kannst in einem Makro gleich als erstes eine Funktion aufrufen.
Gruß Hajo
AW: Sub kontra Function
19.08.2010 16:53:13
edie
Hallo Hajo_Zi,
wenn ich statt:
Sub Test()
End Sub
wie nachfolgend schreibe, sieht man das Makro nicht mehr im Fenster "Makro ausführen" unter
Makroname. Das ist ja manchmal so gewünscht.
Function Test()
End Function
Vielen Dank.
Grüße-edie
Anzeige
AW: Sub kontra Function
19.08.2010 16:56:20
Hajo_Zi
Hallo Edie,
ich benutze dazu die Zeile
Option Private Module unter
Option Explicit
Gruß Hajo
Unsichtbare Makros : Private Sub Test()
19.08.2010 16:59:38
NoNet
Hallo Edie,
wie nachfolgend schreibe, sieht man das Makro nicht mehr im Fenster "Makro ausführen" unter
Makroname. Das ist ja manchmal so gewünscht.
Dann verwende besser folgende Alternative :
Private Sub Test()
End sub
Durch das Schlüsselwort PRIVATE ist das Makro auch nicht mehr unter "Makro ausführen" sichtbar, aber es ist und bleibt ein MAKRO und keine FUNKTION ;-) !
Gruß, NoNet
Anzeige
AW: Unsichtbare Makros : Private Sub Test()
19.08.2010 17:07:04
edie
Hallo Hajo_Zi und NoNet,
werde eurem Rat folgen und Makros mit PRIVATE beginnen, wenn Bedarf.
Noch einmal Danke.
Grüße- edie
Zur Unterscheidung von Private und...
19.08.2010 19:17:09
Private
Private Module, Folks…
Der Gebrauch hat keine analogen Auswirkungen! Eine Private-Prozedur steht nur in ihrem Standortmodul für Zugriffe zur Verfügung. Steht eine ansonsten Public Prozedur aber in einem Private Module gilt das nicht! In beiden Fällen wdn aber sowohl Subroutinen als auch Funktionen nicht in Makro- bzw Fkts-Assi angezeigt (Letzteren hattest du wohl bei deinen Überlegun­gen vergessen, Edie!? Außerdem hättest du den recht erheblichen Unterschied auch in der VBE-Hilfe nachlesen können!)!
Außerdem wdn im Makro-Assi nur Subroutinen angezeigt, die auch von dieser Stelle aus aufgerufen wdn können. Verlangt die Subroutine eine Parameter-Übergabe, ist das idR nicht der Fall, es sei denn, alle Parameter sind Optional und Variant.
Übrigens (und nebenbei) kann man nicht nur eine FunctionProc innerhalb einer SubProc einsetzen bzw ggf letztere durch erstere ersetzen, sondern auch umgekehrt erstere durch letztere mit analoger Funktionalität, wenn man einen Parameter ByRef übergibt, den die Subroutine dann mit einem evtl Ergebnis füllt. Allerdings kann mit so etwas nicht die ZellFmlVerwendbarkeit einer echten Fkt aufgewogen wdn. Damit kann man so auch nicht die Beschränkungen für Fktt im TabBlatt umgehen (kann man aber durch „physische Entkopplung“ von Fkts- und Sub-Teil per EventProc erreichen). Hilft also nur in VBA-Prozeduren.
Gruß Luc :-?
Anzeige
AW: Zur Unterscheidung von Private und...
20.08.2010 11:00:58
Private
Hallo zusammen,
an der Stelle wäre noch zu ergänzen, dass die Verwendung von Option Private Module die Ausführung von Prozeduren oder Funktionen aus anderen Projekten heraus verhindert.
Das gilt jetzt natürlich nur, wenn das über einen Verweis läuft, mit Run geht es trotzdem.
Gruß, Jogy
Anzeige
Ja, das ist richtig! Danke! Außerdem...
20.08.2010 11:36:41
Luc:-?
…wäre noch zu ergänzen, dass Fktt in Private Modulen mit gewissen Vorbereitungen (ActiveX) doch im Fkts-Assi zur Ansicht gebracht wdn können. Im TabBlatt können sie in beiden Fällen (allerdings ohne Unterstützung) ohnehin verwendet wdn. In VBA-Prozeduren müsste man dann den Umweg über Evaluate nehmen u/o einen speziellen Adapter schreiben…
Gruß Luc :-?
Anzeige
Kein gutes Beispiel von Hajo...
19.08.2010 16:55:34
Hajo...
Hallo edie, hallo Hajo,
die Begründung von Hajo ist leider "knapp daneben" ;-) und daher als Beispiel ungeeignet !
Natürlich können auch SUBs wiederholt ausgeführt werden und mit Parameterübergabe ausgestattet werden.
Der eigentliche Vorteil einer ~f~FUNCTION (oftmals auch als UDF - User definded Function ~f~bezeichnet) ist der, dass sie dazu dient ein Ergebnis (Zahl, Datum, Text, ARRAY etc.) zurück zu liefern. Man kann durch den Aufruf einer ~f~Function~f~ also direkt eine Variable oder eine Zelle, Zellbereich etc. mit Werten befüllen. Z.B. :
Sub Test()
Dim Ergebnis
Ergebnis=Doppelt(5)
Msgbox Ergebnis
End sub
Function Doppelt(Zahl)
Doppelt=2*Zahl
End Function

Hier wird der Variablen Ergebnis das Doppelte des übergebenen Wertes (2 * 5 = 10) zugewiesen.
Diese Wertzuweisung kann man in VBA verwenden, oder auch als Tabellenblattfunktion (wenn die entsprechende ~f~FUNCTION~f~ in einem allgemeinen Modul oder im Klassenmodul des Tabellenblattes oder in einem AddIn enthalten ist) : =DOPPELT(5)
Einschränkungen einer UDF als Tabellenblattfunktion : Einige Anweisungen können in einer UDF nicht ausgeführt werden (z.B. Sheets(1).[A1]="Test" oder auch Activeworkbook.Save oder Sheets.Add etc.)
Eine ~f~FUNCTION~f~ dient also hauptsächlich zum "Berechnen" eines Ergebniswertes mit dem man im aufrufenden Makro/Tabellenblatt weiterrechnen kann, während eine ~f~SUB~f~ zur Ausführung verschiedener Aktionen dient.
Gruß, NoNet
Anzeige
AW: Kein gutes Beispiel von Hajo...
20.08.2010 08:57:10
Hajo...
Hallo zusammen,
Ich würde sogar noch einen Schritt weitergehen: Solange es rein um ein Programm und nicht die Anwendung einer UDF im Arbeitsblatt geht, gibt es eigentlich keinen grundsätzlichen Unterschied zwischen Sub und Function.
Denn auch beim Sub kann ich durch die Übergabe ByRef direkt einen Wert zurückbekommen. Und bei vielen zurückzugebenden Werten ist das unter Umständen sogar einfacher. Allerdings macht so etwas den Code schwer lesbar, weil nicht sofort offensichtlich ist, was nun der Rückgabewert ist. Bei einer Function ist das eindeutig.
Also grundsätzlich: Wenn es was zurückliefern soll (und sei es nur, dass kein Fehler aufgetreten ist), dann eine Function. Wenn nicht, dann ein Sub. Und Ausnahmen bestätigen hier ganz eindeutig die Regel ;).
Gruß, Jogy
Anzeige
AW: Sub kontra Function
19.08.2010 16:45:05
Gerd
Hallo Edie,
der wesentliche Unterschied ist, dass eine Funktion einen Rückgabewert erhalten kann.
Gruß Gerd
vielen, vielen Dank an Alle!
19.08.2010 17:03:31
edie
Hallo zusammen,
vielen herzlichen Dank.
Grüße- edie
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Sub kontra Function in VBA


Schritt-für-Schritt-Anleitung

  1. Sub und Function definieren:

    • Eine Sub (Subroutine) wird verwendet, um eine Gruppe von Anweisungen auszuführen. Sie hat keinen Rückgabewert.
    • Eine Function hingegen gibt einen Wert zurück und kann Parameter entgegennehmen.
  2. Erstellen eines einfachen Makros:

    • Um ein Sub zu erstellen, beginne mit Sub MakroName() und beende mit End Sub.
    • Um eine Function zu erstellen, beginne mit Function FunktionsName() und beende mit End Function.
    Sub Test()
       MsgBox "Das ist ein Sub!"
    End Sub
    
    Function Quadrat(Zahl As Integer) As Integer
       Quadrat = Zahl * Zahl
    End Function
  3. Unterschiede beachten:

    • Bei der Verwendung von Function kannst Du das Ergebnis direkt in einer Zelle verwenden, während ein Sub in der Regel nicht in Zellen eingetragen werden kann.

Häufige Fehler und Lösungen

  • Problem: Function wird nicht im Makrofenster angezeigt.

    • Lösung: Verwende Private Sub oder Private Function, wenn Du die Sichtbarkeit im Makrofenster einschränken möchtest. Beispiel:
    Private Sub Test()
    End Sub
  • Problem: Rückgabewert fehlt.

    • Lösung: Stelle sicher, dass Du den Rückgabewert in Deiner Function korrekt zuweist, z.B. Funktion = Wert.

Alternative Methoden

  • Verwende Access VBA für die Erstellung von privaten Subroutinen, die nicht von anderen Modulen aufgerufen werden können.
  • In Excel kannst Du eine Public Function erstellen, die in Formeln verwendet werden kann, z.B.:

    Public Function Multiplikation(x As Double, y As Double) As Double
      Multiplikation = x * y
    End Function

Praktische Beispiele

  1. Ein einfaches Sub:

    Sub Begrüßung()
       MsgBox "Hallo, willkommen in Excel VBA!"
    End Sub
  2. Eine Funktion zur Berechnung:

    Function Summe(a As Double, b As Double) As Double
       Summe = a + b
    End Function
  3. Verwendung von Sub und Function:

    Sub Haupt()
       Dim Ergebnis As Double
       Ergebnis = Summe(5, 10)
       MsgBox "Die Summe ist: " & Ergebnis
    End Sub

Tipps für Profis

  • Nutze Option Private Module am Anfang Deines Codes, um die Sichtbarkeit von Subroutinen und Funktionen auf das aktuelle Modul zu beschränken.
  • Bei der Verwendung von Public und Private Subroutinen solltest Du stets den Zugriff auf Deine Module im Blick behalten.
  • Berücksichtige den Einsatz von ByRef und ByVal für die Parameterübergabe, um zu steuern, ob Änderungen an den übergebenen Werten vorgenommen werden können.

FAQ: Häufige Fragen

1. Was ist der Hauptunterschied zwischen Sub und Function?
Der Hauptunterschied liegt darin, dass eine Function einen Rückgabewert liefert, während eine Sub lediglich Anweisungen ausführt.

2. Kann ich eine Subroutine in einer Funktion aufrufen?
Ja, Du kannst innerhalb einer Function eine Sub aufrufen. Dies ist nützlich, um bestimmte Aktionen auszuführen, bevor ein Wert zurückgegeben wird.

3. Was passiert, wenn ich ein Makro mit Function beginne?
Das Makro wird nicht im Fenster "Makro ausführen" angezeigt, da es als Funktion behandelt wird. Wenn Du ein unsichtbares Makro benötigst, kannst Du Private Sub verwenden.

4. Wie kann ich sicherstellen, dass meine Funktion in Excel verwendet werden kann?
Stelle sicher, dass Deine Function als Public deklariert ist und sich in einem allgemeinen Modul befindet.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige