# Sub..end sub

sub..end sub 控制语句用于定义可从 call 语句中调用的子例程。

语法：

Sub name [ ( paramlist )] statements end sub

自变量将复制到子例程，而如果 call 语句中相应实际参数是变量名，则退出子例程时这些参数将再次从现有子例程中复制回来。

如果子例程通过 call 语句调用的形式参数比实际参数多，额外的形式参数将初始化为 NULL 值，且可在子例程中用作局部变量。

由于 sub 语句是控制语句，并以分号或行尾结束，两个可能子句（sub 和 end sub）中任意一个子句都不得跨越行边界。

参数：

Sub 参数

| 参数 | 说明 |
| --- | --- |
| name | 子例程的名称。 |
| paramlist | 子例程形式参数变量名列表的逗号分隔符列表。这些可用作子例程内的任意变量。 |
| statements | 一个或多个 QlikView 脚本语句的任意组。 |

示例 1:

`Sub INCR 
 (I,J)` `I = I + 
 1` `Exit Sub 
 when I < 10` `J = J + 
 1` `End Sub` `Call INCR 
 (X,Y)`

示例 2: - 参数传递

`Sub ParTrans 
 (A,B,C)` `A=A+1` `B=B+1` `C=C+1` `End Sub` `A=1` `X=1` `C=1` `Call ParTrans 
 (A, (X+1)*2)`

以上结果将在本地子例程内，A 将初始化为 1，B 将初始化为 4，C 将初始化为 NULL 值。

退出子例程时，全局变量 A 会将 2 作为值（从子例程复制回来）。第二个实际参数 “(X+1)\*2” 不会复制回来，因为其不是变量。最终，全局变量 C 不会受到子例程调用的影响。

## 了解详情

* [Call](https://help.qlik.com/zh-CN/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptControlStatements/Call.htm)
* [Exit](https://help.qlik.com/zh-CN/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptControlStatements/Exit.htm)
* [End](https://help.qlik.com/zh-CN/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptControlStatements/End.htm)