web-dev-qa-db-de.com

Zweck der Verwendung von Subroutinen über Funktionen

Ich arbeite seit einiger Zeit mit Access, und obwohl ich den offensichtlichen Vorteil einer Funktion gegenüber einem Sub verstanden habe, war sie der Ansicht, dass sie als Ergebnis Werte zurückgeben kann. Ich bin mir nicht sicher, warum ich einen Sub vorziehen sollte eine Funktion. Immerhin, wenn ich mich nicht irre; Funktionen können alles, was Subs können?

Hinweis: Ich bin mir vollkommen bewusst, wie sowohl Subs als auch Functions verwendet werden, also suche ich nicht nach einer Erklärung, wie sie funktionieren.

12
Matt Donnan

Der Hauptunterschied ist nicht nur der Rückgabewert, es scheint, dass Subs schneller sind als Funktionen (Zumindest in .net), da der MSIL-Code von Subs viel kürzer ist, wenn kein Wert zurückgegeben wird. Insgesamt sind die Subs schneller, wenn kein Wert zurückgegeben wird. Oh, ich habe gerade eine großartige Quelle dafür gefunden (spricht über .net), vielleicht möchten Sie weiter über it- Functions vs. Subroutines lesen

8
TheNewOne

In Bezug auf die Leistung wäre dies hier kein bedeutendes Thema. 

Der Hauptunterschied besteht darin, dass eine benutzerdefinierte Funktion in einem Ausdruck in Ihrem Code verwendet werden kann, während dies als Sub nicht möglich ist. 

Dies ist wirklich ein riesiger Mount Everest, der hier einen Unterschied macht.

Dieser Unterschied ist nicht wirklich auf Access beschränkt, sondern gilt für jede Programmiersprache und jedes System, das mir einfällt, das die Erstellung benutzerdefinierter Funktionen unterstützt.

Der entscheidende Vorteil der Verwendung definierter Funktionen ist MANY, aber das grundlegende Problem ist, dass eine solche Funktion in EXPRESSIONS verwendet werden kann.

In einer Einstellung für das Klicken auf eine Schaltfläche in einem Formular kann beispielsweise eine einzelne VBA-Routine [Ereigniscode] an diese Schaltfläche angehängt werden. 

Sie können jedoch AUCH einen Ausdruck in das Eigenschaftsfenster einfügen:

=MyUserFunction()

Das obige ist ein praktischer Tipp, da Sie dann 10 Steuerelemente in einem Formular hervorheben und den obigen Ausdruck eingeben und den 10 Schaltflächen die obige Funktion zugewiesen haben. Sie können das oben nicht mit einem U-Boot tun.

Ein weiterer wesentlicher Unterschied ist, dass Sie eine Funktion als Datenquelle (Ausdruck) für ein Textfeld in einem Formular oder Bericht verwenden können (wiederum können Sie dies nicht mit einem Unterobjekt tun). 

Ein weiterer wesentlicher Unterschied ist, dass Sie diese Funktionen in SQL verwenden können. Dies ist eine wirklich fantastische Fähigkeit, denn dann kann Code für jede Zeile einer Abfrage ausgeführt werden. Dies bedeutet, dass Sie die Fähigkeiten und Funktionen von SQL erweitern können.

Sie können diese Idee sogar verwenden, um eine VBA-Variable in einer SQL-Abfrage anzuzeigen, indem Sie einfach eine öffentliche Funktion erstellen, die die VBA-Variable zurückgibt. Diese kann in einer Abfrage verwendet werden. In einer Abfrage können Sie jedoch keine VBA-Variablen verwenden.

Und diese Erweiterung von SQL eröffnet endlose Ideen:

So kann ich eine öffentliche Funktion namens ToMorrow () erstellen

Public Function Tomorrow() as date

   Tomorrow() = date() + 1

End Function.

Jetzt im Query Builder kann ich gehen:

Select FirstName, lastName, Tomorrow() as NextDay from tblCustomers

Sie können sogar benutzerdefinierte Konvertierungen vornehmen, z.

Select FirstName, LastName, Celsius([DailyGreenHouseTemp]) from tblGreenHouse.

Die obigen täglichen Temperaturwerte können in Fahrenheit angegeben werden, und Sie müssen einfach eine öffentliche Funktion namens Celsius definieren:

Public Function Celsius(Temperature As Variant) As Variant

   Celsius = (Temperature * 1.8) + 32

End Function

Während die obige Funktion nun einfach ist, könnte sie einen komplexen Datensatzsatz verarbeiten, der einen komplexen Algorithmus verarbeitet, um die Feuchtigkeit über einem Blumentopf basierend auf Temperatur und Feuchtigkeit zu bestimmen.

Wenn wir also eine solche öffentliche Funktion definieren, kann das Schlüsselkonzept darin bestehen, dass eine solche Funktion nicht nur in VBA-Code als Ausdruck verwendet werden kann, sondern auch in erstaunlicher Weise, dass diese Fähigkeit SQL enthält. 

Also auch im Code kannst du gehen:

If MyCustomfucntion(SomeVar) = lngTestValue then

Auch hier können Sie kein Sub in VBA-Ausdrücken verwenden. 

Noch interessanter ist die Verwendung von benutzerdefiniertem XML für Ribbon in Access. Wenn Sie einen function () - Ausdruck für das Attribut "on action" verwenden, können Sie die Notwendigkeit für Ribbon-Rückrufe vermeiden. Noch besser ist, dass die Multifunktionsleiste diese Funktionen () in der aktuellen Form aufruft, und nicht ein öffentliches Codemodul, wie Sie es bei Ribbon-Rückrufen MÜSSEN.

Ich könnte wahrscheinlich für weitere 10 Seiten über den Unterschied tippen, aber ich denke, das würde überflüssig werden, und ich möchte hier in keiner Weise kondensierend wirken.

Der grundlegende Unterschied zwischen einem Sub und einer Funktion in VBA oder in den meisten Programmiersprachen ist also ziemlich gleich.

Die Vorteile der Verwendung einer Funktion in Access oder einer beliebigen Programmiersprache sind auch sehr ähnlich. Zum Beispiel kann ich eine benutzerdefinierte Funktion in t-sql (scalar) definieren - und Sie können diese t-sql-Funktion dann auch in Ihrem t-sql-Code oder in Quires verwenden, die Sie für den SQL-Server erstellen und verwenden.

Dies ist also ein grundlegender und einfacher Unterschied zwischen einem Unterprogramm und einer Funktion, und ich wage zu behaupten, dass diejenigen, die Computercode geschrieben haben, in fast jeder Programmiersprache die oben genannten signifikanten und nützlichen Unterschiede zwischen einem Unterprogramm und einer Funktion sofort erkennen werden.

11

Ich bin nicht absolut sicher, aber ich denke, Subs sind schneller als Funktionen, da die Variablen einer Subroutine beim Erstellen der Subroutine definiert werden und auf sie durch Bezugnahme auf den Speicherplatz zugegriffen wird. Funktionen müssen bei jedem Zugriff Speicherplatz zuweisen. 

Unterprogramme ändern die Variablen im aufrufenden Code, und Funktionen lassen sie unangetastet. Eine Subroutine kann also mehrere modifizierte Informationen zum aufrufenden Code bereitstellen (so viele Änderungen wie es Variablen gibt, einschließlich Arrays), aber eine Funktion kann jeweils nur eine Antwort für die Werte liefern, die an sie übergeben werden. Wenn es wichtig ist, dass eine Variable in einer Subroutine ihren Wert nicht ändert, muss dieser Wert einer temporären Variablen zugewiesen werden, die in der Subroutine selbst definiert ist.

1
Doug R.

FWIW (meine Theorie;) -

Denken wir an die reale Welt, um das zu verstehen.

Nehmen wir an, Sie möchten etwas erledigen. Es gibt (mindestens) zwei Möglichkeiten, dies zu tun. 

Senden Sie zunächst Informationsanfragen an die Helfer, die diese zusammen mit den Informationen für Sie zurücksenden. So behalten Sie die Kontrolle, dh alle Informationen fließen zu Ihnen zurück und Sie entscheiden, was als Nächstes zu tun ist. Dies ist eher die zentral gesteuerte Umgebung. Dies ist das Wesentliche von 'Funktion' in vba

Zweitens, teilen Sie die Arbeit in getrennte Aufgaben auf und weisen Sie Ihren Helfern die Verantwortung zu, um die Aufgabe für Sie zu erledigen, dh die eigentliche Arbeit wird von Helfern ausgeführt, im Gegensatz zum bloßen Sammeln von Informationen. Dies ist die Essenz von 'sub' in vba.

Überlegen Sie sich also, was zu tun ist, wenn der Code bricht. Bei Funktionsaufrufen konzentrieren Sie sich auf den zentralen Befehl, um die Ursache des Fehlers zu ermitteln. Bei Unteraufrufen müssen Sie sich mit der Arbeit jedes Subs beschäftigen und herausfinden, was sie falsch gemacht haben.

Natürlich können Sie den Zweck vermasseln und Funktionen ausführen lassen, und Subs erhalten nur Informationen, aber das wäre wirklich verwirrend, wenn Dinge kaputt gehen! Oh, aber Sie können das nicht tun, lesen Sie diesen Link - http://www.cpearson.com/Excel/differen.htm , der besagt, dass Excel Funktionen verbietet, die Zellwerte ändern und Subs aus Zellen aufgerufen werden.

1
csr

Ja, eine Funktion ist nur ein Sub, der einen Wert zurückgibt.

1
E Smith

Sie werden feststellen, dass Ereignisse immer Subs sind und niemals funktionieren. In MS Access kann es jedoch hilfreich sein, Funktionen zu erstellen, wenn Sie sie als Eigenschaft eines Ereignisses verwenden möchten:

On Close: = MyCloseFunction()

Subs können einen Wert ByRef zurückgeben.

0
Fionnuala