LibreOffice Calc 输入框和数学表达式

LibreOffice Calc Input Box and mathematical expressions

提问人:Chris Lewis 提问时间:11/14/2023 最后编辑:Chris Lewis 更新时间:11/14/2023 访问量:24

问:

我想使用输入框来获取数学表达式(1+7、6-2、1+5-6 等),并使用宏来计算该表达式。我尝试使用 Expression(),但这似乎没有任何作用。我认为这不是 LibreOffice BASIC 的一部分......

这是我尝试过的。

Function GetUserInput() As Double
    Dim InputValue As Variant

    ' Prompt the user for input
    InputValue = InputBox("Enter a number or mathematical expression:", "Input Required")

    ' Treat empty input as 0
    If InputValue = "" Then
        GetUserInput = 0
    Else
        ' Attempt to evaluate the input as a mathematical expression
        On Error Resume Next
        GetUserInput = Evaluate(InputValue)
        On Error GoTo 0

        ' Check for errors in evaluation
        If Err.Number <> 0 Then
            MsgBox "Invalid expression. Assuming 0.", vbExclamation, "Invalid Input"
            GetUserInput = 0
        End If
    End If
End Function

每当我输入表达式时,它都会说“输入无效”。

编辑--

我需要通过输入框获取公式,而不是直接从单元格中获取公式。这一切都是通过单击按钮驱动的,该按钮要求用户输入,然后将该输入与已经在 spredsheet 中的更可预测的数据一起使用。在大多数情况下,输入单个整数,但有时,我需要能够捕捉到一个简单的加法和/或减法公式。

好吧,需求并不准确。我只是想看看我是否能让它工作。这只是一种方便。

爬过笑话电子表格(我假设这就是你所指的)我需要撕开字符串才能得到数字和运算符?所以没有直接的方法来处理这个问题?

libreoffice-calc libreoffice-basic

评论

0赞 JohnSUN 11/14/2023
你是对的,这里没有 Evaluate()。如果你所有的表达式都只是数值常量和算术运算(没有函数和对单元格的引用),那么这个使用辅助单元格的老把戏可能对你有用。
0赞 JohnSUN 11/14/2023
不,没有必要将公式分解成其组成部分,笑话的本质是不同的 - 文本表达式列中的公式文本作为公式插入到辅助单元格中,计算并返回计算结果。使用支持电子表格也可以完成相同的操作。是的,它是资源密集型的,但它有效。
0赞 Jim K 11/15/2023
您可以部分或全部用 python-uno 编写宏并使用 .请务必首先使用正则表达式以仅匹配安全字符。如果您希望代码纯粹是 Basic 的,请遵循 JohnSUN 的解决方案。eval()

答:

1赞 JohnSUN 11/14/2023 #1

该函数可以非常简单 - 通过从用户那里获取一个字符串并尝试计算值:GetUserInput()InputBox()

Function GetUserInput() As Variant
Dim InputValue As String
    InputValue = InputBox("Enter a number or mathematical expression:", "Input Required")
    GetUserInput = evalFormula(InputValue)
End Function

从文本字符串计算值的所有工作都可以通过以下函数完成:

Function evalFormula(sTextFormula As String) As Variant 
Dim sFullFormula As String
Dim oTempDoc As Variant, oWrkCell As Variant 
    GlobalScope.BasicLibraries.isLibraryLoaded("Tools")
    oTempDoc = CreateNewDocument("scalc")
    oWrkCell = oTempDoc.getSheets().getByIndex(0).getCellByPosition(0, 0)
    sFullFormula = Trim(sTextFormula)
    If Left(sFullFormula, 1) <> "=" Then sFullFormula = "=" & sFullFormula
    oWrkCell.setFormula(sFullFormula)
    oTempDoc.calculate()
    If oWrkCell.getError = 0 Then
        evalFormula = oWrkCell.getDataArray()(0)(0)
    Else 
        evalFormula = oWrkCell.getString()
    EndIf 
    oTempDoc.close(True)
End Function

测试代码:

Sub testInputBox
    MsgBox "Result is " & GetUserInput()
End Sub