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

时间:2014-10-23 16:04:42

标签: excel vba

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

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

有没有人碰到这个,你找到了解决方法吗?

2 个答案:

答案 0 :(得分:3)

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

您需要明确激活表单,才能将其视为ActiveSheet.其他工作簿中的运行代码激活它。

选择工作表中的单元格将激活它。或者专门致电Activate.

您可以执行以下操作:

oWorkbook.Activate
oWorkbook.Activesheet

或者,最好,您可以执行以下操作:

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

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

使用多个工作簿时,最好完全限定工作簿路径。这样可以在将来处理“激活的内容”时,为您节省一点的头痛。或“选择什么?” This answer也值得一读。

答案 1 :(得分:0)

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

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

谢谢enderland。你让我指出了正确的方向。