在函数上使用子例程的目的

Mat*_*nan 13 ms-access access-vba

我已经使用Access一段时间了,虽然我理解一个函数对Sub的明显好处,但是它可以返回值,因此我不确定为什么我应该使用Sub over一个功能.毕竟,除非我弄错了; 功能可以完成Subs可以做的一切吗?

注意:我完全知道如何使用Sub和Function,所以不要寻找它们如何工作的解释.

Alb*_*lal 12

在性能方面,这不是任何重大问题.

主要区别在于用户定义的函数可以在代码中用于表达式,而子函数则不能.

这真是一个巨大的珠穆朗玛峰.

这种差异并不仅限于Access,而是倾向于应用于我能想到的支持创建用户定义函数的每种编程语言和系统.

使用定义函数的关键优势是很多,但最基本的问题是这样的函数可以在EXPRESSIONS中使用.

例如,在表单上按钮的单击设置中,通常可以将单个VBA [事件代码]例程附加到该按钮.

但是,您也可以在属性表中放置一个表达式,如下所示:

=MyUserFunction()
Run Code Online (Sandbox Code Playgroud)

以上是一个方便的提示,从那以后你可以突出显示窗体上的10个控件,并输入上面的表达式,你只需将上述功能分配给这10个按钮.你不能用sub做上面的事情.

另一个显着的区别是您可以将一个函数用作表单或报表上的文本框的数据源(表达式)(同样,您不能使用sub执行此操作).

另一个重要区别是您可以在SQL中使用这些函数.这是一个真正奇妙的能力,因为您可以为查询的每一行"运行"代码.这意味着您可以扩展SQL的功能和功能.

你甚至可以使用这个想法在sql查询中显示一个VBA变量,因为你只需构建一个返回VBA变量的公共函数,这可以在查询中使用 - 但是你不能在查询中使用VBA变量!

这种SQL扩展开辟了无穷无尽的想法:

所以我可以构建一个名为ToMorrow()的公共函数

Public Function Tomorrow() as date

   Tomorrow() = date() + 1

End Function.
Run Code Online (Sandbox Code Playgroud)

现在在查询构建器中,我可以去:

Select FirstName, lastName, Tomorrow() as NextDay from tblCustomers
Run Code Online (Sandbox Code Playgroud)

您甚至可以进行自定义转换,例如:

Select FirstName, LastName, Celsius([DailyGreenHouseTemp]) from tblGreenHouse.
Run Code Online (Sandbox Code Playgroud)

上面的每日温度读数可能在华氏温度,您只需要定义一个名为Celsius的公共函数,如下所示:

Public Function Celsius(Temperature As Variant) As Variant

   Celsius = (Temperature * 1.8) + 32

End Function
Run Code Online (Sandbox Code Playgroud)

现在虽然上述功能很简单,但它可以做复杂的记录集处理复杂的算法,以确定基于温度和湿度的花盆上方的水分.

所以一旦我们定义了这样一个公共函数,那么关键概念就是这样一个函数不仅可以用在VBA代码中作为表达式,而且ALSO可以用得足够惊人,这种能力包括SQL.

所以即使在代码中,你也可以去:

If MyCustomfucntion(SomeVar) = lngTestValue then
Run Code Online (Sandbox Code Playgroud)

再次在上面,您不能在VBA表达式中使用sub.

更有趣的是在Access中使用自定义XML作为功能区时,如果对"on action"属性使用function()表达式,则可以避免使用功能区回调.更好的是功能区将调用当前形式的那些函数(),而不是像你必须使用功能区回调那样的公共代码模块.

我可能可以输入另外10页以上的差异,但我认为这将开始是多余的,我不想在这里以任何方式出现凝聚.

因此,在VBA中或在大多数编程语言中,子和函数之间的基本区别是完全相同的.

在Access中使用函数或几乎任何编程语言的好处也大致相同.例如,我可以在t-sql(标量)中定义用户定义的函数 - 然后您可以在任何t-sql代码中自由使用该t-sql函数,甚至可以在sql server中创建和使用该qu-sql函数.

所以这是sub和function之间的基本和简单的区别,我敢说那些编写过计算机代码的人几乎可以在任何编程语言中立即实现子程序和函数之间的上述重要和有用的区别.

  • 感谢Albert,我非常感谢你花了很多时间来进一步解释这些差异.这可能取决于我的问题的措辞(如果是的话,我道歉)但我知道上述内容并且在这方面经验丰富(虽然我知道这对于任何可以接受这个帖子的人都是有用的信息)我知道功能是多么出色以及它们能够实现的可能性,我真正想要达到的目标是为什么"Sub"会成为更好的选择? (2认同)

小智 9

主要区别不仅在于返回值,似乎subs比函数更快(至少在.net中),因为当没有返回值时,subs的MSIL代码要短得多.所以当没有返回值时,整体潜艇会更快.哦,我刚刚找到了一个很好的来源(谈论.net),也许你想进一步阅读它 - 函数与子程序