我在项目中有50个数据表,没有人记得在转到另一个工作表时运行保存宏。明智的想法是使用私有子Worksheet_Deactivate在选择另一个工作表时进行必要的计算。除了50个数据表之外,工作簿中还有两个工作表,不能运行计算。如果sub可以放入"工作表"那将是很好的。而不是在单个工作表中复制50次,但另外两个工作表需要从处理中排除。
问题是,sub默认为停用工作表(例如宏代码中的非限定" Range.Value ="),但活动工作表现在是导航到TO的工作表。因此任何ActiveXXXXX语句都会指向错误的工作表。不允许使用Worksheet.Name。
数据表编号为1到50.需要的是在deactivate sub早期的声明,类似于
如果DeactivatingWorksheet(X)=" BasicInfo"或者"常数"然后GoTo EndSub 其中X是停用工作表的值。当然,只有Excel在处理时才知道。
我似乎无法弄清楚如何在宏的IF语句中引用停用工作表。有什么想法吗?
答案 0 :(得分:2)
使用Workbook_SheetDeactivate(ByVal sh as Object)
代替Worksheet_Deactivate()
。工作簿级事件提供了正在离开的工作表的名称,即使在两种情况下,ActiveSheet
在事件触发时已经更改。使用sh
就像工作表变量一样 - sh.Name
,sh.ProtectionMode
等。
现在你不需要50个潜艇;只有一个。这允许的另一件事是,你可以"中止"现在ActiveSheet
由sh.Activate
更改为旧版本(但关闭事件或者您将有一个可爱的无限循环)。
Me
也会提供旧的工作表名称并且适用于工作表事件,如果您仍想这样做的话。 Me
是旧版本,ActiveSheet
是新版本。
答案 1 :(得分:0)
如果您正在使用Worksheet_Deactivate
并且这会在单独的模块中调用子例程,则可以将停用工作表的名称传递给子例程。
例如,如果您的子例程类似于:
Sub test()
ActiveSheet.Range("whatever") = "something"
ThisWorkbook.Save
End Sub
你可以从工作表中调用它,如:
Private Sub Worksheet_Deactivate()
Module1.test()
End Sub
您可以向子例程添加参数以获取工作表名称,并添加测试:
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
这样,您可以在子例程中随意使用整个工作表对象。