StopTimer () не работает. Нужен способ перезапустить мой таймер в Excel - PullRequest
0 голосов
/ 16 января 2020

Я задал похожий вопрос вчера и получил ответ, но теперь у меня возникла другая проблема с решением, которое я нашел.

У меня есть некоторый код Excel, и он настроен на автосохранение. И это настройка для автоматического сохранения по таймеру. Я хочу иметь возможность сбрасывать этот таймер всякий раз, когда я вручную сохраняю проект, но, похоже, он не работает.

Я использую команду Workbook_BeforeSave, чтобы что-то сделать (в идеале, сбросить таймер) перед сохранением , Таким образом, если я сохраню книгу вручную, он снова запустит этот таймер.

Я попробовал что-то вроде этого:

Рабочая книга:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
    Cancel As Boolean)

Call StopTimer

End Sub

Модуль:

Public Sub StartTimer()
    RunWhen = Now + TimeValue("00:00:10")
    cRunWhat = "AutoSave"
   Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=True
End Sub
Public Sub StopTimer()
    On Error Resume Next
   Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=False
End Sub

Но это не похоже на работу. Я даже попробовал упрощенную версию, где я запускаю таймер, а затем просто вручную запускаю StopTimer, и он не останавливает таймер.

Есть ли что-то, чего мне не хватает в том, как должна работать StopTimer () ?

Спасибо за любую помощь!

Редактировать: Решение, которое я использовал

Я смог выполнить sh, что я хотел, используя следующие методы.

В Workbook

я использовал функцию Workbook_BeforeSave (), чтобы остановить таймер после сохранения.

Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, _
    Cancel As Boolean)

    Call StopTimer

End Sub

Это вызывает модуль StopTimer (). Это определено на уровне модуля.

Option Explicit
Public RunWhen
Public cRunWhat

Public Sub StartTimer()
    RunWhen = Now + TimeValue("00:01:00")
    cRunWhat = "Save"
    Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=True
End Sub
Public Sub StopTimer()
    On Error Resume Next
    Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=False
    StartTimer
End Sub

Теперь у меня была другая функция в книге, называемая StartTimer, а Save () была просто c функцией сохранения книги.

Основная проблема, с которой я столкнулся, была решена здесь. Но другой пост, который я сделал, также помог мне пройти через это. Linked here

Решение скопировано здесь.

1 Ответ

1 голос
/ 16 января 2020

Прежде всего, убедитесь, что ваш модуль начинается с строки c magi Option Explicit - это означает, что Excel выдаст ошибку, если вы явно не определили переменную, прежде чем пытаться ее использовать. , В противном случае по умолчанию оно будет рассматриваться как пустое значение. На самом деле в разделе «Инструменты / Опции» («Требуется объявление переменной») есть флажок, позволяющий автоматически помещать его в верхнюю часть всех ваших модулей.

Без:

Sub BadCode()
    MsgBox 10 + NotAVariable
End Sub

10

С:

Option Explicit
Sub BadCode()
    MsgBox 10 + NotAVariable
End Sub

Ошибка компиляции: переменная не определена


Далее убедитесь, что ваши переменные определены в модуль уровня, а не Sub или Function - это означает, что другие Sub с и Function с могут "видеть" переменную:

Без:

Sub Part1()
    Dim SomeNumber AS Long
    SomeNumber = 4
End Sub

Sub PartB()
    MsgBox 10 + SomeNumber
End Sub

Ошибка компиляции: переменная не определена

С:

Dim SomeNumber AS Long

Sub Part1()
    SomeNumber = 4
End Sub

Sub PartB()
    MsgBox 10 + SomeNumber
End Sub

14

Вы можете использовать Dim SomeNumber, Public SomeNumber или Private SomeNumber - использование Public позволит другим модулям также "видеть" переменную, в то время как Private позволит только коду в этом указанном c модуле «вижу» его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...