【问题标题】:How to stop a Macro either if it has been run already or if a there is a value in a particular cell如果宏已经运行或特定单元格中有值,如何停止宏
【发布时间】:2010-07-01 03:22:50
【问题描述】:

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

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

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

两个问题:

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

由于图表的性质,宏仅适用于 Excel 2007,但在 Excel 2003 中将跳过上述代码

有什么想法吗?

【问题讨论】:

  • 如果每次打开文件都不需要执行代码,为什么还要使用自动打开宏?

标签: excel excel-2007 excel-2003 vba


【解决方案1】:

这里绝对不是专家,但是...

  1. 如果您没有在“Auto_Open”Sub 之后调用另一个 Sub,那么我将使用“End”而不是“Exit Sub”。这将确保在 "ActiveSheet.Range("A2").Text = "Service Activity Report" = True 时不再执行任何代码。

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

干杯!

【讨论】:

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

【讨论】:

  • 谢谢,Auto_Open 函数在 2003 年确实有效,尽管它似乎忽略了检查单元格是否已填充的检查。我会试试 Workbook_Open()。
【解决方案3】:

您可能还想考虑比“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2016-12-29
    • 2019-04-09
    相关资源
    最近更新 更多