LibreOffice 宏总是显示#NULL!重新打开文件后

Posted

技术标签:

【中文标题】LibreOffice 宏总是显示#NULL!重新打开文件后【英文标题】:LibreOffice Macro always show #NULL! after reopening the file 【发布时间】:2016-08-30 12:38:34 【问题描述】:

我在 LibreOffice Calc 中编写了一个宏,它能够正确运行。但是如果我关闭文件并重新打开,它总是显示#NULL! 而不是正确的值。我在这里错过了什么?

我的宏代码

Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
Function Calculate(CalType As String) As Double
'
' Calculate Macro
'

Dim i As Integer
Calc = 0

i = 1

Do While Not IsEmpty(Cells(i, 2))
    If (Cells(i, 3).Value = CalType And (Cells(i,2) = "A" Or Cells(i,2) = "B")) Then
        Calculate = Calculate + Cells(i, 4).Value
    ElseIf (Cells(i, 3).Value = CalType And Cells(i,2) = "C") Then
        Calculate = Calculate - Cells(i, 4).Value
    End If
    i = i + 1
Loop

'
End Function

调用函数类似于=Calculate(J6)

文件保存为.ods格式。

【问题讨论】:

请提供一个显示问题的示例宏。另外,您使用的是 .ods 格式吗? 我已经添加了我的宏代码。 【参考方案1】:

Cells 电话对我来说根本不起作用。它来自 VBA,而不是 LO Basic。不过我认为这不是主要问题。

LibreOffice 期望用户定义的函数很简单,只访问包含公式的单元格。由于调用该函数时电子表格尚未完全加载,因此无法读取其他单元格。

解决方法是忽略错误并等到文档完全加载后再运行该函数。以如下代码为例:

Function ReadOtherCell(row, col)
    On Error GoTo ErrorHandler
    oSheet = ThisComponent.CurrentController.ActiveSheet()
    oCell = oSheet.getCellByPosition(row, col)
    ReadOtherCell = "value is '" & oCell.getString() & "'"
    Exit Function
    ErrorHandler:
        Reset
End Function

Sub RecalculateAll
    ' This is for user-defined functions that need to read the spreadsheet.
    ' Assign it to the "View created" event,
    ' because before that, the spreadsheet is not fully loaded.
    ThisComponent.calculateAll
End Sub

在 A1 中输入 foo,在 A2 中输入 =ReadOtherCell(0,0)。到目前为止,这有同样的问题——第一次打开文档时会失败。

现在,转到Tools -> Customize。在“事件”选项卡中,突出显示 View created。按Macro... 并找到RecalculateAll 功能。然后按确定。

现在,当文档关闭并重新打开时,单元格 A2 应显示结果value is 'foo'

这来自 B. Marcelly 在http://ooo-forums.apache.org/en/forum/viewtopic.php?f=20&t=73090&sid=f92a89d676058ab597b4b4494833b2a0 的回答。

【讨论】:

ThisComponent.calculateAll 在做什么?它如何与您的 ReadOtherCell 函数连接,该函数需要参数 row,col 作为输入? ThisComponent.calculateAll 导致 A2 中的公式被重新计算,它调用 ReadOtherCell() 我试过你的例子,打开文件时出现错误:参数数量错误,即使单元格最终显示了值。 在这个例子中,两个参数被传递给一个接受两个参数的函数,所以它不应该导致错误(当我测试它时也没有)。你确定这是错误的来源吗?在其他空的电子表格中尝试。另外,尝试更改函数和调用以获取零参数,看看会发生什么。 好吧,我想我搞砸了。感谢您的帮助。【参考方案2】:

我遇到了同样的问题。 我注意到在模块中,我有一个空的 Sub Main 在我删除它之后,这些功能又开始工作了

【讨论】:

以上是关于LibreOffice 宏总是显示#NULL!重新打开文件后的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LibreOffice 中使用宏和 Visual Basic 突出显示文本

将 VBA 简单宏转换为 LibreOffice 宏

微调 goto 书签 libreoffice 宏

如何在 LibreOffice 中运行 python 宏?

无法在 LibreOffice 中运行 Python 宏

LibreOffice - 如何通过 python 宏创建文件对话框?