如何在 Linux 上的 LibreOffice Calc 中创建和运行宏

LibreOffice 是 FOSS 世界对主流和专有 Microsoft Office 套件的回答。它由领先的 Office Productivity 软件开发商和贡献者开发,完全替代了多个操作系统上的 Microsoft Office。

相当于 Microsoft Excel 的 LibreOffice 应用程序称为 LibreOffice Calc。它具有许多功能和类似于 Excel 的界面。它有一个内置的宏引擎来开发和运行宏以实现自动化。但是,它不支持Visual Basic,而是支持自己的语言; LibreOffice Basic,用于编程宏。

LibreOffice 套件预装在大多数 Linux 发行版中,包括 Ubuntu、Debian、Fedora 和 CentOS。

在 LibreOffice Calc 中创建和运行宏

首先,让我们用一些示例数据创建一个工作表。

要打开宏管理器,请转到 工具 » 宏 » 组织宏 » LibreOffice 基础.它会打开 LibreOffice 基本宏 窗口,如下面的屏幕截图所示。

为宏输入一个新名称,然后单击窗口右下方的新建按钮。

您现在应该会在 LibreOffice Basic 中看到宏编辑器屏幕。

如我们所见,手动创建的宏默认创建在“我的宏和对话框 -> 标准 -> 模块 1”下。

目前有两个宏:一个是 主要的,这是一个默认的空宏,其他是 测试,我们上面创建的宏。我们现在将增强测试宏。

我们的宏将完成以下任务:

  • 检查所有的人都有职业作家
  • 创建新工作表
  • 在新工作表中移动作家的所有条目

以下是我们的宏:

子测试 rem 将带有专业 Writer 的条目移动到新工作表 dim crs(8) 作为对象 dim j as Integer dim prof 作为 object dim i as Integer dim sh as object dim sh2 as object sh = ThisComponent.Sheets(0) crs(0) = sh.getCellRangeByPosition(0, 0, 3, 0) j = 1 for i = 1 to 5 x = 1 prof = sh.GetCellByPosition(3, i) rem 将完整行存储在变量中 If prof.string = "Writer" Then crs(j) = sh.getCellRangeByPosition(0, i, 3, i) j = j + 1 End If next i rem 现在创建一个新工作表并在那里写入这些数据 ThisComponent.Sheets.insertNewByName("Writers", 1) sh2 = ThisComponent.Sheets(1) i = 0 Do While not IsNull(crs(i)) sh2range = sh2.getCellRangeByPosition(0, i, 3, i) sh2range.setDataArray(crs(i).getDataArray) i = i + 1循环结束子

让我一段一段地向你解释上面的宏。

子测试。 . .结束子

测试 是我们宏的名称,因此在代码中,它表示为 子测试 (子 = 子程序)。同样我们用语句结束这个宏代码 结束子.请注意,这些语句是在我们从菜单中创建宏时自动添加的,但用户可以直接在此处编写宏代码,子程序名称将被视为宏名称。

雷姆 

LibreOffice Basic 中的所有注释都以关键字开头 雷姆.以 rem 开头的完整行被视为注释。另一种方法是使用 ' (单引号)在行首。

dim crs(8) as object dim j as Integer dim prof as object dim i as Integer dim sh as object dim sh2 as object

这是 LibreOffice Basic 中的变量声明。一般语法是 暗淡为 .要声明数组,请使用类似于变量 crs 的语法,其中 8 是数组的长度。

sh = ThisComponent.Sheets(0) crs(0) = sh.getCellRangeByPosition(0, 0, 3, 0) j = 1

这个组件 指当前文档。在这种情况下,它是一个 Calc 工作表。我们在变量 sh 中加载带有索引 0 的 Sheet,即第一张表。还有一些功能可以使用名称加载工作表。

接下来我们调用函数 getCellRangeByPosition 对象 sh 并将其加载到数组 crs 中。单元格范围是指工作表中基于位置的一组单元格。

请注意,参数, 0, 0 (第 0 列,第 0 行)表示范围的起始单元格,并且 3, 0 (第 3 列,第 0 行)表示范围的结束单元格。因此 0, 0, 3, 0 指的是我们样本表的第一行(标题)。

for i = 1 to 5 x = 1 prof = sh.GetCellByPosition(3, i) rem 将完整行存储在变量中 If prof.string = "Writer" Then crs(j) = sh.getCellRangeByPosition(0, i, 3, i ) j = j + 1 结束如果下一个 i

我们使用一个 为了 语句循环遍历行。这 为了 块以 a 结尾 下一个 语句,它在每次迭代结束时增加变量 i。

接下来我们调用一个函数 GetCellByPosition 对象 sh。我们传递参数 (3, 一),即在每次迭代中,第 3 列和第 i 行的单元格对象在变量 prof 中检索。

然后我们使用一个 如果 检查单元格 prof 中的值是否为“Writer”的语句。如果是,我们再次调用该函数 getCellRangeByPosition,这一次,与 一世 代替开始和结束行号。我们再次将其存储在数组中 crs.

ThisComponent.Sheets.insertNewByName("Writers", 1) sh2 = ThisComponent.Sheets(1)

首先,我们创建一个名为 name 的新工作表 作家, 在位置 1,这是第二个位置,因为index从0开始,然后我们得到这个新创建的sheet的一个对象,这样我们就可以在这张sheet中输入writers的数据了。

i = 0 Do While not IsNull(crs(i)) sh2range = sh2.getCellRangeByPosition(0, i, 3, i) sh2range.setDataArray(crs(i).getDataArray) i = i + 1 Loop

做时 当我们想要基于条件循环时使用 loop 语句,而不是在整数值范围内循环,为此使用 use 为了 如前所示。在这里,我们循环直到 crs(i) 不为空。

接下来,我们再次调用 getCellRangeByPosition 以与以前类似的方式在新工作表中获取范围对象。

最后,我们调用两个函数: 获取数据数组 它返回数据 crs(i),即第一张表中的一行数据(关于作者);我们将这些数据写入新工作表中的单元格范围 设置数据数组.

最后,保存宏 文件 » 全部保存 选项。

要运行宏,请转到 工具 » 宏 » 运行宏 并从宏选择器库中的“我的宏”目录中选择您的宏。点击 选择宏名称后的按钮。

在我们的示例电子表格上运行上述宏,会产生以下结果。

这是在 LibreOffice 中创建宏的方法。有关更多信息和选项,请参阅官方文档。

? 干杯!