如何在 LibreOffice Basic 中开始编写宏

获取变量的描述以及使用它们的规则。
388 位读者喜欢这篇文章。
code.org keynote address

Opensource.com

我早就承诺要写关于脚本语言 Basic 以及在 LibreOffice 中创建宏的文章。本文专门介绍 LibreOffice Basic 中使用的数据类型,更重要的是,变量的描述和使用规则。我将尽力为高级用户和新手用户提供足够的信息。

(并且,我要感谢所有对俄语文章发表评论和提出建议的人,特别是那些帮助回答难题的人。)

变量命名约定

变量名不能超过 255 个字符。它们应该以拉丁字母的大写或小写字母开头,并且可以包含下划线("_")和数字。如果名称未放在方括号内,则来自非拉丁字母的其他标点符号或字符可能会导致语法错误或 BASIC 运行时错误。

以下是一些正确的变量名示例

MyNumber=5

MyNumber5=15

MyNumber_5=20

_MyNumber=96

[My Number]=20.5

[5MyNumber]=12

[Number,Mine]=12

[DéjàVu]="It seems that I have seen it!"

[Моя переменная]="The first has went!"

[Мой % от зделки]=0.0001

注意:在包含方括号的示例中,如果删除方括号,宏将显示一个错误窗口。正如您所看到的,您可以使用本地化的变量名。这样做是否有意义取决于您。

声明变量

严格来说,在 LibreOffice Basic 中声明变量不是必需的(数组除外)。如果您编写一个由几行代码组成的宏来处理小型文档,则无需声明变量,因为变量将自动声明为 Variant 类型。对于较长的宏或将在大型文档中使用的宏,强烈建议您声明变量。首先,它提高了文本的可读性。其次,它允许您控制变量,这可以极大地促进错误的查找。第三,Variant 类型非常消耗资源,并且隐藏转换需要相当长的时间。此外,Variant 类型不会为数据选择最佳变量类型,这会增加计算机资源的工作负载。

如果您喜欢使用匈牙利命名法,Basic 可以通过其前缀(名称中的第一个字母)自动分配变量类型以简化工作。为此,使用语句 DefXXXXXX 是字母类型指示符。带有字母的语句将在模块中工作,并且必须在子程序和函数出现之前指定。共有 11 种类型

DefBool - for boolean variables;
DefInt - for integer variables of type Integer;
DefLng - for integer variables of type Long Integer;
DefSng - for variables with a single-precision floating point;
DefDbl - for variables with double-precision floating-point type Double;
DefCur - for variables with a fixed point of type Currency;
DefStr - for string variables;
DefDate - for date and time variables;
DefVar - for variables of Variant type;
DefObj - for object variables;
DefErr - for object variables containing error information.

如果您已经了解 LibreOffice Basic 中的变量类型,您可能已经注意到此列表中没有 Byte 类型,但有一个奇怪的 Error 类型。不幸的是,您只需要记住这一点;我尚未发现这是为什么。此方法很方便,因为类型会自动分配给变量。但是它不允许您查找与变量名中的拼写错误相关的错误。此外,将无法指定非拉丁字母;也就是说,所有需要显式声明的方括号中的变量名称都必须显式声明。

为了避免在使用显式声明的变量时出现拼写错误,您可以使用语句 OPTION EXPLICIT。此语句应是模块中的第一行代码。除注释外的所有其他命令都应放在其后。此语句告诉解释器,所有变量都必须显式声明;否则,它会产生错误。自然,此语句使在代码中使用 Def 语句变得毫无意义。

使用语句 Dim 声明变量。您可以同时声明多个变量,甚至是不同的类型,如果您用逗号分隔它们的名称。要使用显式声明确定变量的类型,您可以使用相应的关键字或名称后的类型声明符号。如果在变量之后未使用类型声明符号或关键字,则会自动为其分配 Variant 类型。例如

Dim iMyVar                      'variable of Variant type
Dim iMyVar1 As Integer, iMyVar2 As Integer 'in both cases Integer type
Dim iMyVar3, iMyVar4 As Integer 'in this case the first variable
                                'is Variant, and the second is Integer

变量类型

LibreOffice Basic 支持七类变量

  • 逻辑变量,包含以下值之一:TRUEFALSE
  • 数值变量,包含数值。它们可以是整数、正整数、浮点数和定点数
  • 字符串变量,包含字符串
  • 日期变量,可以包含内部格式的日期和/或时间
  • 对象变量,可以包含不同类型和结构的对象
  • 数组
  • 抽象类型 Variant

逻辑变量 – 布尔型

Boolean 类型的变量只能包含两个值之一:TRUEFALSE。在数值等效项中,值 FALSE 对应于数字 0,值 TRUE 对应于 -1(负一)。传递给布尔类型变量的任何非零值都将转换为 TRUE;也就是说,转换为负一。您可以按以下方式显式声明变量

Dim MyBoolVar As Boolean

我没有找到它的特殊符号。对于隐式声明,您可以使用 DefBool 语句。例如

DefBool b 'variables beginning with b by default are the type Boolean

变量的初始值设置为 FALSE。布尔变量需要一个字节的内存。

整型变量

有三种类型的整型变量:ByteIntegerLong Integer。这些变量只能包含整数。当您将带有小数的数字传输到此类变量中时,它们会根据经典算术规则进行四舍五入(而不是像帮助部分所述的那样向更大的方向舍入)。这些变量的初始值为 0(零)。

Byte

Byte 类型的变量只能包含从 0 到 255 范围内的正整数值。不要将此类型与字节中的信息物理大小混淆。尽管我们可以将十六进制数字写入变量,但单词“Byte”仅表示数字的维度。您可以按如下方式声明此类型的变量

Dim MyByteVar As Byte

此类型没有类型声明符号。此类型没有 Def 语句。由于其尺寸小,因此此类型最适合循环索引,其值不超过该范围。Byte 变量需要一个字节的内存。

Integer

Integer 类型的变量可以包含从 -32768 到 32767 的整数值。它们方便用于整数的快速计算,并且适合循环索引。% 是类型声明符号。您可以按以下方式声明此类型的变量

Dim MyIntegerVar%
Dim MyIntegerVar As Integer

对于隐式声明,您可以使用 DefInt 语句。例如

DefInt i 'variables starting with i by default have type Integer

Integer 变量需要两个字节的内存。

Long integer

Long Integer 类型的变量可以包含从 -2147483648 到 2147483647 的整数值。当 Integer 类型的范围不足以实现算法时,Long Integer 变量在整数计算中很方便。& 是类型声明符号。您可以按以下方式声明此类型的变量

Dim MyLongVar&
Dim MyLongVar As Long

对于隐式声明,您可以使用 DefLng 语句。例如

DefLng l 'variables starting with l have Long by default

Long Integer 变量需要四个字节的内存。

带小数的数字

所有这些类型的变量都可以采用带小数的数字的正值或负值。它们的初始值为 0(零)。如上所述,如果将带有小数的数字分配给只能包含整数的变量,则 LibreOffice Basic 会根据经典算术规则对数字进行四舍五入。

Single

Single 变量可以采用从 3.402823x10E+38 到 1.401293x10E-38 范围内的正值或负值。此类型变量的值采用单精度浮点格式。在这种格式中,仅存储八个数字字符,其余的存储为十的幂(数字阶数)。在 Basic IDE 调试器中,您只能看到 6 位小数,但这完全是谎言。使用 Single 类型变量进行的计算比 Integer 变量花费的时间更长,但比使用 Double 类型变量进行的计算更快。类型声明符号是 !。您可以按以下方式声明此类型的变量

Dim MySingleVar!
Dim MySingleVar As Single

对于隐式声明,您可以使用 DefSng 语句。例如

DefSng f 'variables starting with f have the Single type by default

Single 变量需要四个字节的内存。

Double

Double 类型的变量可以采用从 1.79769313486231598x10E308 到 1.0x10E-307 范围内的正值或负值。为什么范围如此奇怪?很可能在解释器中,存在导致这种情况的其他检查。Double 类型变量的值采用双精度浮点格式,并且可以有 15 位小数。在 Basic IDE 调试器中,您只能看到 14 位小数,但这同样是谎言。Double 类型的变量适用于精确计算。计算需要比 Single 类型更多的时间。类型声明符号是 #。您可以按以下方式声明此类型的变量

Dim MyDoubleVar#
Dim MyDoubleVar As Double

对于隐式声明,您可以使用 DefDbl 语句。例如

DefDbl d 'variables beginning with d have the type Double by default

Double 类型的变量需要 8 个字节的内存。

Currency

Currency 类型的变量显示为带有定点的数字,并且在数字的整数部分有 15 位,在小数部分有 4 位。值的范围包括从 -922337203685477.6874 到 +92337203685477.6874 的数字。Currency 类型的变量旨在精确计算货币值。类型声明符号是 @。您可以按以下方式声明此类型的变量

Dim MyCurrencyVar@
Dim MyCurrencyVar As Currency

对于隐式声明,您可以使用 DefCur 语句。例如

DefCur c 'variables beginning with c have the type Currency by default

Currency 变量需要 8 个字节的内存。

String

String 类型的变量可以包含字符串,其中每个字符都存储为相应的 Unicode 值。它们用于处理文本信息,除了打印字符(符号)外,它们还可以包含非打印字符。我不知道行的最大大小。Mike Kaganski 实验性地将该值设置为 2147483638 个字符,之后 LibreOffice 崩溃。这相当于近 4 GB 的字符。类型声明符号是 $。您可以按以下方式声明此类型的变量

Dim MyStringVar$
Dim MyStringVar As String

对于隐式声明,您可以使用 DefStr 语句。例如

DefStr s 'variables starting with s have the String type by default

这些变量的初始值是一个空字符串("")。存储字符串变量所需的内存取决于变量中字符的数量。

Date

Date 类型的变量只能包含以内部格式存储的日期和时间值。实际上,此内部格式是双精度浮点格式 (Double),其中整数部分是天数,小数部分是一天的一部分(即,0.00001157407 是一秒)。值 0 等于 1899 年 12 月 30 日。Basic 解释器在输出时会自动将其转换为可读版本,但在加载时不会。您可以使用 Dateserial、Datevalue、Timeserial 或 Timevalue 函数快速转换为 Date 类型的内部格式。要从 Date 格式的变量中提取特定部分,您可以使用 Day、Month、Year、Hour、Minute 或 Second 函数。内部格式允许我们通过计算两个数字之间的差来比较日期和时间值。Date 类型没有类型声明符号,因此如果您显式定义它,则需要使用 Date 关键字。

Dim MyDateVar As Date

对于隐式声明,您可以使用 DefDate 语句。例如

DefDate y 'variables starting with y have the Date type by default

Date 变量需要 8 个字节的内存。

对象变量的类型

我们可以将 LibreOffice Basic 的两种变量类型视为对象。

Objects

Object 类型的变量是存储对象的变量。一般来说,对象是程序的任何独立部分,它具有结构、属性以及访问和数据处理的方法。例如,文档、单元格、段落和对话框都是对象。它们具有名称、大小、属性和方法。反过来,这些对象也由对象组成,而对象又可以由对象组成。这种对象的“金字塔”通常称为对象模型,它允许我们在开发小型对象时将它们组合成更大的对象。通过更大的对象,我们可以访问更小的对象。这使我们能够操作文档,创建和处理文档,同时从特定文档中抽象出来。Object 类型没有类型声明符号,因此对于显式定义,您需要使用 Object 关键字。

Dim MyObjectVar As Object

对于隐式声明,您可以使用 DefObj 语句。例如

DefObj o 'variables beginning with o have the type Object by default

Object 类型的变量本身不存储对象,而只是对对象的引用。此类型变量的初始值为 Null。

Structures

结构本质上是一个对象。如果您查看 Basic IDE 调试器,大多数(但不是全部)都是 Object 类型。有些不是;例如,Error 的结构具有 Error 类型。但粗略地说,LibreOffice Basic 中的结构只是分组到一个对象变量中,没有特殊的访问方法。另一个显着区别是,在声明 Structure 类型的变量时,我们必须指定其名称,而不是 Object。例如,如果 MyNewStructure 是结构的名称,则其变量的声明将如下所示

Dim MyStructureVar As MyNewStructure

有很多内置结构,但用户可以创建个人结构。当我们需要处理应被视为一个整体的异构信息集时,结构可能很方便。例如,创建 tPerson 结构

Type tPerson
  Name As String
  Age As Integer
  Weight As Double
End Type

结构的定义应在使用它的子例程和函数之前。

要填充结构,您可以使用,例如,内置结构 com.sun.star.beans.PropertyValue

Dim oProp As New com.sun.star.beans.PropertyValue
OProp.Name = "Age" 'Set the Name
OProp.Value = "Amy Boyer" 'Set the Property

为了更简单地填充结构,您可以使用 With 运算符。

Dim oProp As New com.sun.star.beans.PropertyValue
With oProp
  .Name = "Age" 'Set the Name
  .Value = "Amy Boyer" 'Set the Property
End With

初始值仅适用于结构中的每个变量,并且与变量的类型相对应。

Variant

这是一种虚拟变量类型。Variant 类型会自动为要操作的数据选择。唯一的问题是解释器不需要节省我们的资源,并且它不提供变量类型的最佳变体。例如,它不知道 1 可以写入 Byte,而 100000 可以写入 Long Integer,尽管如果值是从另一个具有声明类型的变量传递的,它会重现类型。此外,转换本身非常消耗资源。因此,这种类型的变量是所有变量中最慢的。如果您需要声明这种变量,可以使用 Variant 关键字。但是您可以完全省略类型描述;将自动分配 Variant 类型。此类型没有类型声明符号。

Dim MyVariantVar
Dim MyVariantVar As Variant

对于隐式声明,您可以使用 DefVar 语句。例如

DefVar v 'variables starting with v have the Variant type by default

此变量类型默认分配给所有未声明的变量。

数组

数组是一种特殊类型的变量,形式为数据集,让人联想到数学矩阵,不同之处在于数据可以是不同的类型,并且允许通过索引(元素编号)访问其元素。当然,一维数组类似于列或行,而二维数组类似于表格。LibreOffice Basic 中数组的一个特点使其与其他编程语言区分开来。由于我们有 Variant 的抽象类型,因此数组的元素不需要是同质的。也就是说,如果有一个数组 MyArray,它有三个元素,编号从 0 到 2,我们在 MyArray(0) 的第一个元素中写入名称,在第二个 MyArray(1) 中写入年龄,在第三个 MyArray(2) 中写入权重,我们可以分别具有以下类型的值:MyArray(0) 的 String、MyArray(1) 的 Integer 和 MyArray(2) 的 Double。在这种情况下,数组将类似于一个结构,能够通过其索引访问元素。数组元素也可以是同质的:其他数组、对象、结构、字符串或 LibreOffice Basic 中可以使用的任何其他数据类型。

数组必须在使用前声明。尽管索引空间可以在 Integer 类型的范围内(从 -32768 到 32767),但默认情况下,初始索引被选择为 0。您可以通过多种方式声明数组

Dim MyArrayVar(5) as string 字符串数组,包含 6 个元素,从 0 到 5
Dim MyArrayVar$(5) 与前一个相同
Dim MyArrayVar(1 To 5) as string 字符串数组,包含 5 个元素,从 1 到 5
Dim MyArrayVar(5,5) as string 二维数组,包含 36 个元素,每级索引
从 0 到 5
Dim MyArrayVar$(-4 To 5, -4 To 5) 二维字符串数组,包含 100 个元素,每级索引
从 -4 到 5
Dim MyArrayVar() Variant 类型的空数组

您可以使用 Option Base 语句默认更改数组的下限(数组的第一个元素的索引);必须在使用子程序、函数和定义用户结构之前指定它。Option Base 只能取两个值 0 或 1,它们必须紧跟在关键字之后。该操作仅适用于当前模块。

了解更多

如果您刚开始学习编程,Wikipedia 提供了关于数组、结构和许多其他主题的通用信息。

要更深入地研究 LibreOffice Basic,Andrew Pitonyak 的 网站是一个顶级资源,Basic 程序员指南也是如此。您还可以使用 LibreOffice 在线帮助。可以在 The Document Foundation 的 wiki 的部分中找到已完成的流行宏,您还可以在其中找到有关该主题的其他链接。

有关更多提示或提出问题,请访问 Ask LibreOfficeOpenOffice 论坛

标签
My_Foto
我毕业于圣彼得堡国立经济大学,获得应用计算机科学学士学位。

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.