当其他Excel实例具有焦点时,无法获取活动工作表或选定范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当其他Excel实例具有焦点时,无法获取活动工作表或选定范围相关的知识,希望对你有一定的参考价值。

我正在维护一个Office加载项,它从服务器接收数据并将其写入活动工作表中的当前选择。

当我打开秒工作簿时,第一个工作簿中的加载项无法再获取活动工作表。

当我专注于第一本工作簿时,它再次工作。

我试图得到这样的活动工作表:

Excel.run(function (ctx) {
  var sheet = ctx.workbook.worksheets.getActiveWorksheet();
  // insert code following ...
}

我收到以下错误:

Error at WorksheetCollection.getActiveWorksheet
InvalidSelection: The current selection is invalid for this operation.
 at Anonymous function 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:12439:6)
 at lib$es6$promise$$internal$$tryCatch 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9240:8)
 at lib$es6$promise$$internal$$invokeCallback 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9250:8)
 at lib$es6$promise$$internal$$publish 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9226:9)
 at lib$es6$promise$asap$$flush 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9060:8)

获取工作簿的选定范围也不起作用:

Excel.run(function (ctx) {
  var range = ctx.workbook.getSelectedRange().getCell(0, 0);
  // ...
}

类似的错误:

Error at Workbook.getSelectedRange
InvalidSelection: The current selection is invalid for this operation.
 at Anonymous function 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:12439:6)
 at lib$es6$promise$$internal$$tryCatch 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9240:8)
 at lib$es6$promise$$internal$$invokeCallback 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32.16.01.debug.js:9250:8)
 at lib$es6$promise$$internal$$publish 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9226:9)
 at lib$es6$promise$asap$$flush 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9060:8)

最近才出现这个问题。

更新:事实证明,之前的声明是错误的,行为总是这样(使用未安装任何更新的新MSI安装进行测试)。

我无法通过从Visual Studio启动两个实例来重现它。

在Word加载项中ctx.document.getSelection()按预期工作。

我能做些什么吗?

答案

如果选择了第二个工作簿,则初始工作簿(以及所需的工作表)将不再标记为活动工作表。

在Excel工作簿中切换焦点时,应该小心使用activeworksheet。

我的建议是在变量中捕获并存储activeworksheet的名称,或者只是简单的硬代码,然后在以后的所有引用中使用这个变量

另一答案

我的印象是,这一直是这样的。如果您之前曾说过以前工作过,那么您是否可以提供有关它以前使用的Excel版本/版本的更多信息?我们将进行更多调查,看看这是否是行为改变。

如果工作簿未处于活动状态,则getActiveWorksheet()应该失败,因为它不处于活动状态。

另一答案

解决方法是注册WorksheetActivatedEvent,跟踪事件中的工作表名称,然后当工作簿失去焦点时,您可以使用从名称获取所选工作表。

如果您可以分享您的方案,这将有助于我们更好地了解该问题。

以上是关于当其他Excel实例具有焦点时,无法获取活动工作表或选定范围的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA,从非活动工作表中获取范围

获取其他玩家实例化的游戏对象 Unity Photon

Excel VBA 用户定义函数:在工作表函数中获取单元格被调用

当另一个工作簿处于活动状态时,UDF 引用命名表错误

QT编程时如何使按钮的颜色发生变化

sql 数据库中具有多个表的活动崩溃 - Android Studio