问题描述
我想为 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
。
怎么了?如何实现这一目标?
解决方法
这是不可能的。这有几个原因。
- 您的想法“此工作表上的函数将更改电子表格中其他地方的某些内容”与电子表格的概念之一相矛盾 - “函数的结果只能更改写入此函数的单元格”。现在这仅针对当前工作表实现 - 在重新计算函数时当前工作表的内容被阻止。但是您必须为这样一个事实做好准备:在下一个版本中,禁令可以扩展到当前书籍的所有页面(并且可能扩展到所有打开的书籍)并且您的算法将停止工作。不知道是否会这样做,但不值得冒险。
- 没有任何机制可以让您从代码中获取关于“调用者”、关于启动代码的对象的额外信息——函数在开始执行之前必须通过输入参数接收所有必要的信息。 (此限制不适用于子程序)。
- 没有任何机制可以让您从代码中获取关于“调用者”、关于启动代码的对象的额外信息——函数在开始执行之前必须通过输入参数接收所有必要的信息。 (此限制不适用于子程序)。
- 执行函数的结果是一个值——数字、字符串、数字或字符串数组、对象引用、结构或用户定义的类型。如您所见,此列表中没有“单元格背景颜色”值。
既然我已经列出了无法做到这一点的主要原因(这远非全部),我将展示几个“肮脏的黑客”如何不这样做。
- 将当前单元格的坐标作为 column,row and sheet using the appropriate Calc functions 传递给函数
- 使用 VBA 兼容模式并使用 the Excel Caller ID Technique
- 无需摆弄一个单元格,一次完成整个工作表的过程 - 选择工作表上具有颜色值的所有单元格并为它们着色。是的,您可以从函数内部调用此过程。或分配给工作表事件。
- 在网络上搜索 - 按颜色代码为单元格着色的问题 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)