Worksheet_Deactivate()无法使用活动工作表函数

时间:2015-08-27 23:55:50

标签: excel worksheet

我在项目中有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语句中引用停用工作表。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

使用Workbook_SheetDeactivate(ByVal sh as Object)代替Worksheet_Deactivate()。工作簿级事件提供了正在离开的工作表的名称,即使在两种情况下,ActiveSheet在事件触发时已经更改。使用sh就像工作表变量一样 - sh.Namesh.ProtectionMode等。

现在你不需要50个潜艇;只有一个。这允许的另一件事是,你可以"中止"现在ActiveSheetsh.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

这样,您可以在子例程中随意使用整个工作表对象。