Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2011, 23:21   #1
Sergey112233
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 82
Смущение Обновление по таймеру

Уважаемые форумчане.
Сделал обновление по таймеру.
При открытом файле Обновление данные из файла Источник периодически и последовательно заносятся в файлы Книга13 и Книга14.
Использую такую конструкцию

Код:
Sub Кнопка4_Щелкнуть()
dTime = Now + TimeValue("00:01:00")
Application.OnTime dTime, "Кнопка4_Щелкнуть", "00:01:00"
    Workbooks.Open Filename:="D:\1\Книга13.xls"
    Application.Run "Книга13.xls!Кнопка1_Щелкнуть"
    ActiveWorkbook.Save
    ActiveWorkbook.Close

    Workbooks.Open Filename:="D:\1\Книга14.xls"
    Application.Run "Книга14.xls!Кнопка1_Щелкнуть"
    ActiveWorkbook.Save
    ActiveWorkbook.Close
End Sub
На ПК все работает.
Но на практике все файлы лежат на сервере. Для их открытия, обновления, сохранения потребуется несколько большее время, чем на ПК.
Будет ли такая последовательность работать, не задерживая и, не останавливая друг друга. И если сбой возможен, то как поставить необходимое время ожидания?
Например. Идет обработка файла Книга13, и, пока она не закончится, обработка файла Книга14 не начнется?
Вложения
Тип файла: rar 1.rar (28.3 Кб, 8 просмотров)
Sergey112233 вне форума Ответить с цитированием
Старый 07.01.2011, 00:06   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

а сделайте так:
Код:
Sub Кнопка4_Щелкнуть()
    Workbooks.Open Filename:="D:\1\Книга13.xls"
    Application.Run "Книга13.xls!Кнопка1_Щелкнуть"
    ActiveWorkbook.Save
    ActiveWorkbook.Close

    Workbooks.Open Filename:="D:\1\Книга14.xls"
    Application.Run "Книга14.xls!Кнопка1_Щелкнуть"
    ActiveWorkbook.Save
    ActiveWorkbook.Close
    dTime = Now + TimeValue("00:01:00")
    Application.OnTime dTime, "Кнопка4_Щелкнуть"
End Sub
обработайте сначала книги 13 и 14 сколько бы они не обрабатывались, а потом назначте время выполнения процедуры.
если обязательно надо выполнять это 1 раз в минуту, то если книги 13, 14 не обрабатываются за минуту, вы все равно собьете ритм, можете внутри этой процедуры засечь время обработки книг 13,14 и подкорректировать время следующего запуска, на время уже затраченное на разработку.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 07.01.2011, 11:16   #3
Sergey112233
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 82
По умолчанию

IgorGO,
Я понял так, что действия Open, Run, Save, Close Книги13 должны выполняться Excel-ем последовательно, дожидаясь каждая своей очереди.
Только затем начнутся последовательно выполняться процедуры по Книге14.
Я Вас правильно понял?
Время 1 минута поставлено ориентировочно, его можно и увеличить до необходимого.
Вы упомянули :
"...внутри этой процедуры засечь время обработки книг 13,14..." Подскажите, пожалуйста, это нужно делать с помощью создания подпрограммы для запуска часов и функции остановки часов? Или по-другому?

Уважаемые форумчане.
Время обработки файлов книга 13, 14 на сервере зависит от количества обращений к серверу других пользователей. А я, как пользователь, могу как-то узнать какой-нибудь параметр, - как обрабатывается мое текущее обращение или что-то характеризующее этот процесс.
Вопрос вызван тем, что время обращения к серверу колеблется в достаточно значительном промежутке времени? И что с этим делать, кроме уменьшения объема файла?


IgorGO,
попробовал Ваше предложение.
Прекрасно работает на ПК (еще бы. Чья мысль-то)

Последний раз редактировалось Stilet; 07.01.2011 в 15:12.
Sergey112233 вне форума Ответить с цитированием
Старый 07.01.2011, 11:36   #4
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Можно поставить в цикл в начале макроса проверку, открыта ли книга 14 и пока она открыта не выполнять макрос.
Function WorkbooklsOpen(wbname) As Boolean
'Возвращает ИСТИНА, если рабочая книга открыта
Dim х As Workbook
On Error Resume Next
Set x = Workbooks(wbname)
WorkbooklsOpen = (Err = 0)
End Function
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 07.01.2011, 11:45   #5
Sergey112233
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 82
По умолчанию

kuklp, спасибо.
Мой вопрос связан с тем, что таких книг, последовально обновляемых - добрая дюжина.
Sergey112233 вне форума Ответить с цитированием
Старый 07.01.2011, 13:18   #6
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Так и проверяйте последнюю из них.
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 07.01.2011, 13:59   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

добрая дюжина - это 14 шт.?

так не покатит:
Код:
Sub Кнопка4_Щелкнуть()
  for i = 1 to 14
    on error resume next
    do
      err.clear
      doevents
      Workbooks.Open Filename:="D:\1\Книга" & i & ".xls"
    loop until err.number = 0
    Application.Run "Книга" & i & ".xls!Кнопка1_Щелкнуть"
    ActiveWorkbook.Save
    ActiveWorkbook.Close
  next
    dTime = Now + TimeValue("00:01:00")
    Application.OnTime dTime, "Кнопка4_Щелкнуть"
    on error goto 0
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 07.01.2011, 15:01   #8
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Я вообще сомневаюсь, что пока не закроется предыдущая книга, Экс начнет открывать следующую. По идее тут и проверок не надо. И вот это:
ActiveWorkbook.Save
ActiveWorkbook.Close
лучше так:
ActiveWorkbook.Close(True)
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 07.01.2011, 18:51   #9
Sergey112233
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 82
По умолчанию

Цитата:
Сообщение от kuklp Посмотреть сообщение
Я вообще сомневаюсь, что пока не закроется предыдущая книга, Экс начнет открывать следующую. По идее тут и проверок не надо. И вот это:
ActiveWorkbook.Save
ActiveWorkbook.Close
лучше так:
ActiveWorkbook.Close(True)
kuklp, в точку по моему вопросу.
Вручную, при открытии файла, Excel не дает открывать следующий файл, обрабатывает файлы последовательно.
Почему же программно Excel должен обрабатывать файлы иначе?
Пожалуйста, пару слов о замене:
ActiveWorkbook.Save
ActiveWorkbook.Close
лучше так:
ActiveWorkbook.Close(True)
Почему так будет лучше?
Sergey112233 вне форума Ответить с цитированием
Старый 07.01.2011, 19:10   #10
Sergey112233
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 82
По умолчанию

IgorGO,
да 14, ну и интуиция у Вас!

Попутно спасибо за пример применения
on error resume next
...
loop until err.number = 0
....
on error goto 0
"Применяйте обработчик ошибок и будет Вам щ-щ-астье"
Sergey112233 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление VirtualStringTree по таймеру woofer Помощь студентам 1 22.05.2010 02:55
Срабатывание датчика по таймеру RockForr Общие вопросы Delphi 8 26.05.2009 16:32
COM, TThread, обращение по таймеру Антон Ю.Б. Общие вопросы Delphi 2 17.02.2009 09:23
Автосохранения по таймеру ScreN Общие вопросы Delphi 13 09.01.2009 18:49
Вызов функции по таймеру Lexicss Общие вопросы Delphi 4 30.05.2007 22:47