【问题标题】:Reference to current cell from script in LibreOffice Calc从 LibreOffice Calc 中的脚本引用当前单元格
【发布时间】:2021-04-05 16:52:11
【问题描述】:

我想为 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

怎么了?如何做到这一点?

【问题讨论】:

  • 在我说“这不可能”之前,我想问你——为什么?你打算如何处理函数内部的这些信息?
  • 我的目标是根据其上的 HEX 颜色信息对单元格进行着色。所以我创建了函数 fillColor(col) 填充下一张纸上的单元格。我需要当前单元格的行位置才能为相应行上的单元格着色。

标签: libreoffice-calc libreoffice-basic


【解决方案1】:

无法做到。有几个原因。

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

现在我已经列出了为什么不能这样做的主要原因(这远非全部),我将展示几个“肮脏的黑客”如何不这样做。

  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)

【讨论】:

  • 对 JohnSUN 很有帮助。我当然是在网上搜索,但解决方案似乎很复杂,我认为存在简单的解决方案。
  • 好吧,eeigor 的解决方案不能说是困难的——如果你扔掉 Print () 并写 If ... Then 在一行中,那么整个解决方案需要两行。我反对这种解决方案的原因很简单——我相信在一个解决方案中混合不同的工具是不可行的。骡子是公驴和母马的后代。骡子比马更有耐心、耐寒和长寿——但不能生育。 (这只是我的意见 - 你完全有权不听我的)
  • 仅供参考。在脚本中,我使用tmpCell.CellBackColor = decValue 构造为下一张表中的选定单元格着色。
  • 您从哪里获得decValue 值?
  • 从函数参数作为上一个单元格的颜色值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多