Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Ошибка при сохранении документа


Автор: Superior 24.11.2008, 15:26
Задача - сделать так чтобы шла проверка, сохранён ли документ и если нет, то сохранять. Проверка должно быть каждые, пусть, 5 сек. Так вот, при сохранении документа вылазит ошибка Run-Time Error 50290: Method 'save' of 'workbook' failed. В чём проблема?
Код

' API-функции для работы с таймером
Declare Function SetTimer Lib "user32" _
                 (ByVal hwnd As Long, ByVal nIDEvent As Long, _
                  ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
                  
Declare Function KillTimer Lib "user32" _
                 (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

' Запустить таймер
Function StartMyTimer(ByVal TickTime) As Long
    StartMyTimer = SetTimer(0&, 0&, TickTime, AddressOf MyTimerEvent)
End Function

' Остановить таймер
Sub KillMyTimer(TimerID As Long)
    If TimerID = 0 Then Exit Sub
    Call KillTimer(0&, TimerID)
    TimerID = 0
End Sub

' Событие - реакция на таймер
Sub MyTimerEvent()
    ' Действия, выполняемые по таймеру.
    If Not ActiveWorkbook.Saved Then ActiveWorkbook.Save
End Sub

Public MyTimerID As Long

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    KillMyTimer MyTimerID
End Sub

Private Sub Workbook_Open()
        MyTimerID = StartMyTimer(5000)
End Sub

Автор: kapbepucm 24.11.2008, 17:07
Запустил твой код, незначительно изменив, в отдельном модуле- проблем не было.

Добавлено через 2 минуты и 15 секунд
MS OFFICE 2000

Автор: Superior 24.11.2008, 17:26
если сделать так:
Код

Private Sub Workbook_Open()    
    While True
        If Not ActiveWorkbook.Saved Then ActiveWorkbook.Save
        SleepVB (5)
    Wend
End Sub

' объявляем WinAPI функцию ожидания сообщения
Private Declare Function WaitMessage Lib "user32.dll" () As Long

Sub SleepVB(Seconds)
  ' ожидание Seconds секунд
  Dim Start
  Start = Timer   ' текущее время в секундах
  Do While Timer < Start + Seconds
    ' обеспечивает параллельное выполнение других процессов
    WaitMessage ' ждем сообщения
    DoEvents ' обрабатываем
  Loop
End Sub

то ошибок не возникает... но мне такой вариант не нравится из-за цикла.

Автор: kapbepucm 25.11.2008, 10:44
Может-быть попробуй Application.OnTime
Пример использования:
Код
Sub Zapusk()' процедура запуска таймера
  Application.OnTime Now + TimeValue("0:00:05"), "OnTimerProcedure"
End Sub
Public Sub OnTimerProcedure()
  MsgBox "тут что-либо делаем"
  Application.OnTime Now + TimeValue("0:00:05"), "OnTimerProcedure"
End Sub

Автор: Superior 25.11.2008, 15:02
Спасибо, так работает! Но сразу вопрос: чаще, чем в 1 сек я не смогу осуществить проверку, при использовании такого метода? т.е. в TimeValue нельзя засунуть долю секунды?

Автор: kapbepucm 25.11.2008, 16:38
Вроде бы возможно, у меня так получилось:
Код
Sub Zapusk()
  Application.OnTime Now + TimeValue("0:00:05"), "OnTimerProcedure"
End Sub
Public Sub OnTimerProcedure()
  MsgBox "Hello"
  Application.OnTime Now + TimeValue("0:00:01") / 10, "OnTimerProcedure"
End Sub
Запускается через десятую долю секунды. Только по сравнению с WinAPI таимером, процедура не запустится заново, пока предыдущая не закончится.

Автор: Superior 25.11.2008, 17:18
у меня почему-то Excel подвешиваетя основательно, если меньше секунды интервал задать  smile даже если в процедуре OnTimer ничего не делается, кроме как задаётся следующий интервал срабатывания.

Автор: kapbepucm 25.11.2008, 17:42
Вы заставляете Excel несколько раз в секунду что-то делать в псевдо-фоновом режиме. Как следствие этого, это вполне реальный результат.

Добавлено через 31 секунду
 smile 

Автор: mihanik 28.11.2008, 16:16
Superior, а зачем так часто сохранять документ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)