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

Excel/VBA工作簿.activesheet返回错误的工作表,excel,vba,Excel,Vba,我有一个基于模板的工作簿(我们称之为“AAA”),它引用了第二个工作簿中的代码模块。第二个工作簿(我们称之为“CodeStorage”)是代码模块的存储库,因此任何保存的模板版本都可以访问修改/更新的代码,而无需更改保存的工作簿 当我在“AAA”中打开多个窗口,并试图在模块在“CodeStorage”中运行时获取activesheet时,我的问题就出现了。在代码中,我创建了一个对象(“oWorkbook”),当“AAA”有焦点时,它是对工作簿“AAA”的引用,oWorkbook.Activesh

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

当我在“AAA”中打开多个窗口,并试图在模块在“CodeStorage”中运行时获取activesheet时,我的问题就出现了。在代码中,我创建了一个对象(“oWorkbook”),当“AAA”有焦点时,它是对工作簿“AAA”的引用,oWorkbook.Activesheet返回活动窗口的工作表。当“CodeStorage”运行模块并因此具有焦点时,无论调用“CodeStorage”中的代码模块时哪个窗口(#2、3等)处于活动状态,oWorkbook.Activesheet都会返回在窗口#1中选择的工作表


有人遇到过这个问题吗?你找到解决办法了吗?

ActiveSheet
让你对它的使用方式感到困惑

您需要显式激活工作表,才能将其视为
ActiveSheet。
在另一个工作簿中运行代码不会激活它

在工作表中选择单元格将激活它。或者专门调用
激活。

你可以这样做:

oWorkbook.Activate
oWorkbook.Activesheet
或者,最好您可以执行以下操作:

oWorkbook.Worksheets("Sheet1")
oWorkbook.Worksheets(1)
这两个都更好。如果用户在运行时执行期间选择了不同的工作簿,或者您在不同的工作表中选择了某些内容,
ActiveSheet
将返回不同的内容


使用多个工作簿时,最好完全限定工作簿路径。这将为您在将来解决“激活了什么?”或“选择了什么?”的问题节省大量的麻烦。这也值得一读。

ActiveSheet
让您对使用它的方式感到困惑

您需要显式激活工作表,才能将其视为
ActiveSheet。
在另一个工作簿中运行代码不会激活它

在工作表中选择单元格将激活它。或者专门调用
激活。

你可以这样做:

oWorkbook.Activate
oWorkbook.Activesheet
或者,最好您可以执行以下操作:

oWorkbook.Worksheets("Sheet1")
oWorkbook.Worksheets(1)
这两个都更好。如果用户在运行时执行期间选择了不同的工作簿,或者您在不同的工作表中选择了某些内容,
ActiveSheet
将返回不同的内容


使用多个工作簿时,最好完全限定工作簿路径。这将为您在将来解决“激活了什么?”或“选择了什么?”的问题节省大量的麻烦。这也值得一读。

ActiveSheet
让您对使用它的方式感到困惑

您需要显式激活工作表,才能将其视为
ActiveSheet。
在另一个工作簿中运行代码不会激活它

在工作表中选择单元格将激活它。或者专门调用
激活。

你可以这样做:

oWorkbook.Activate
oWorkbook.Activesheet
或者,最好您可以执行以下操作:

oWorkbook.Worksheets("Sheet1")
oWorkbook.Worksheets(1)
这两个都更好。如果用户在运行时执行期间选择了不同的工作簿,或者您在不同的工作表中选择了某些内容,
ActiveSheet
将返回不同的内容


使用多个工作簿时,最好完全限定工作簿路径。这将为您在将来解决“激活了什么?”或“选择了什么?”的问题节省大量的麻烦。这也值得一读。

ActiveSheet
让您对使用它的方式感到困惑

您需要显式激活工作表,才能将其视为
ActiveSheet。
在另一个工作簿中运行代码不会激活它

在工作表中选择单元格将激活它。或者专门调用
激活。

你可以这样做:

oWorkbook.Activate
oWorkbook.Activesheet
或者,最好您可以执行以下操作:

oWorkbook.Worksheets("Sheet1")
oWorkbook.Worksheets(1)
这两个都更好。如果用户在运行时执行期间选择了不同的工作簿,或者您在不同的工作表中选择了某些内容,
ActiveSheet
将返回不同的内容


使用多个工作簿时,最好完全限定工作簿路径。这将为您今后处理“激活了什么?”或“选择了什么”的问题节省大量的麻烦。同样值得一读。

为了重新表述我的问题,我正在寻找一种方法来引用工作簿中打开了多个窗口的上一个活动工作表。如果选择了窗口1,我想要窗口1中的工作表,与窗口2、3或???相同???。当另一个工作簿中的代码模块正在运行并且代码模块有一个变量是调用工作簿的对象引用时,我还需要该引用

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


谢谢你,安德兰。你给我指出了正确的方向。

为了重新表述我的问题,我正在寻找一种方法来引用工作簿中打开了多个窗口的最后一个活动工作表。如果选择了窗口1,我想要窗口1中的工作表,与窗口2、3或???相同???。当另一个工作簿中的代码模块正在运行并且代码模块有一个变量是调用工作簿的对象引用时,我还需要该引用

解决方案是Workbook.Windows.Item(1).ActiveSheetView.Sheet。从运行的代码模块调用时,即使是在不同的工作簿中,从工作簿本身调用时,也会返回与workbook.activesheet相同的结果。我的考试很糟糕