Excel / VBA workbook.activesheet返回错误的工作表

我有一个基于模板的工作簿(我们将其称为“AAA”),并引用第二个工作簿中的代码模块。 第二个工作簿(我们称之为“CodeStorage”)是一个代码模块的存储库,这样任何已保存的模板版本都可以访问已修改/更新的代码,而无需更改已保存的工作簿。

当我在“AAA”中打开多个窗口并尝试在“CodeStorage”中运行模块时尝试获取活动页面时,出现问题。 在代码中,我创build了一个工作簿“AAA”的引用对象(“oWorkbook”)。当“AAA”具有焦点时,oWorkbook.Activesheet返回活动窗口的工作表。 当“CodeStorage”正在运行模块并具有焦点时,oWorkbook.Activesheet返回在窗口#1中select的表格,而不pipe在调用“CodeStorage”中的代码模块时何种窗口(#2,3等)处于活动状态。

有没有人遇到这个,你find了解决办法?

ActiveSheet混淆了你使用它的方式。

你需要明确地激活一个表格才能被认为是ActiveSheet. 在另一个工作簿中运行代码不会激活它。

在工作表中select单元格将激活它。 或者专门调用Activate.

你可以做这样的事情:

 oWorkbook.Activate oWorkbook.Activesheet 

或者,最好是,你可以做如下的事情:

 oWorkbook.Worksheets("Sheet1") oWorkbook.Worksheets(1) 

这两个都更好。 如果您的用户在运行时执行期间select了不同的工作簿,或者您select了不同的工作表中的某些内容,则ActiveSheet将返回不同的内容。

使用多个工作簿时最好完全限定工作簿path。 这将为您节省很多头痛,以应对“激活什么? 或“select了什么?” 这个答案也值得一读。

为了更改我的问题,我正在寻找一种方法来引用工作簿中有多个窗口打开的最后一个活动工作表。 如果select了窗口1,我希望窗口1中的表单与窗口2,3或???相同。 我还需要在不同的工作簿中的代码模块正在运行时的引用,并且代码模块具有一个variables,该variables是调用工作簿的对象引用。

解决scheme是Workbook.Windows.Item(1).ActiveSheetView.Sheet。 当从正在运行的代码模块中调用时,即使在不同的工作簿中,也会从工作簿本身调用时返回与workbook.activesheet相同的结果。 我的testing显示Workbook.Windows.Item(1)是工作簿失去焦点时的最后一个活动窗口。

谢谢恩德兰。 你让我指出了正确的方向。