一、概念

Sub 过程 是由 Sub 和 End Sub 语句Visual Basic的一系列 子语句,这些语句执行操作但不返回值。

Function 过程(一般称作函数) 是一系列由 Function 和 End Function 语句包含 的语句。 Function 过程类似于 Sub 过程,但函数也可以返回值。

二、区别

Function Sub
定义(无参数) ```vbnet

Public Function sayHello() MsgBox (“Hello World!”) End Function

  1. | ```vbnet
  2. Public Sub sayHello()
  3. MsgBox ("Hello World!")
  4. End Sub

| | 定义(有参数) | ```vbnet Public Function sayHello(msg) MsgBox (msg) End Function

 | ```vbnet
Public Sub sayHello(msg)
    MsgBox (msg)
End Sub

| | 调用 | 可在其他函数、过程中调用```vbnet Public Function work() saySomething (“Hello World”) cleanTable End Function

Public Function saySomething(msg) MsgBox (msg) End Function

Public Function cleanTable() MsgBox (“桌面已经收拾完了”) End Function

 | 可在其他函数、过程中调用```vbnet
Public Sub work()
    Call saySomething("Hello World")
    Call cleanTable
End Sub


Public Sub saySomething(msg)
    MsgBox (msg)
End Sub

Public Sub cleanTable()
    MsgBox ("桌面已经收拾完了")
End Sub

可在“宏”中调用
image.png | | 是否有返回值 | 有```vbnet ‘尝试运行一下代码,查看d的值 Public Sub calc() Dim d As Integer

Let d = add(1, 3)

MsgBox (d)

End Sub

Public Function add(a, b) As Integer Dim c As Integer Let c = a + b

add = a + b

End Function

 | 无 |
| 是否有返回值的理解 | “狗,去吧垃圾叼到垃圾桶里,之后过来跟我叫两声代表你完成了任务。” | “狗,去吧垃圾叼到垃圾桶里。” |

<a name="ivPsC"></a>
## 三、Public与Private的作用
<a name="tUHKW"></a>
## ![image.png](https://cdn.nlark.com/yuque/0/2022/png/1318699/1650119648289-40cc0fb7-13b6-4426-aa9d-f83ba1460930.png#clientId=uaf5f45bf-ad43-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=197&id=u54931256&margin=%5Bobject%20Object%5D&name=image.png&originHeight=197&originWidth=238&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3332&status=done&style=none&taskId=uf655f760-d2d8-487f-b3fa-bd7791ae3bf&title=&width=238)
了解`Public`与`Private`前,我们先了解一下我们的代码可以写在哪些地方:

- `Sheet1`:我们会有`Sheet1`、`Sheet2`等`Sheet`,写在其中的`VBA`代码只支持在各自的`Sheet`中使用。
- `ThisWorkbook`:一个工作簿仅有一个,写的其中的代码可在所有Sheet中使用。
- `模块`:会有多个`模块`,如`模块1`、`模块2`等,写在其中的代码可以在`Sheet`与`ThisWorkboox`中使用。

在`Function`与`Sub`中,可以用`Public`与`Private`指定其作用域(即对谁可见,`Public`指谁都可以看;`Private`是私有的,只有内部成员可以看),可通过以下例子进行了解(以下例子写在模块中):
```vbnet
Public Function sayHi1()
    MsgBox ("我是公开的,谁都可见")
End Function

Private Function sayHi2()
    MsgBox ("我是私有的,只对内部可见")
End Function


Public Function sayHi3()
    MsgBox ("我属于内部人员,我可以调用内部的私有函数。但我本身是公开的,可以被其他人调用。接下来我要调用sayHi2了")
    sayHi2
End Function

之后通过在Sheet或ThisWorkbook测试其区别:

Public Sub sayHello()
    sayHi1
    'sayHi2
    'sayHi3
End Sub
  • 可以运行sayHi1,因为sayHi1Public
  • 不可以运行sayHi2,因为sayHi2Private
  • 可以运行sayHi3,因为sayHi3Public的;sayHi3可以调用sayHi2,因为sayHi3sayHi2来说不是“外人”

    问题

  1. Function和Sub哪一个有返回值?
  2. Function和Sub如何定义与调用?

    参考

  3. 在 VBA (编写 Function) | Microsoft Docs

  4. 在 VBA (编写 Sub) | Microsoft Docs

如果你喜欢我的文章,欢迎来给我买咖啡,而且还可以买不止一杯。
1648650243435.png1648650243428.jpg
捐赠支持作者!