excel - 子函数和函数之间的区别: what does "return a value" mean?

标签 excel vba function subroutine

我是一名 VBA(以及一般编程)菜鸟。我试图理解 VBA 中子例程和函数之间的根本区别。我阅读了各种网站/书籍,但没有一个清楚地说明这些概念是什么以及它们有何不同。

特别是,我到处都看到这样的解释:“子程序执行任务但不返回值”,但“函数返回要执行的任务的值”。

那么假设我编写了一个函数,它从 Excel 中的单元格中获取(数字)值并返回该值的两倍(在另一个单元格中)。我还可以编写一个执行相同操作的子程序:读取单元格的值,然后打印该值的两倍。那么为什么明明有返回值却说 sub 没有返回值呢?!

请帮助我理解这一点。

最佳答案

“返回”与“打印”不同。打印是向用户显示结果的过程;一般来说,程序不能使用打印值。另一方面,返回一个值是为了进一步处理;用户无法直接访问它。

与现实世界相比:子程序就像执行某个操作的命令;函数就像一个问题,为您提供一个可以进一步询问的答案。

假设您是一家建筑公司的工头,但您讨厌离开办公室。 “在南墙上安装一扇 window ”是一个命令——一个子程序。一个 worker 出去做这件事。或者“拍摄建筑物的照片,并将其展示给客户”。工头不会从中获得任何信息(除了确认 worker 已完成您要求的操作之外)。

另一方面,“建筑物旁边的树有多高?”、“还有水泥吗?”、“向客户询问照片并告诉我他的意见是什么”都给了工头一个信息。答案,领类可以据此做出进一步的决定。这就是函数。

如果您有一个可以计算宽度乘以高度的函数 AreaOfRectangle,那么您还可以有一个函数 AreaOfRectangleBox 来向 AreaOfRectangle 询问盒子的正面、左侧和顶面的面积,分别加倍(因为背面、右侧和底面相同)并将它们加在一起,返回矩形盒子的面积。用户仍然不知道该数字是什么,但程序知道。

如果您有一个子例程 AreaOfRectangle,并且它显示屏幕上的宽度乘以高度,则您无法在程序的其余部分中使用此知识,因为 AreaOfRectangle不向程序返回任何信息(除了它已完成其正在执行的操作这一事实)。


在某些编程语言中,子例程具有修改其参数的能力,因此它不是那么千篇一律,但仍然有“返回”(到调用代码)和“打印”(到用户)之间的区别)保持相关性。此外,在某些语言中,子例程甚至不必报告它们何时完成(这些称为“异步”);但这也是很久以后的细节。

编辑:

returns double that value (in another cell)

Range("A2").Value = Range("A1").Value * 2 这样的东西不是“返回”。这是命令程序在单元格中存储一个值 - 概念上接近子例程(在某些语言中,它可能是一个子例程 - 类似于 SetAt(X, Y, Val) - 尽管是 VBA使用对 .Value 属性的赋值)。程序稍后可以查询该单元格中的值 - 概念上接近函数(在某些语言中,它实际上可能是一个函数 - 类似于 Val = GetAt(X, Y) - 尽管 VBA使用对 .Value 属性的简单访问)。

如果您在单元格中的公式内使用函数的返回值,例如 =DoubleThis(5),这实际上是正确的返回。但至关重要的是,这是一个公式,所以基本上它仍然属于代码领域,而不是用户领域。也可以写=DoubleThis(5)+7,返回值10会与7相加,得到总结果为 17。 (然后 Excel 接管并显示单元格值;但这不再是您的代码。)

有时人们使用这个词有些随意;但如果你是学习编程,就得严格区分这两种场景。

关于excel - 子函数和函数之间的区别: what does "return a value" mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71821214/

相关文章:

vba - "dim a"和 "dim a,b"之间的区别

Excel VBA - 当被调用的方法已经调用了另一个方法时,将控件返回给调用方法

excel - 如何在 Excel 中舍入小数列表,以使整数之和等于定义的总数?

excel - 如何在 Excel VBA 中将整数设为 null?

vba - 如何根据需要将焦点放在文本框上

python - 尝试创建函数以提取特殊字符之间的切片

ios - 在 "class func"方法中获取 Swift 类名

r - 修改 R 函数内的变量名和变量

excel - 通过单击 Excel VBA 中的上一个来创建一系列按钮

c# - 在 C# (VTSO) 中将 Excel FitToPagesWide 设置为 "Automatic"