Worksheet_Deactivate()不能使用活动工作表函数

我在项目中有50个数据表,没有人记得去另一个工作表时运行保存macros。 明智的想法是使用私人子Worksheet_Deactivate进行必要的计算时,他们select另一个工作表。 除了50个数据表之外,工作簿中还有两个工作表,其计算不得运行。 如果这个子文件可以放在“工作表”中而不是在单个工作表中复制50次,但是另外两个工作表需要从处理中排除,那将会很好。

问题是,该子默认为停用工作表(例如macros代码中的非限定“Range.Value =”),但活动工作performance在是正在导航到TO的工作表。 所以任何ActiveXXXXX语句指向错误的工作表。 Worksheet.Name是不允许的。

数据表编号为1到50.需要的是在停用子版本中的一个声明类似于

如果DeactivatingWorksheet(X)=“BasicInfo”或“Constants”然后GoTo EndSub其中X是取消激活工作表的值。 当然,X在处理的时候只被Excel知道。

我似乎无法弄清楚如何引用macros的IF语句中的停用工作表。 有任何想法吗?

使用Workbook_SheetDeactivate(ByVal sh as Object)而不是Worksheet_Deactivate() 。 工作簿级事件提供正在离开的工作表的名称,即使在两种情况下ActiveSheet在事件触发时都已经更改。 使用sh就像工作表variables – sh.Namesh.ProtectionMode

现在你不需要50个潜艇; 只有一个。 另一件事情是,你可以通过sh.Activate “中止”改变到现在的ActiveSheetsh.Activate旧的(但closures事件,否则你将有一个可爱的无限循环)。

如果你仍然想这样做, Me也给旧的sheetname和工作表事件。 Me是旧的, ActiveSheet是新的。

如果您正在使用Worksheet_Deactivate并在独立模块中调用子例程,则可以将停用工作表的名称传递给子例程。

例如,如果你的子程序是这样的:

 Sub test() ActiveSheet.Range("whatever") = "something" ThisWorkbook.Save End Sub 

你可以从工作表中调用它:

 Private Sub Worksheet_Deactivate() Module1.test() End Sub 

您可以将一个参数添加到子例程以获取工作表名称,并添加一个testing:

 Sub test(worksheetname as string) If worksheetname <> "dontsavethistab" then ActiveSheet.Range("whatever") = "something" 'or... you could also do: Sheets(worksheetName).Range("Whatever") = "something" ThisWorkbook.Save End If End Sub 

并从您的Worksheet_Deactivate事件调用它,如:

 Private Sub Worksheet_Deactivate() Module1.test (Me.Name) End Sub 

如果你想得到一个更清洁,而不是工作表名称,你可以传递工作表对象:

 Private Sub Worksheet_Deactivate() Module1.test(Me) End Sub 

 Sub test(ws as worksheet) If ws.name <> "dontsavethistab" then ws.Range("Whatever") = "something" ThisWorkbook.Save End If End Sub 

这样你就可以在你的子程序中使用整个工作表对象。