Как остановить макрос, если он уже был запущен или если в определенной ячейке есть значение - PullRequest
0 голосов
/ 28 июня 2010

Я использую Auto_Open для шаблона Excel (.xlt) для запуска макроса, который импортирует некоторые данные в отдельный лист, добавляет формулу, а затем создает несколько сводных таблиц и диаграмм.Результатом является окончательный отчет, который затем можно сохранить как .xls.

. Я добавил следующий оператор IF в начало подпункта Auto_Open, чтобы проверить ячейку A2, если она содержит «Отчет об активности службы» (это объединенная ячейка из A2: N2), и если это происходит для выхода из макроса.Это означает, что макрос не будет запущен во второй раз после создания отчета.

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

Два вопроса:

Это лучший способ остановить запуск макроса во второй рази перезаписывать окончательный отчет?

Макрос работает только в Excel 2007 из-за характера диаграмм, но код выше пропускается в Excel 2003

Есть идеи?

Ответы [ 3 ]

1 голос
/ 30 июня 2010

Никаких экспертов здесь нет, но ...

  1. Если вы не вызываете другой Sub после Sub "Auto_Open", тогда я бы использовал "End" вместо«Exit Sub».Это гарантирует, что никакой дальнейший код не будет выполняться, если "ActiveSheet.Range (" A2 "). Text =" Отчет об активности службы "= True.

  2. Опрос говорит, что" Auto_Open "было превышено"Workbook_Open" в Excel 2003, поэтому он может больше не поддерживаться ...

Приветствия!

0 голосов
/ 30 июня 2010

Вы также можете рассмотреть вопрос о том, чтобы быть более конкретным, чем «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
0 голосов
/ 28 июня 2010
  1. Я не совсем уверен, что вы проверяете. ActiveSheet относится к шаблону Excel или завершенному отчету? Если эта ячейка создана для окончательного отчета и просто проверяет, существует ли она, что указывает на то, что окончательный отчет завершен, я не обязательно буду его менять. Возможно, это не самый лучший способ решения этой задачи, но при работе с VBA и Office часто бывает трудно найти «лучший» способ решения сложных задач.
  2. Я никогда раньше не использовал Auto_Open в Excel 2007, поэтому я не могу сказать, доступна ли она в Excel 2003. Однако раньше я использовал Workbook_Open() для запуска кода при запуске рабочей книги. Вы должны увидеть этот метод, если перейдете к ThisWorkbook в окне проводника Visual Basic. В правом окне измените (General) на Workbook , и вы должны увидеть метод Workbook_Open().
...