当它们与文本混合时,将Excel或LibreOffice单元格内容中的数字乘以常量?

时间:2016-01-31 22:36:51

标签: excel constants libreoffice-calc

我有一系列像这样编写的单元格(示例文本):

Example Number (3502, 456)

如何将数字乘以4而不必删除文本?

我也有[sic under]格式的单元格:

Example Number (3502,456) (4560,250) (2345,223)

等等,每个文本字符串平均有十个括号。

有时,文字也可能只有一个字长,例如

Example (3205, 456)

Example (3205,456) (4560,250) (2345,223)

等等。

(以上都是[原文如此])。

作为Excel的一种新手(嗯,真的是Libre Office Calc,但它基本上是相同的),我该怎么做?我不想通过自己手动乘以所有数字。我想要乘以的数字是4.我尝试过运行一个find-and-replace来用,替换所有)*4,但是我需要这些数字的程序无法计算表达式,它需要单个数字。

我需要更改每个列表上的110多个项目,并且三个列表中的任何一个上只有一个数学错误(!)并且程序将无法正确运行(我正在调整图像大小和点数我绘制的图像没有按比例放大)。我不想冒风险。

2 个答案:

答案 0 :(得分:2)

应该可以使用宏来执行此操作,但除非我弄错了,否则LibreOffice宏代码与Excel VBA完全不同。

但是,如果您能够使用电子表格的多个列来计算出值,则可以使用公式来实现。如果单元格A1包含

Example Number (3502,456) (4560,250) (2345,223)

和B1包含

=MID(A1,FIND("(",A1)+1,9999)

然后此公式将3502作为数字返回:

=NUMBERVALUE(LEFT(B1,FIND(",",B1)-1))

(9999被选择为远大于任何行的可能长度,因此MID函数将始终返回搜索字符后的整个文本的其余部分。)

您应该能够将MIDFIND函数组合在其他单元格中以隔离其他数字,假设这些数字总是按照您的示例以格式(xxx,yyy)找到。然后,您可以使用最终公式从乘法数字重建字符串:

="Example Number (" & 4*C1 & "," & 4*E1 & ")"

等等。

如果您的数据中包含可变数量的数字,则某些FIND函数可能会返回#VALUE错误。您可能需要使用IF函数来排除这些,例如:

=IF(ISERROR(G1),"",G1)
如果包含数据,

将返回G1的值,如果包含错误,则返回空白。

答案 1 :(得分:1)

这是一个Python LibreOffice宏,可以满足您的需求。它假定所有值都在A列中,并将结果写入B列。

import re

def do_calculations():
    document = XSCRIPTCONTEXT.getDocument() 
    sheet = document.getSheets().getByIndex(0)
    cellrange = sheet.getCellRangeByName("A1:A10000")
    row_tuples = cellrange.getDataArray()
    row = 1
    for row_tuple in row_tuples:
        if row_tuple:
            row = output_values(row, row_tuple[0], sheet)

def output_values(row, pairs_string, sheet):
    """Multiply pairs of values by 4 and output each pair to B column.
    :param row: the row number in the B column
    :param pairs_string: a string like "Example Number (123, 456) (789, 1011)"
    :param sheet: the current spreadsheet
    Returns the next row number in the B column.
    """
    pairs = re.findall(r'\([^)]+\)', pairs_string)
    for pair in pairs:
        match_obj = re.match(r'\((\d+),\s*(\d+)\)', pair)
        x, y = match_obj.groups()
        result = "(%d,%d)" % (int(x) * 4, int(y) * 4)
        cell = sheet.getCellRangeByName("B" + str(row))
        cell.setString(result)
        row += 1
    return row

# Functions that can be called from Tools -> Macros -> Run Macro.
g_exportedScripts = do_calculations,

将代码保存到文本文件,例如calc_multiply_numbers.py。将其放在Scripts/python的{​​{1}}中。在我的Windows系统上,它是C:\Users\JimStandard\AppData\Roaming\LibreOffice\4\user\Scripts\python。如果python目录尚不存在,请创建它。

要运行它,请打开电子表格并转到Tools -> Macros -> Run Macro。在My Macros下,点击calc_multiply_numbers,然后按Run按钮。

修改

我认为您不必担心JRE错误。在我的系统上,我可以在Tools -> Options -> LibreOffice -> Advanced中取消选中“使用Java运行时环境”,它仍然有效。当我询问是否要立即启用JRE时,我只需单击“否”,然后运行我的python宏。

它没有出现在My Macros下的原因是因为python无法正确解释文件。要查找错误,请使用以下步骤(假设Windows)使用python进行测试:

  1. 打开命令提示符,例如按 Win ,键入cmd,然后从开始菜单中单击“命令提示符”。
  2. 键入cd“ path-to-libreoffice / program”。在我的64位系统上,这是cd "C:\Program Files (x86)\LibreOffice 5\program"我使用普通的Windows文件资源管理器来查找确切的路径。
  3. 键入“python.exe python-script ”。在我的系统上,它是python.exe "C:\Users\JimStandard\AppData\Roaming\LibreOffice\4\user\Scripts\python\calc_multiply_numbers.py"
  4. python解释器将给出有关该问题的错误消息。如果您无法弄清楚该消息,请在下面的评论中写下来,我会帮助您。