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 中创建宏的方法。有关更多信息和选项,请参阅官方文档。
? 干杯!