LibreOffice Basic属于Basic语言家族。
一、约定
libreoffice basic是一种解释语言,它先检查代码是否有明显错误,然后逐行执行代码。
libreoffice basic程序中的每一行都是一个独立的单元。函数调用、表达式等元素必须在各自开始的那一行中完成。
(一)如果行过长,可通过添加下划线 _ 将几个行链接起来。
如下例:
LongExpression = (Expression1 * Expression2) + _
(Expression3 * Expression4) + _
(Expression5 * Expression6) + _
(Expression7 * Expression8)
下划线必须始终是链接行的最后一个字符,后面不能带有空格或制表符,否则,代码将会产生错误。
(二)除了将各行链接起来以外,还可以使用冒号将一行拆分为几段。
a = 1
a = a + 1
a = a + 1
可以写成:
a = 1 : a = a + 1 : a = a + 1
二、注释
两种注释的方法:
1.单引号后面的所有字符都被视为注释:
Dim A ' This is a comment for variable A
2.关键字Rem后跟注释:
Rem This comment is introduced by the keyword Rem.
如果注释占据几行,则必须将每一行都标识为注释
三、标识符
也叫标记。
标记是变量、常量、函数等的名称。在选择标记名称时,遵循以下规则:
-
标记只能包含拉丁字母、数字和下划线 (_)。
-
标记的第一个字符必须是字母或下划线。
-
标记不能包含特殊字符,例如 ä â î ß。
-
标记的最大长度为255个字符。
-
不区分大小写字符。例如,OneTestVariable、onetestVariable、ONETESTVARIABLE相同。不过,此规则有一个例外情况:UNO-API常量区分大小写。
四、使用变量
(一)定义
1.隐式变量声明
直接使用就可以创建变量,而无需显式声明。换句话说,在将变量包含在代码中的那一刻起,该变量就已存在。
以下示例声明三个新变量:
a = b + c
隐式声明变量不是一个很好的编程习惯,因为它可能由于键入错误而无意中引入新变量。对于键入错误,解释程序并不会生成错误消息,而只是将其初始化为一个值为0的新变量。很难在代码中发现这类错误。
2.显式变量声明
为了防止隐式声明产生的错误,在代码第一行中写入下面语句,这样在使用未声明变量时就会报错,必须显式声明变量。
Option Explicit
(1)最简单的显式变量声明形式如下:
Dim MyVar
本示例声明了一个变量,其名称为MyVar,类型为variant。变体 (variant) 是一种通用变量,可以记录所有类型的值,其中包括字符串、整数、浮点数和布尔值。
下面是变体变量的几个示例:
MyVar = "Hello World" ' Assignment of a string
MyVar = 1 ' Assignment of a whole number
MyVar = 1.0 ' Assignment of a floating point number
MyVar = True ' Assignment of a Boolean value
(2)限定类型的变量声明:
Dim MyVar As Integer ' Declaration of a variable of the integer type
该变量被声明为整型,可以记录整数值。也可以使用以下格式声明整型变量:
Dim MyVar% ' Declaration of a variable of the integer type
(3)可以声明多个变量:
Dim MyVar1, MyVar2
如果要将变量指定为某种永久类型,必须为每个变量单独指定类型:
Dim MyVar1 As Integer, MyVar2 As Integer
如果未声明变量类型,Basic则会将该变量指定为变体类型。例如,在下面的变量声明中,MyVar1是一个变体,而MyVar2则是一个整数:
Dim MyVar1, MyVar2 As Integer
(二)变量类型
1.字符串
一个字符串变量最多可以存储65535个字符。
在内部,LibreOffice Basic保存每个字符的Unicode值。
(1)字符串变量
Dim Variable As String
也可以将此声明写成:
Dim Variable$
(2)字符串字面量
字符串字面量要放在双引号 (") 中。
Dim MyString As String
MyString = " This is a test"
要将字符串字面量拆分为两行,请在第一行末尾添加一个&号:
Dim MyString As String
MyString = "This string is so long that it " & _
"has been split over two lines."
要在字符串字面量中包含双引号 ("),请在相关位置输入双引号两次:
Dim MyString As String
MyString = "a ""-quotation mark." ' produces a "-quotation mark
2.数字
支持五种处理数字的基本类型:
-
整型
-
长整型
-
单精度型
-
双精度型
-
货币型
(1)数字变量
a.整型变量
整型变量可以存储介于 -32768 和 32767 之间的任意整数。
一个整型变量最多可占用两字节的内存。
整型变量的类型声明符号为 %。
如果将浮点数赋值给整型变量,则会将该数字四舍五入为最接近的整数。
整型变量的声明示例:
Dim Variable As Integer
Dim Variable%
b.长整型变量
长整型变量可以存储介于 –2147483648 和 2147483647 之间的任意整数。
一个长整型变量最多可占用四字节的内存。
长整型变量的类型声明符号为 &。
如果将浮点数赋值给长整型变量,则会将该数字四舍五入为最接近的整数。
长整型变量的声明示例:
Dim Variable as Long
Dim Variable&
c.单精度型变量
单精度型变量可以存储介于 3.402823 x 1038 和 1.401298 x 10-45 之间的任意正浮点数或负浮点数。
一个单精度型变量最多可占用四字节的内存。
单精度型变量的类型声明符号为 !。
最初,使用单精度型变量是为了减少更精确的双精度型变量所需的计算时间。不过,由于不再考虑这些速度问题,因而大大减少了对单精度型变量的需求。
单精度型变量的声明示例:
Dim Variable as Single
Dim Variable!
d.双精度型变量
双精度型变量可以存储介于 1.79769313486232 x 10308 和 4.94065645841247 x 10-324 之间的任意正浮点数或负浮点数。
一个双精度型变量最多可占用八字节的内存。
双精度型变量非常适于精确计算。
类型声明符号为 #。
双精度型变量的声明示例:
Dim Variable As Double
Dim Variable#
e.货币型变量
货币型变量处理值的方式与其他变量类型有所不同。小数点是固定的,后面带有四位小数。该变量的小数点之前最多可以包含15个数字。
货币型变量可以存储介于 -922337203685477.5808 和 +922337203685477.5807 之间的任意值,最多可占用八字节的内存。
货币型变量的类型声明符号为 @。
货币型变量主要用于商业计算,由于使用了浮点数,因此会产生无法预测的舍入误差。
货币型变量的声明示例:
Dim Variable As Currency
Dim Variable@
f.浮点
单精度型、双精度型和货币型通常统称为浮点或浮点数类型。
浮点数类型的数值可以包含不同长度的小数,它们也因此而得名:小数点似乎可以在数字中“浮动”。
您可以声明浮点类型的变量。实际的变量类型(单精度型、长整型和货币型)是在为变量赋值时确定的:
Dim A As Float
A = 1210.126
(2)数字字面量
可以使用多种方式表示数字,例如,使用十进制格式或科学计数法,甚至使用十进制系统以外的其他基数表示。
a.整数
最简单的方法是使用整数。
Dim A As Integer
Dim B As Float
A = 1210
B = 2438
可以在这些数字前面加上正号 (+) 或负号 (-)(数字与符号之间可以有空格,也可以没有空格):
Dim A As Integer
Dim B As Float
A = + 121
B = - 243
b.小数
在键入小数时,请使用小数点号 (.) 作为小数点。
Dim A As Integer
Dim B As Integer
Dim C As Float
A = 1223.53 ' is rounded
B = - 23446.46 ' is rounded
C = + 3532.76323
也可以在小数前面加上正号 (+) 或负号 (-)(空格同样可有可无)。
如果将一个小数赋值给整型变量,会将该数字四舍五入。
指数书写样式
例如,可以将数字1.5 x 10-10 (0.00000000015) 写成 1.5e-10。字母 "e" 可以是小写,也可以是大写,并且前面的正号 (+) 可有可无。
下面是用指数格式表示数字的几个正确和错误示例:
Dim A As Double
A = 1.43E2 ' Correct
A = + 1.43E2 ' Correct (space between plus and basic number)
A = - 1.43E2 ' Correct (space between minus and basic number)
A = 1.43E-2 ' Correct (negative exponent)
A = 1.43E -2 ' Incorrect (不能有空格)
A = 1,43E-2 ' Incorrect (小数点必须是.)
A = 1.43E2.2 ' Incorrect (指数必须是整数)
请注意,在第一个和第三个错误示例中,即使变量返回错误的值,也不会生成错误消息。
表达式A = 1.43E -2被解释为1.43减去2,它对应于值 -0.57。不过,值1.43 x 10-2(对应于0.0143)才是目标值。
对于值A = 1.43E2.2会忽略小数点后面的指数部分,并将该表达式解释为A = 1.43E2
十六进制值
在十六进制系统(基数为16的系统)中,每两位数精确地对应于一个字节。这样,便可通过一种更接近于计算机体系结构的方式来处理数字。
在十六进制系统中,将数字0至9以及字母A至F用作数字。A表示十进制数10;而字母F表示十进制数15。
Basic允许使用十六进制整数值,但前提是前面带有 &H。
Dim A As Long
A = &HFF ' Hexadecimal value FF, corresponds to the decimal value 255
A = &H10 ' Hexadecimal value 10, corresponds to the decimal value 16
八进制值
Basic还可以识别八进制系统(基数为8的系统),该系统使用数字0至7。
您必须使用前面带有 &O 的整数。
Dim A As Long
A = &O77 ' Octal value 77, corresponds to the decimal value 63
A = &O10 ' Octal value 10, corresponds to the decimal value 8
3.布尔
布尔变量只能包含以下两个值之一:True 或 False。这些变量适用于只能采用两种状态之一的二进制规范。
在内部,将布尔值保存为两字节整型值,其中,0对应于False,而任何其他值对应于True。
布尔变量没有类型声明符号,只能使用补充的 As Boolean 进行声明。
布尔变量的声明示例:
Dim Variable As Boolean
4.日期
日期变量可以包含日期和时间值。
在保存日期值时,Basic使用一种内部格式,该格式允许对日期和时间值执行比较和数学运算。
日期变量没有类型声明符号。只能使用补充的 As Date 进行声明。
日期变量的声明示例:
Dim Variable As Date
5.数组
(1)一维数组
定义一个数组,数组名字后面跟一对括号,括号里可以指定数组的下限和上限。下限默认为零。
数组长度是上限减下限+1
以下两个语句等效。 每个语句都声明包含 21 个 Integer 个元素的数组。 访问数组时,索引可以在 0 到 20 之间变化。
Dim totals(20) As Integer
Dim totals(0 To 20) As Integer
在上面的示例中,数组的索引始终以0开始。也可以为数据字段声明指定一个包含起始值和最终值的有效性范围。
以下示例声明了一个包含六个整型值的数据字段,可以使用索引5至10对这些值进行寻址:
Dim MyInteger(5 To 10)
索引不必为正值。以下示例也是一个正确的声明:
Dim MyInteger(-10 To -5)
它声明了一个包含6个值的整型数据字段,可以使用索引 -10至 -5对这些值进行寻址。
在定义索引时,必须遵循以下三个限制:
-
可能的最小索引为 -32768。
-
可能的最大索引为32767。
-
最大元素数目为16368。
起始索引的指定值
默认起始索引是0。可以使用以下语句将默认起始索引更改为1:
Option Base 1
不过,此语句不影响通过API定义的UNO序列,其索引始终以0开始。要使程序更清晰,应避免使用Option Base 1。
如果使用 Option Base 1,数组中的元素数目不会受到影响,只有起始索引会发生变化。
Option Base 1
Dim MyInteger(3)
创建了4个整型变量,可以使用表达式 MyInteger(1)、MyInteger(2)、MyInteger(3) 和 MyInteger(4) 来描述这些变量。
与VBA不同,在libreoffice Basic中,表达式Option Base 1不影响数组中的元素数目。它只是使起始索引发生变化。 在VBA中,声明 MyInteger(3) 会创建索引为1至3的三个整型值;而在libreoffice Basic中,该声明会创建索引为1至4的四个整型值。通过使用 Option Compatible,libreOffice Basic可以像VBA一样运行。 |
(2)多维数组
除了单维数组之外,还支持多维数组。相应的维之间用逗号分隔。示例
Dim MyIntArray(5, 5)
定义了一个二维整型数组,每一维具有6个元素(可通过索引0至5进行寻址)。整个数组总共可记录6 x 6 = 36个整型值。
(3)数组长度动态改变
例如,可以定义一个数组,以包含所有A开头的单词。由于不知道单词的数目,因此,需要以后能够更改数组长度。为此,请使用以下语句:
ReDim MyArray(10)
与VBA中只能使用Dim MyArray()定义动态数组不同,在libreOffice Basic中,您可以使用ReDim更改静态和动态数组。 |
以下示例更改了数组长度,以便可以记录11或21个值:
Dim MyArray(4) As Integer ' Declaration with five elements
' ...
ReDim MyArray(10) As Integer ' Increase to 11 elements
' ...
ReDim MyArray(20) As Integer ' Increase to 21 elements
更改数组长度后,所有内容都将丢失。如果要保留原始值,请使用 Preserve:
Dim MyArray(10) As Integer
ReDim Preserve MyArray(20) As Integer
在使用 Preserve 时,请确保维数和变量类型保持不变。
在VBA中,只能通过 Preserve 更改数据字段最后一维的上限;而libreOffice Basic还允许您更改其他维。 |
(4)确定数组的最低和最高索引
LBound()和UBound()分别返回数组最低索引值和最高索引值。当数组更改了其长度时,这很有用。
Dim MyArray(10) As Integer
Dim n As Integer
n = 47
Redim MyArray(n) As Integer
MsgBox(LBound(MyArray)) ' displays : 0
MsgBox(UBound(MyArray)) ' displays : 47
对于多维数组,您需要指定索引的位置(1到n),您想知道允许的下限和上限值:
Dim MyArray(10, 13 to 28) As Integer
MsgBox(LBound(MyArray, 2)) ' displays : 13
MsgBox(UBound(MyArray, 2)) ' displays : 28
(5)空数组
不能为空数组赋值,因为它不包含任何元素。
Dim MyArray() As Integer
MsgBox(LBound(MyArray)) ' displays : 0
MsgBox(UBound(MyArray)) ' displays : -1
某些API函数返回包含元素的数组(从零开始索引)或返回空数组。UBound()用于检查数组是否为空。
(6)数组元素的读写
数组元素的值可以像这样赋值:
MyArray(0) = "somevalue"
访问数组中的值的工作方式如下:
MsgBox(MyArray(0))
示例
Sub TestArrayAxess
Dim MyArray(3)
MyArray(0) = "lala"
MsgBox("Value:" & MyArray(0))
End Sub
(三)变量作用域
1.局部变量
在函数或过程中声明的变量称为局部变量:
Sub Test
Dim MyInteger As Integer
End Sub
局部变量仅在执行函数或过程时有效,此后将被重置为零。每次调用函数时,以前生成的值将不再可用。
要保留以前的值,必须将变量定义为 Static:
Sub Test
Static MyInteger As Integer
' ...
End Sub
与VBA不同,libreOffice Basic可确保不会在模块标头中将局部变量名称同时用作全局变量和私有变量。在将VBA应用程序移植到libreOffice Basic时,必须更改所有重复的变量名称。 |
2.公共变量
公共变量是使用关键字 Dim 在模块标头部分中定义的。这些变量可用于其库中的所有模块:
模块A:
Dim A As Integer
Sub Test
Flip
Flop
End Sub
Sub Flip
A = A + 1
End Sub
模块B:
Sub Flop
A = A - 1
End Sub
Test 函数不会更改变量 A 的值,但 Flip 函数会将其增加1,而 Flop 函数会将其减少1。该变量的这些更改是全局性的。
也可以使用关键字 Public 声明公共变量:
Public A As Integer
公共变量仅在执行关联的宏时可用,此后将重置该变量。
3.全局变量
就功能而言,全局变量与公共变量类似,不同的是在执行关联的宏后仍会保留全局变量值。
全局变量是使用关键字 Global 在模块标头部分中声明的:
Global A As Integer
4.私有变量
Private 变量只能在定义它们的模块中使用。可以使用关键字 Private 定义这种变量:
Private MyInteger As Integer
如果几个模块包含名称相同的 Private 变量,libreOffice Basic将会在每次出现该名称时创建一个不同的变量。在以下示例中,模块 A 和 B 具有一个名为 C 的 Private 变量。Test 函数首先在模块 A 中设置 Private 变量,然后在模块 B 中设置 Private 变量。
模块A:
Private C As Integer
Sub Test
SetModuleA ' Sets the variable C from module A
SetModuleB ' Sets the variable C from module B
ShowVarA ' Shows the variable C from module A (= 10)
ShowVarB ' Shows the variable C from module B (= 20)
End Sub
Sub SetmoduleeA
C = 10
End Sub
Sub ShowVarA
MsgBox C ' Shows the variable C from module A.
End Sub
模块B:
Private C As Integer
Sub SetModuleB
C = 20
End Sub
Sub ShowVarB
MsgBox C ' Shows the variable C from module B.
End Sub
五、常量
常量是程序可以使用但不能更改的值。
1.定义常量
使用关键字 Const 来声明常量。
Const A = 10
还可以在声明中指定常量类型:
Const B As Double = 10
2.常量的作用域
常量具有与变量相同的作用域,但语法略有不同。模块标头中的 Const 定义可以在该模块中使用。要使该定义可用于其他模块,请添加 Public 关键字。
Public Const one As Integer = 1
六、运算符
1.数学运算符
数学运算符可以应用于所有数字类型;而运算符 + 还可以用于链接字符串。
+ | 数字和日期值的相加以及字符串链接 |
& | 字符串的串联 |
- | 数字和日期值的相减 |
* | 数字相乘 |
/ | 数字相除 |
\ | 数字相除且结果为整数(四舍五入) |
^ | 计算数字的幂 |
MOD | 模运算(计算除法的余数) |
注意:
尽管可以使用 + 运算符连接字符串,但在将数字连接到字符串时,Basic解释器可能会感到困惑。&运算符在处理字符串时更安全,因为它假定所有参数都应该是字符串,如果参数不是字符串,则将参数转换为字符串。
2.逻辑运算符
逻辑运算符用于按照布尔代数学规则链接元素。如果将这些运算符应用于布尔值,链接将直接提供所需的结果。如果将其与整型值和长整型值一起使用,则会在位级别进行链接。
AND | 与链接 |
OR | 或链接 |
XOR | 异或链接 |
NOT | 非 |
EQV | 相等测试(两个部分 True 或 False) |
IMP | 隐含(如果第一个表达式为true,则第二个表达式也为true) |
3.比较运算符
比较运算符可以应用于所有基本变量类型(数字、日期详细信息、字符串和布尔值)。
= | 数字、日期值和字符串相等 |
<> | 数字、日期值和字符串不相等 |
> | 数字、日期值和字符串的大于检查 |
>= | 数字、日期值和字符串的大于或等于检查 |
< | 数字、日期值和字符串的小于检查 |
<= | 数字、日期值和字符串的小于或等于检查 |
Apache OpenOffice Basic不支持VBA Like 比较运算符。 |
七、控制流程
(一)分支
1.If...Then...Else
最常用的分支语句是 If 语句,如以下示例所示:
If A > 3 Then
B = 2
End If
只有当变量 A 的值大于三时,才会进行 B = 2 赋值。
If/Else 子句是 If 语句的变体:
If A > 3 Then
B = 2
Else
B = 0
End If
在该示例中,当 A 大于3时,则将2赋值给变量 B,否则,将0赋值给 B。
要使用更复杂的语句,您可以级联 If 语句,例如:
If A = 0 Then
B = 0
ElseIf A < 3 Then
B = 1
Else
B = 2
End If
如果变量 A 的值等于零,则将0赋值给 B。如果 A 小于3(但不等于零),则将1赋值给 B。在所有其他情况下(即 A 大于或等于3),则将2赋值给 B。
2.Select...Case
Select...Case 指令可替代级联的 If 语句,它适用于需要根据各种条件来检查某个值的情况:
Select Case DayOfWeek
Case 1:
NameOfWeekday = "Sunday"
Case 2:
NameOfWeekday = "Monday"
Case 3:
NameOfWeekday = "Tuesday"
Case 4:
NameOfWeekday = "Wednesday"
Case 5:
NameOfWeekday = "Thursday"
Case 6:
NameOfWeekday = "Friday"
Case 7:
NameOfWeekday = "Saturday"
End Select
还可以在 Case 分支中指定比较运算符或表达式列表。以下示例列出了最重要的语法变体:
Select Case Var
Case 1 To 5
' ... Var is between the numbers 1 and 5
Case 6, 7, 8
' ... Var is 6, 7 or 8
Case Var > 8 And Var < 11
' ... Var is greater than 8 and less than 11
Case Else
' ... all other instances
End Select
(二)循环
1.For...Next
For...Next 循环具有固定的次数。循环计数器定义了循环要执行的次数。
在以下示例中,变量 I 是循环计数器,其初始值为1。每次循环结束时,计数器递增1。当变量I等于10时,循环停止。
Dim I
For I = 1 To 10
' ... Inner part of loop
Next I
如果要在每次循环结束时使循环计数器以1以外的值递增,请使用 Step 函数:
Dim I
For I = 1 To 10 Step 0.5
'... Inner part of loop
Next I
在上面的示例中,计数器在每次循环结束时递增0.5,该循环执行了19次。
也可以使用负的步进值 (Step):
Dim I
For I = 10 To 1 Step -1
' ... Inner part of loop
Next I
在本示例中,计数器从10开始,每次循环结束时递减1,直到计数器为1。
使用 Exit For 指令,您可以提前退出 For 循环。
在以下示例中,在第五次执行循环的过程中终止了循环:
Dim I
For I = 1 To 10
If I = 5 Then
Exit For
End If
' ... Inner part of loop
Next I
2.For Each
libreOffice Basic不支持VBA中的 For Each...Next 循环变体。与 For...Next 循环不同,For Each 循环不使用显式计数器。For Each 循环表示“对此集合中的所有内容执行此操作”,而不是“执行n次”。例如:
Const d1 = 2
Const d2 = 3
Const d3 = 2
Dim a(d1, d2, d3)
For Each i In a()
' ... Inner part of loop
Next i
3.Do...Loop
Do...Loop 一直执行到满足某个特定条件时为止。Do...Loop 有四种。
下面前两个示例中,可能根本不会执行循环中的代码(“执行0次”)。
后面的示例中,将至少执行一次代码。
(1)Do While...Loop
Do While A > 10
' ... loop body
Loop
每次执行循环之前,检查 While 后面的条件是否为 true,只有满足条件时才会执行循环。
(2)Do Until...Loop
Do Until A > 10
' ... loop body
Loop
只要 Until 后面的条件的值为 false,就会执行循环。
(3)Do...Loop While
Do
' ... loop body
Loop While A > 10
在第一次执行循环后才会检查条件;如果 While 后面的条件的值为 false,就终止循环。
(4)Do...Loop Until
Do
' ... loop body
Loop Until A > 10
也是在第一次执行循环后检查条件,但如果 Until 后面的条件的值为 true,就会终止循环。
与 For...Next 循环一样,Do...Loop 也提供了一个终止命令。Exit Do 命令可以在循环中的任意位置退出循环。
Do
If A = 4 Then
Exit Do
End If
' ... loop body
Loop While A > 10
4.while wend
while a > 10
...
wend
八、函数
Sub函数是没有返回值的函数
Function函数就是有返回值的函数
(一)函数定义语法
1.sub函数
[修饰符] Sub函数名[(参数列表)]
语句
End Sub
示例
Sub tellOperator(ByVal task As String)
Dim stamp As Date
stamp = TimeOfDay()
MsgBox("Starting " & task & " at " & CStr(stamp))
End Sub
2.function函数
[修饰符] Function 函数名 [(参数列表)] As 返回值类型
语句
函数名 = 返回值
End Function
示例
Function Hypotenuse(side1 As Double, side2 As Double) As Double
Hypotenuse = Math.Sqrt((side1 ^ 2) + (side2 ^ 2))
End Function
可以在函数中多次覆盖返回值。就像变量赋值一样,本示例中的函数返回最后一次赋给它的值。
Function Test
Test = 12
' ...
Test = 123
End Function
在本示例中,函数的返回值为123。
如果未指定任何值,则函数返回 zero 值(对于数值,返回数字0;对于字符串,返回一个空格)。
(二)函数使用
1.sub函数
函数名[(参数列表)]
示例
tellOperator("file update")
2.function函数
lvalue=函数名[(参数列表)]
示例
Dim testLength, testHypotenuse As Double
testHypotenuse = Hypotenuse(testLength, 10.7)
提前终止过程和函数
使用 Exit Sub 和 Exit Function 命令提前终止过程或函数,例如,为进行错误处理而提前终止。这些命令将停止过程或函数,并使程序返回到调用该过程或函数的位置。
以下示例说明了如何终止一个过程:当 ErrorOccured 变量的值为 True 时,就会终止执行该过程。
Sub Test
Dim ErrorOccured As Boolean
' ...
If ErrorOccured Then
Exit Sub
End If
' ...
End Sub
传递参数
函数和过程可以接收一个或多个参数。
Sub Test (A As Integer, B As String)
' ...
End Sub
在libreOffice Basic中,参数通常是通过 引用 传递的。在退出过程或函数时,将会保留对变量所做的更改:
Sub Test
Dim A As Integer
A = 10
ChangeValue(A)
' The parameter A now has the value 20
End Sub
Sub ChangeValue(TheValue As Integer)
TheValue = 20
End Sub
在本示例中,Test 函数中定义的值 A 将作为参数传递给 ChangeValue 函数。然后,将该值更改为20并传递给 TheValue;在退出函数时将保留对该值所做的更改。
如果不希望对参数所做的后续更改影响原来传递的值,也可以将参数作为值进行传递。要指定将参数作为值进行传递,请确保在函数标头的变量声明前面加上 ByVal 关键字。
Sub ChangeValue(ByVal TheValue As Integer)
TheValue = 20
End Sub
在libreOffice Basic中,将参数传递给过程和函数的方法与VBA中使用的方法几乎相同。默认情况下,参数是通过引用传递的。要将参数作为值进行传递,请使用 ByVal 关键字。在VBA中,还可以使用关键字 ByRef 强制通过引用传递参数。libreOffice Basic可以识别该关键字,但会将其忽略,因为这已经是libreOffice Basic中的默认过程。 |
可选参数
只有当调用期间传递了所有必需参数时,才能调用函数和过程。
libreOffice Basic允许将参数定义为可选参数,也就是说,如果调用中不包含相应的参数,libreOffice Basic将传递一个空参数。在以下示例中,A 参数是必需的,而 B 参数是可选的。
Sub Test(A As Integer, Optional B As Integer)
' ...
End Sub
IsMissing 函数用于检查是传递还是省略了某个参数。
Sub Test(A As Integer, Optional B As Integer)
Dim B_Local As Integer
' Check whether B parameter is actually present
If Not IsMissing (B) Then
B_Local = B ' B parameter present
Else
B_Local = 0 ' B parameter missing -> default value 0
End If
' ... Start the actual function
End Sub
本示例首先测试是否传递了 B 参数,并在必要时将该参数传递给内部 B_Local 变量。如果相应的参数不存在,则将默认值(本例中为值0)传递给 B_Local,而不是传递已传递的参数。
libreOffice Basic不支持VBA中的 ParamArray 关键字。 |