就性能而言,这不会是任何重大问题。
主要区别在于用户定义的函数可以在代码中的表达式中使用,而 sub 则不能。
这确实是一座巨大的珠穆朗玛峰。
这种差异实际上并不限于 Access,但往往适用于我能想到的支持创建用户定义函数的每种编程语言和系统。
使用定义函数的主要优点有很多,但最基本的问题是此类函数可以在表达式中使用。
例如,在表单上按钮的单击设置中,通常可以将单个 VBA [事件代码] 例程附加到该按钮。
但是,您还可以在属性表中放置一个表达式,如下所示:
=MyUserFunction()
上面是一个方便的提示,从此您可以突出显示表单上的 10 个控件,然后输入上面的表达式,然后您只需将上面的功能分配给这 10 个按钮。您无法使用 sub 执行上述操作。
另一个显着区别是您可以使用函数作为表单或报表上文本框的数据源(表达式)(同样,您不能使用子函数来执行此操作)。
另一个显着区别是您可以在 SQL 中使用这些函数。这是一个真正奇妙的能力,因为这样您就可以为查询的每一行“运行”代码。这意味着您可以扩展 SQL 的能力和功能。
您甚至可以使用这个想法在 sql 查询中显示 VBA 变量,因为您只需构建一个返回 VBA 变量的公共函数,并且可以在查询中使用它 - 但是您不能在查询中使用 VBA 变量!
SQL 的这种扩展开启了无尽的想法:
所以我可以构建一个名为 ToMorrow() 的公共函数
Public Function Tomorrow() as date
Tomorrow() = date() + 1
End Function.
现在在查询生成器中,我可以执行以下操作:
Select FirstName, lastName, Tomorrow() as NextDay from tblCustomers
您甚至可以进行自定义转换,例如:
Select FirstName, LastName, Celsius([DailyGreenHouseTemp]) from tblGreenHouse.
上面的每日温度读数可以用华氏度表示,您只需定义一个名为摄氏度的公共函数,如下所示:
Public Function Celsius(Temperature As Variant) As Variant
Celsius = (Temperature * 1.8) + 32
End Function
虽然上述函数很简单,但它可以执行复杂的记录集处理复杂的算法,以根据温度和湿度确定花盆上方的湿度。
因此,一旦我们定义了这样一个公共函数,那么关键的概念是这样的函数不仅可以在VBA代码中用作表达式,而且还可以使用令人惊奇的这种能力包括SQL。
因此,即使在代码中,您也可以:
If MyCustomfucntion(SomeVar) = lngTestValue then
同样,在上面,您不能在 VBA 表达式中使用 sub。
更有趣的是,当在 Access 中使用功能区的自定义 XML 时,如果您对“on action”属性使用 function() 表达式,则可以避免功能区回调的需要。更好的是,功能区将以当前形式调用这些函数(),而不是像您必须使用功能区回调那样的公共代码模块。
我可能还可以再写 10 多页来了解差异,但我认为这会变得多余,而且我不想在这里以任何方式显得压缩。
因此,VBA 中或实际上大多数编程语言中的子函数和函数之间的基本区别非常相似。
使用 Access 或几乎任何编程语言中的函数的好处也大致相同。例如,我可以在 t-sql(标量)中定义一个用户定义的函数,然后您可以在任何 t-sql 代码中自由使用该 t-sql 函数,甚至可以要求您为 sql server 创建和使用。
因此,这是子程序和函数之间基本且简单的区别,我敢说那些使用任何编程语言编写计算机代码的人都会立即意识到子例程和函数之间的上述显着且有用的区别。