从 LibreOffice Calc 中的脚本引用当前单元格

问题描述

我想为 LibreOffice calc 创建 VBScript,我想从单元格中调用它作为公式。我需要引用当前单元格。所以我创建了脚本 MyCell()。

function myCell() As String
    Dim oService As Object
    oService = createUnoService("com.sun.star.sheet.FunctionAccess")
    myCell = oService.callFunction("CELL",Array("ADDRESS"))
end function

当我直接从单元格调用它时,例如。 B2

=MyCell()

它总是返回 $A$1,但我需要得到 $B$2

怎么了?如何实现这一目标?

解决方法

这是不可能的。这有几个原因。

  1. 您的想法“此工作表上的函数将更改电子表格中其他地方的某些内容”与电子表格的概念之一相矛盾 - “函数的结果只能更改写入此函数的单元格”。现在这仅针对当前工作表实现 - 在重新计算函数时当前工作表的内容被阻止。但是您必须为这样一个事实做好准备:在下一个版本中,禁令可以扩展到当前书籍的所有页面(并且可能扩展到所有打开的书籍)并且您的算法将停止工作。不知道是否会这样做,但不值得冒险。
  2. 没有任何机制可以让您从代码中获取关于“调用者”、关于启动代码的对象的额外信息——函数在开始执行之前必须通过输入参数接收所有必要的信息。 (此限制不适用于子程序)。
  3. 没有任何机制可以让您从代码中获取关于“调用者”、关于启动代码的对象的额外信息——函数在开始执行之前必须通过输入参数接收所有必要的信息。 (此限制不适用于子程序)。
  4. 执行函数的结果是一个值——数字、字符串、数字或字符串数​​组、对象引用、结构或用户定义的类型。如您所见,此列表中没有“单元格背景颜色”值。

既然我已经列出了无法做到这一点的主要原因(这远非全部),我将展示几个“肮脏的黑客”如何不这样做。

  1. 将当前单元格的坐标作为 column,row and sheet using the appropriate Calc functions 传递给函数
  2. 使用 VBA 兼容模式并使用 the Excel Caller ID Technique
  3. 无需摆弄一个单元格,一次完成整个工作表的过程 - 选择工作表上具有颜色值的所有单元格并为它们着色。是的,您可以从函数内部调用此过程。或分配给工作表事件。
  4. 在网络上搜索 - 按颜色代码为单元格着色的问题 has been solved many times

更新。我诚恳地请求你 - 不要这样做(世界上有无数的坏程序!):

Function setBkColorTo(cellAddress as String,nColor As Long) As String
Dim oSheets As Variant
Dim oCellRangesByName As Variant
Dim i As Long 
    setBkColorTo = "Wrong data!"
    On Error GOTO WrongData
    oSheets = ThisComponent.getSheets()
    oCellRangesByName = oSheets.getCellRangesByName(cellAddress)
    For i = LBound(oCellRangesByName) To UBound(oCellRangesByName)
        oCellRangesByName(i).CellBackColor = nColor
    Next i
    setBkColorTo = "Colorized '" + cellAddress + "'"
    Exit Function
WrongData:

End Function

不要保存这个函数,不要把它称为=SETBKCOLORTO("Sheet2.B5:D7;Sheet2.C12:C17;Sheet2.A1";255)