Страницы: 1
RSS
Запуск макроса по сигнальному файлу
 
Здравствовать Вам господа! Возник вопрос.  
СУБД выдает отчет и сохраняет на диске C:\temp\блокнот.txt. Отчет является сигнальным файлом для запуска макроса. Макрос в режиме ожидание. Макрос готов. Как вместо "кнопки" и др..,запустить макрос сигнальным файлом? Какие есть соображения?
 
Периодически по Application.OnTime проверять наличие файла.
 
{quote}{login=Hugo}{date=10.11.2010 04:29}{thema=}{post}Периодически по Application.OnTime проверять наличие файла.{/post}{/quote}  
Спасибо!  
Можно небольшой пример!
 
Так например:  
 
Option Explicit  
 
Sub CheckFile()  
Dim NextTick As Date, filesys As Object  
Set filesys = CreateObject("scripting.filesystemobject")  
If filesys.FileExists("C:\temp\блокнот.txt") Then MsgBox 1  
NextTick = Now + TimeValue("00:00:03")  
Application.OnTime NextTick, "CheckFile"  
End Sub
 
Hugo!    
Подскажите пожалуйста. Код прописываем отдельным макросом или вставляем в перед готовому?
 
Я думаю отдельным.  
Вместо MsgBox 1 можно поставить запуск другого макроса или сюда вставить нужный рабочий блок.  
Ещё вероятно нужно продумать, что делать дальше - проверять снова наличие файла, или перестать. Если файл уже убрали/переименовали, то можно проверять опять.  
Да, и это дело нужно запустить с утра любым способом, и Экесель не закрывать, пока нужно следить за файлом.
 
' макрос CheckFile надо запускать ОДИН раз  
Sub CheckFile()    ' с интервалом 3 секунды проверяет наличие файла  
   If Len(Dir("C:\temp\блокнот.txt")) Then ВашМакрос ' если файл найден  
   Application.OnTime Now + TimeValue("00:00:03"), "CheckFile"  
End Sub  
 
 
Sub ВашМакрос() ' (этот макрос не должен работать дольше 3 секунд!)  
   ' здесь вы обрабатываете свой файл  
   ' ...  
   ' и потом его удаляете  
   Kill "C:\temp\блокнот.txt" ' удаляем файл  
End Sub
 
Разжевал :)  
Насчёт работы за 3 секунды - можно завести public переменную, которую проверять в одном макросе и изменять в другом. Т.е. пока не отработает обработчик, CheckFile() будет крутиться впустую.  
Ещё вариант - поместить подобный код в vbs, который запускать при старте Виндовс или шедулером. Он в свою очередь откроет нужный xls и запустит макрос при нахождении файла.
 
Спасибо! Пробую!
 
Задача немного изменилась.    
Есть два макроса, две кнопки их запускающие. На выполнение макрос1 надо время (всегда разное). Также задача 1-макроса готовить запрос для 4 баз данных поисковой СУБД (выполняется также по разному. Итог выполнение отчет. 2-й макрос читает этот отчет и подставляет нужные значения в таблицу.  
Задача: объединить два макроса на одну кнопку. Я мыслил примерно так в конце 1-макроса добавить условие проверки наличия сигнального ф-ла(которым будет являться отчет выполнения запроса в СУБД), который в свою очередь запустит 2-макрос по считыванию отчета и заполнению таблицы. Но что-то не получается и не могу разобраться с этим:  
' макрос CheckFile надо запускать ОДИН раз  
Sub CheckFile() ' с интервалом 3 секунды проверяет наличие файла  
If Len(Dir("C:\temp\блокнот.txt")) Then ВашМакрос ' если файл найден  
Application.OnTime Now + TimeValue("00:00:03"), "CheckFile"  
End Sub  
 
 
Sub ВашМакрос() ' (этот макрос не должен работать дольше 3 секунд!)  
' здесь вы обрабатываете свой файл  
' ...  
' и потом его удаляете  
Kill "C:\temp\блокнот.txt" ' удаляем файл  
End Sub  
 
Спасибо!
 
Т.е. этот отчёт готовит первый макрос?  
Тогда по идее пока он отчёт не изготовит, он работу не закончит, так ведь? По окончании запускать второй макрос.  
Или можно в конце на Do ... Loop с паузой проверку наличия файла поставить, а потом вызывать второй макрос.
 
{quote}{login=Hugo}{date=11.11.2010 05:55}{thema=}{post}Т.е. этот отчёт готовит первый макрос?  
Тогда по идее пока он отчёт не изготовит, он работу не закончит, так ведь? По окончании запускать второй макрос.  
Или можно в конце на Do ... Loop с паузой проверку наличия файла поставить, а потом вызывать второй макрос.{/post}{/quote}  
Вы поняли абсолютно верно!  
Пока не выполнится один макрос другой не запуститься. Вы говорите о паузе но как это сделать.И как эта пауза ограничена временем или сигнальным файлом не выдаст ли это ошибку выполнения макроса.
 
Так не работает?  
 
Sub macro1()  
...  
...  
macro2  
End Sub  
 
Sub macro2()  
...  
...  
End Sub
 
{quote}{login=Hugo}{date=11.11.2010 06:19}{thema=}{post}Так не работает?  
 
Sub macro1()  
...  
...  
macro2  
End Sub  
 
Sub macro2()  
...  
...  
End Sub{/post}{/quote}  
 
 
Пробовал нет...
 
С паузой, можно закольцевать, если файл не готов:  
 
Option Explicit  
 
Sub macro1()  
 
MsgBox 1  
Application.Wait (Now + TimeValue("0:00:02"))  
MsgBox 2  
 
macro2  
End Sub  
 
Sub macro2()  
MsgBox 3  
End Sub
 
{quote}{login=Hugo}{date=11.11.2010 06:25}{thema=}{post}С паузой, можно закольцевать, если файл не готов:  
 
Option Explicit  
 
Sub macro1()  
 
MsgBox 1  
Application.Wait (Now + TimeValue("0:00:02"))  
MsgBox 2  
 
macro2  
End Sub  
 
Sub macro2()  
MsgBox 3  
End Sub{/post}{/quote}  
Пробую.    
Спасибо за помощь, на сегодня рабочий день закончился пора домой до разберусь завтра!  
С уважением Алексей!
 
{quote}{login=EducatedFool}{date=10.11.2010 05:37}{thema=}{post}' макрос CheckFile надо запускать ОДИН раз  
Sub CheckFile()    ' с интервалом 3 секунды проверяет наличие файла  
   If Len(Dir("C:\temp\блокнот.txt")) Then ВашМакрос ' если файл найден  
   Application.OnTime Now + TimeValue("00:00:03"), "CheckFile"  
End Sub  
 
 
Sub ВашМакрос() ' (этот макрос не должен работать дольше 3 секунд!)  
   ' здесь вы обрабатываете свой файл  
   ' ...  
   ' и потом его удаляете  
   Kill "C:\temp\блокнот.txt" ' удаляем файл  
End Sub{/post}{/quote}  
 
Сделал по аналогии. Почему-то данная схема не работает в случае отсутствия файла. Т.е не ожидая файла запускается выполнение макроса2(). Либо есть ошибка?  
Sub CheckFile()  
If Len(Dir("C:\Documents and Settings\novikov\Ðàáî÷èé ñòîë\Îò÷åòû\çàäàíèå2.log")) Then Ìàêðîñ2  
Application.OnTime Now + TimeValue("00:00:03"), "CheckFile"  
End Sub  
Sub макрос2()  
Dim xLine As String  
Dim i As Long  
Application.ScreenUpdating = False  
Application.Calculation = xlCalculationManual  
Cells(1, 1).Activate  
Const FOR_READING = 1  
strFilePath = "C:\Documents and Settings\novikov\Ðàáî÷èé ñòîë\Îò÷åòû\çàäàíèå1.log"  
iLineNumber = 3  
Set objFS = CreateObject("Scripting.FileSystemObject")  
Set objTS = objFS.OpenTextFile(strFilePath, FOR_READING)  
Заранее спасибо!
 
Код копируем при русской раскладке - тогда не будет такого эффекта :-)
 
{quote}{login=Юрий М}{date=12.11.2010 11:48}{thema=}{post}Код копируем при русской раскладке - тогда не будет такого эффекта :-){/post}{/quote}  
Спасибо!  
Осталось разобраться как зациклить цикл:  
Sub CheckFile()  
If Len(Dir("C:\Documents and Settings\novikov\Рабочий стол\Отчеты\задание2.log")) Then  
Else: (Надо чтобы иначе было опять проверка наличия сигнального ф-ла)  
End If  
В моем ж случае, если отсутствует сигналка продолжает выполняться макрос и выдает ошибку т.к. сиг.файл появляется с переодичностью и непостоянствм во времени. Как поправить?  
Заранее спасибо!!!
 
Упс! недописал (но суть не меняется)  
Sub CheckFile()  
If Len(Dir("C:\Documents and Settings\novikov\Рабочий стол\Отчеты\задание2.log")) Then макрос1  
Else: (Надо чтобы иначе было опять проверка наличия сигнального ф-ла)  
End If
 
Sub CheckFile()  
If Len(Dir("C:\temp\задание1.log")) Then  
MsgBox "Есть!"  
Else ': (Надо чтобы иначе было опять проверка наличия сигнального ф-ла)  
Application.OnTime Now + TimeValue("00:00:03"), "CheckFile"  
End If  
End Sub
 
Увидел недописанное...  
Но суть не меняется :)  
Вместо сообщения ставьте вызов другого макроса.
 
{quote}{login=Hugo}{date=12.11.2010 12:27}{thema=}{post}Увидел недописанное...  
Но суть не меняется :)  
Вместо сообщения ставьте вызов другого макроса.{/post}{/quote}  
 
Спасибо!
Страницы: 1
Читают тему
Наверх
Loading...