为何通过Uno FunctionAccess调用SHEET函数始终返回2?
为什么通过Uno FunctionAccess调用SHEET函数始终返回2?
问题根源
直接在单元格输入SHEET()时,Calc会自动将当前单元格所在的工作表作为隐式上下文传递给函数,因此能返回正确的当前工作表索引。
但你的自定义UDF中,FunctionAccess是全局服务,调用SHEET时没有绑定任何特定的单元格/工作表上下文。此时FunctionAccess会使用默认全局上下文,这个上下文默认指向文档中固定的某个工作表(通常是文档内按存储顺序的第二个工作表),所以无论在哪个工作表调用UDF,都会返回固定值2。
解决方案
要让UDF获取当前调用位置的工作表索引,需要直接获取调用该函数的单元格所在的工作表,而非依赖无上下文的FunctionAccess。修改后的代码如下:
Function SheetIndex() As Long Dim oCaller As Object Dim oSheet As Object ' 获取调用该UDF的单元格对象 oCaller = ThisComponent.getCurrentController().getSelection() ' 获取单元格所属的工作表 oSheet = oCaller.getSpreadsheet() ' LibreOffice工作表内部索引从0开始,加1后与原生SHEET函数返回值一致 SheetIndex = oSheet.getIndex() + 1 End Function
补充说明
如果一定要通过FunctionAccess实现,需要手动为其设置调用上下文(绑定当前单元格的位置信息),但这种方式步骤繁琐且没必要。直接获取当前调用单元格的工作表,是更高效且符合需求的实现方式。
内容的提问来源于stack exchange,提问作者Mario Palumbo
相关产品推荐
相关产品推荐

