如果宏已经运行或者特定单元格中存在值,如何停止宏

时间:2010-06-28 14:44:47

标签: excel excel-vba excel-2007 excel-2003 vba

我在Excel模板(.xlt)上使用Auto_Open来运行宏,该宏将一些数据导入到sperate表中,添加一些forula然后创建一些数据透视表和图表。其结果是最终报告,然后可以保存为.xls。

我已将以下IF语句添加到Auto_Open子句的顶部,以检查单元格A2是否包含“服务活动报告”(这是来自A2的合并单元格:N2),如果是,则退出宏。这样,在生成报告后,Macro将不会第二次运行。

If ActiveSheet.Range("A2").Text = "Service Activity Report" Then
Exit Sub
Else

两个问题:

这是阻止宏再次运行并覆盖最终报告的最佳方法吗?

由于图表的性质,宏仅在Excel 2007中有效,但在Excel 2003中跳过了上面的代码

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这里没有专家,但是......

  1. 如果你没有在“Auto_Open”Sub之后调用另一个Sub,那么我会使用“End”而不是“Exit Sub”。这将确保如果“ActiveSheet.Range(”A2“)没有其他代码将执行.Text =”服务活动报告“=真。

  2. 调查显示“Auto_Open”已被Excel 2003中的“Workbook_Open”取代,因此可能不再支持它了...

  3. 干杯!

答案 1 :(得分:0)

  1. 我不确定你在检查什么。 ActiveSheet是指Excel模板还是最终报告?如果为最终报告创建此单元格并且只是检查它是否存在,从而表明最终报告已完成,我不一定会更改它。它可能不是完成该任务的“最佳”方式,但在使用VBA和Office时,通常很难找到一种“最佳”方式来完成棘手的事情。
  2. 我之前从未在Excel 2007中使用过Auto_Open,所以我不能说它是否在Excel 2003中可用。但是,我之前使用Workbook_Open()来运行代码时工作簿启动。如果在Visual Basic资源管理器窗口中导航到ThisWorkbook,您应该能够看到该方法。在右侧窗口中,将(常规)更改为工作簿,您现在应该看到Workbook_Open()方法。

答案 2 :(得分:0)

您可能还想考虑比“ActiveSheet”更具体,以防万一工作簿使用不同的工作表保存。你可以给A2一个名字 - 比如'ReportTitle' - 这意味着什么表活跃并不重要:

If Range("ReportTitle").Text = "Service Activity Report" Then 
    Exit Sub
Else
   ' Code to do whatever you are doing...
End if

因为如果你的测试是真的你实际上想要什么都不做,如果它是假的,你可能想要考虑:

If Not (Range("ReportTitle").Text = "Service Activity Report") Then 
   ' Code to do whatever you are doing...
End if