web-dev-qa-db-fra.com

But de l'utilisation de sous-routines sur des fonctions

Je travaille avec Access depuis un moment maintenant, et bien que je comprenne l’avantage évident d’une fonction sur un sous-marin, c’est-à-dire qu’elle peut renvoyer des valeurs, je ne sais pas trop pourquoi je devrais utiliser un sous-marin. une fonction. Après tout, sauf erreur de ma part; Les fonctions peuvent faire tout ce que les sous-marins peuvent faire?

Remarque: je suis tout à fait conscient de la façon d'utiliser les sous-fonctions et les fonctions afin de ne pas chercher à expliquer leur fonctionnement.

12
Matt Donnan

La principale différence n'est pas seulement la valeur de retour, il semble que les sous-programmes sont plus rapides que les fonctions (Au moins dans .net), car le code MSIL de ces sous-programmes est beaucoup plus court lorsqu'aucune valeur n'est renvoyée. donc, les sous-marins sont globalement plus rapides lorsqu'aucune valeur n'est renvoyée. oh, je viens de trouver une excellente source pour cela (parle de .net), peut-être aimeriez-vous en savoir plus à ce sujet- Functions vs. Subroutines

8
TheNewOne

En termes de performance, cela ne serait pas un problème important ici. 

La principale différence est que la fonction définie par l'utilisateur peut être utilisée dans une expression dans votre code, alors qu'un sous-groupe ne le peut pas. 

C'est vraiment un énorme Mont Everest d'une différence ici.

Cette différence ne se limite pas vraiment à Access, mais s’applique à tous les langages de programmation et systèmes auxquels je peux penser qui prennent en charge la création de fonctions définies par l’utilisateur.

L’avantage principal de l’utilisation de la fonction définie est BEAUCOUP, mais le problème le plus élémentaire est que cette fonction peut être utilisée dans EXPRESSIONS.

Par exemple, lorsque vous cliquez sur un bouton d'un formulaire, vous pouvez généralement associer une seule routine [Code d'événement] VBA à ce bouton. 

Cependant, vous pouvez aussi placer une expression dans la feuille de propriétés comme ceci:

=MyUserFunction()

Ce qui précède est une astuce utile, car vous pouvez alors mettre en surbrillance 10 contrôles sur un formulaire et taper l’expression ci-dessus et vous venez d’attribuer la fonction ci-dessus à ces 10 boutons. Vous ne pouvez pas faire ce qui précède avec un sous-marin.

Une autre différence significative est que vous pouvez utiliser une fonction en tant que source de données (expression) pour une zone de texte d'un formulaire ou d'un rapport (là encore, vous ne pouvez pas le faire avec un sous-objet). 

Une autre différence significative est que vous pouvez utiliser ces fonctions en SQL. C'est une capacité vraiment fantastique car vous pouvez alors avoir du code "exécuté" pour chaque ligne d'une requête. Et cela signifie que vous pouvez étendre les capacités et les fonctionnalités de SQL.

Et vous pouvez même utiliser cette idée pour afficher une variable VBA dans une requête sql, car vous créez simplement une fonction publique qui renvoie la variable VBA et cela peut être utilisé dans une requête. Vous ne pouvez cependant pas utiliser de variables VBA dans une requête!

Et cette extension de SQL ouvre des idées sans fin:

Je peux donc créer une fonction publique appelée ToMorrow ()

Public Function Tomorrow() as date

   Tomorrow() = date() + 1

End Function.

Maintenant, dans le constructeur de requêtes, je peux aller:

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

Et vous pouvez même faire des conversions personnalisées telles que:

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

La lecture de la température quotidienne ci-dessus pourrait être en Fahrenheit et vous devez simplement définir une fonction publique appelée Celsius comme ceci:

Public Function Celsius(Temperature As Variant) As Variant

   Celsius = (Temperature * 1.8) + 32

End Function

Maintenant, bien que la fonction ci-dessus soit simple, elle pourrait traiter un ensemble complexe d'enregistrements en utilisant un algorithme complexe pour déterminer l'humidité au-dessus d'un pot de fleur en fonction de la température et de l'humidité.

Donc, une fois que nous définissons une telle fonction publique, le concept clé est qu'une telle fonction peut être utilisée non seulement dans le code VBA en tant qu'expression, mais ALSO peut être utilisée assez étonnamment, cette capacité inclut SQL. 

Donc même dans le code, vous pouvez aller:

If MyCustomfucntion(SomeVar) = lngTestValue then

De nouveau dans ce qui précède, vous ne pouvez pas utiliser de sous-expressions dans les expressions VBA. 

Et encore plus intéressant, lorsque vous utilisez du code XML personnalisé pour des rubans dans Access, si vous utilisez une expression function () pour l'attribut "on action", vous évitez ainsi les rappels par ruban. Encore mieux, le ruban appelle ces fonctions () dans le formulaire actuel, et non un module de code public comme vous le feriez pour les rappels par ruban.

Je pourrais probablement taper dessus pendant plus de 10 pages sur la différence, mais je pense que cela commencerait à être redondant et je ne veux pas paraître condensé de quelque manière que ce soit ici.

Ainsi, la différence fondamentale entre une sous-fonction et une fonction dans VBA ou dans la plupart des langages de programmation est sensiblement la même.

Et les avantages d'utiliser une fonction dans Access ou n'importe quel langage de programmation sont également les mêmes. Par exemple, je peux définir une fonction définie par l'utilisateur dans t-sql (scalaire) - et encore une fois, vous êtes libre d'utiliser cette fonction t-sql dans n'importe lequel de votre code t-sql ou même des quires que vous créez et utilisez pour le serveur SQL.

Il s’agit donc d’une différence simple et fondamentale entre une sous-fonction et une fonction, et j’ose dire que ceux qui ont écrit du code informatique, dans presque tous les langages de programmation, réaliseront instantanément les différences significatives et utiles ci-dessus entre une sous-routine et une fonction.

11
Albert D. Kallal

Cependant, je ne suis pas absolument sûr que les sous-programmes sont plus rapides que les fonctions car les variables d'un sous-programme sont définies lors de la création du sous-programme et sont accessibles en référençant l'emplacement de la mémoire. Les fonctions doivent allouer de l’espace mémoire à chaque accès. 

Les sous-programmes modifient les variables du code appelant et les fonctions les laissent intactes. Ainsi, un sous-programme peut fournir plusieurs informations modifiées au code appelant (autant de modifications qu'il y a de variables, y compris les tableaux), mais une fonction ne peut fournir qu'une réponse à la fois pour les valeurs qui lui sont transmises. En raison de cette différence, s'il est important qu'une variable d'un sous-programme ne modifie pas sa valeur, vous devez affecter la valeur à une variable temporaire définie dans le sous-programme lui-même.

1
Doug R.

FWIW (ma théorie;) -

Permet de penser au monde réel pour comprendre cela.

Disons que vous voulez faire quelque chose. Il y a (au moins) 2 façons de le faire. 

Premièrement, envoyez des demandes d’informations aux assistants qui reviendront avec les informations pour vous. vous gardez donc le contrôle, c’est-à-dire que toutes les informations vous parviennent et que vous décidez quoi faire, le cas échéant. il s’agit plus d’un environnement contrôlé centralement. c'est l'essence de la 'fonction' dans vba

Deuxièmement, divisez le travail en tâches distinctes et attribuez à vos assistants la responsabilité de terminer la tâche pour vous, c'est-à-dire que le travail réel est effectué ici par des assistants, par opposition à la simple collecte d'informations. C'est l'essence même de 'sub' in vba.

Alors pensez à quoi faire si le code casse. avec les appels de fonction, vous vous concentrez sur la commande centrale pour rechercher la raison de l'échec. Avec les appels de sous-traitants, vous devez vous rendre dans le travail de chaque sous-locataire et découvrir ce qu'ils ont mal fait.

Bien sûr, vous pouvez gâcher le but et faire en sorte que les fonctions fonctionnent et que les sous-marins obtiennent simplement des informations, mais ce serait vraiment déroutant lorsque les choses se cassent! Oh, mais vous ne pouvez pas faire cela, lisez ce lien - http://www.cpearson.com/Excel/differen.htm , qui indique qu'Excel interdit de modifier les valeurs des cellules et les sous-appels appelés à partir de cellules.

1
csr

Oui, une fonction est simplement un sous-élément qui renvoie une valeur.

1
E Smith

Vous remarquerez que les événements sont toujours des sous-programmes, jamais des fonctions. Cependant, dans MS Access, il peut être utile de créer des fonctions lorsque vous souhaitez les utiliser comme propriété d'un événement:

On Close: = MyCloseFunction()

Les abonnés peuvent renvoyer une valeur ByRef .

0
Fionnuala