如何在 libre office basic 中使用模块?

Posted

技术标签:

【中文标题】如何在 libre office basic 中使用模块?【英文标题】:How to use a module in libre office basic? 【发布时间】:2021-03-24 15:07:26 【问题描述】:

我习惯了 VBA,但我应该调试一些 libre office 基本代码,所以我尝试在代码隐藏中编写一个基本模块来处理我的工作表。

问题是,每当我尝试运行模块时,它似乎不知道起点在哪里等等,当我在 excel vba 中启动这段代码时,它运行起来很容易。也许有人知道如何在 libre office 中处理模块以及为什么有一个 main 方法..

REM  *****  BASIC  *****

Sub Main
    Test()
End Sub


Sub Test    
    Dim MyStringVariable As String
    MyStringVariable = "Wow!"
    Worksheets(1).Range("A1").Value = MyStringVariable
End Sub

【问题讨论】:

dim document as objectdim dispatcher as object rem ---------------------------------------------------------------------- rem get access to the document document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") rem ---------------------------------------------------------------------- dim args1(0) as new com.sun.star.beans.PropertyValue args1(0).Name = "ToPoint" args1(0).Value = "$a$1" dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1()) 这也是 libre office 的相同逻辑^^ 不太一样的逻辑。此代码不适用于 Worksheets (1),但适用于 ActiveSheet。这不是 LibreOffice 代码,这是一个“调度程序脚本”。你可以认为这只是击键的记录,仅此而已。这对于成熟的编程来说是不够的。如果您决定认真对待开放式办公室,请查看Pitonyak's book。不要连续阅读,根据目录选择给定时刻所需的章节(我自己是这样开始的)。 好的,谢谢,但是我实际上是通过 libre office 在 cmets 中录制这个宏,它会自动为我创建它 【参考方案1】:

这里的模块不承载任何功能负载——这只是为了方便将项目的过程和功能划分为逻辑相关的代码组。

您的代码无法工作,因为此 Basic 不知道工作表,它使用 ThisComponent.GetSheets() 方法获取当前电子表格的所有工作表。这里集合的元素从 0 开始编号,而不是像您在 VBA 中习惯的那样从 1 开始编号(这也适用于书籍的工作表,以及行数和列数):

REM  *****  BASIC  *****

Sub Main
' This is just "template" - you can leave it empty, or remove it, or fill with code '
End Sub

Sub Test    
    Dim MyStringVariable As String
    MyStringVariable = "Wow!"
    ThisComponent.GetSheets().getByIndex(0).getCellRangeByName("A1").setString(MyStringVariable)
' Better write this as '
Dim oSheets As Variant
Dim oSheet As Variant
Dim oCell As Variant
    oSheets = ThisComponent.getSheets()
    oSheet = oSheets.getByIndex(0)
    oCell = oSheet.getCellByPosition(0, 0)
    oCell.setString(MyStringVariable)
End Sub

【讨论】:

以上是关于如何在 libre office basic 中使用模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免连接器在 Open Office/Libre Office Draw 中移过形状

如何从 Office VBA 与 Libre Sheet 交互

[Libre|Open]Office 中当前文档的路径

如何在 Libre Office 中打开文件并将其保存为 .doc 文件?

如何在 libre office 中设置 URL 编码的超链接?

如何在 Libre Office Writer 的每一页上插入不同格式的不同文本?