大规模简化细胞中的简单方程

问题描述 投票:0回答:2

问题如此简单,我找不到解决方案。

我有一张里有几千个数字的表。许多都是由几个数字组成的字符串,如

z
,尽管有些格式为
x*y
。我花了两个小时的大部分时间试图找到一种方法来让所有单元格进行计算并简化为
z
,意思是计算乘法。

有人知道该怎么做吗?我知道必须有一个简单的解决方案,但我尝试过的所有方法似乎都不起作用(或者在大多数情况下都做任何事情)。如果您需要任何其他信息,请询问。

我已经尝试了很多,但还是在黑暗中摇摆。我断断续续地使用 libreoffice 有几年了,并且拥有相当肤浅的经验(我知道什么是/如何使用功能、基本格式等)。

libreoffice libreoffice-calc
2个回答
0
投票

例如,A 列中有以下字符串:

2
3*4

选择 A 列并转到数据 → 文本到列。指定以 Other

*
分隔,然后按 OK。现在看起来像这样:

A   B
~~  ~~
2
3   4

最后,在C列中输入这个公式并向下填写:

=IF(B1<>"";A1*B1;A1)

结果:

C
~~~
2
12

对于更复杂的表达式(例如

2*3/4+5
),您可以使用 Python 等语言编写宏来通过
eval()
运行值。请注意,
eval()
是出了名的不安全,因此不要这样做,除非您完全控制数据,或者首先检查所有潜在危险字符,例如要求输入与
/^[0-9\*\/\+]*$/
等正则表达式匹配。


0
投票

@JimK 是对的 - Calc 中没有用于执行此任务的内置工具,但脚本可以做到这一点。与此类似的宏可以处理该任务:

Sub Str2Frmlas
Dim oActiveSheet As Variant
Dim oUsedRange As Variant
Dim oDataArray As Variant
Dim oFA As Object 
Dim r As Long, c As Long 
    oActiveSheet = ThisComponent.getCurrentController().getActiveSheet()
    oUsedRange = oActiveSheet.createCursor()
    oUsedRange.gotoEndOfUsedArea(True)
    oDataArray = oUsedRange.getDataArray()
    oUsedRange.clearContents(com.sun.star.sheet.CellFlags.HARDATTR)
    oFA = CreateUNOService("com.sun.star.sheet.FunctionAccess")
    For r = LBound(oDataArray) To Ubound(oDataArray)
        For c = LBound(oDataArray(r)) To Ubound(oDataArray(r))
            If Trim(oDataArray(r)(c)) <> "" Then
                If oFA.callFunction("REGEX",Array(Trim(oDataArray(r)(c)),"^[0-9\*\/\+]*$"))=Trim(oDataArray(r)(c)) Then oDataArray(r)(c) = "=" & Trim(oDataArray(r)(c))
            EndIf 
        Next c
    Next r
    oUsedRange.setFormulaArray(oDataArray)
    ThisComponent.calculate()
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.