Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 6
Excel

Как при переходе из одной процедуры в другую закрывать процедуру, с которой идет перенаправление?

22.01.2016, 10:14. Показов 5243. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я в программировании на VBA мало что знаю, поэтому пожалуйста, объясните как можно доходчивее. Ситуация следующаа: мне нужно сделать файл экселя который после запуска будет ежесекундно сканировать путь (к примеру E:\1.docx) на предмет нахождения в нем файла (1.docx), если файла по заданному пути нет, идет перенаправление на таймер, если файл там появился, идет перенаправление на процедуру Delete которая удаляет этот файл, и снова возвращается на таймер. При отсылке из одной процедуры на другую, первая процедура до конца не отрабатывает и остается открытой, таким образом при отсылке со второй процедуры на первую (вторая так же до конца не отрабатывает), первая уже не может отработать так как нужно. Как сделать завершение процедуры при переходе на следующую, или как во второй процедуре сбросить первую я не знаю. Посоветуйте что можно сделать.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Private Sub Workbook_Open()
     Timer
End Sub
 
Sub Timer()
     Application.OnTime Now + TimeValue("00:00:01"), "GoTo line1"
line1: VerifyFileLocation
End Sub
 
Sub VerifyFileLocation()
     Dim strFileName As String
     Dim strFileTitle As String
     strFileTitle = "1.docx"
     strFileName = "E:\1.docx"
     If Dir(strFileName) <> "" Then
          GoTo line1
     Else
          GoTo line2
     End If
line1: Delete
line2: Timer
End Sub
 
Sub Delete()
     Dim File As String
     File = "E:\1.docx"
     Kill File
     GoTo line1
line1: Timer
End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2016, 10:14
Ответы с готовыми решениями:

Открыть одну форму, при этом закрыв другую
Здравствуйте! Как создать кнопку, при нажатии на которую окно переключаетса на другое?

Перенаправление на другой лист при нажатии на нужную ячейку
Задумка была следующая есть два листа в одном расчет по помещениям в другом сводная условно...

Можно ли при работающем макросе как то пользоваться другими excel? Открывать, изменять, закрывать?
Собственно вопрос в заголовке И возможно ли использовать application.screenupdating и...

8
Заблокирован
22.01.2016, 10:40
Лучший ответ Сообщение было отмечено SpleX как решение

Решение

SpleX,
1 - забудьте про GOTO !
2 - проявите фантазию в именах (Timer может вам понадобится в оригинале)
3 - зачем эти прыжки?
Visual Basic
1
2
3
4
5
6
7
8
Private Sub Workbook_Open()
     TimerM
End Sub
 
Sub TimerM()
     Application.OnTime Now + TimeValue("00:00:01"), TimerM '"GoTo line1"
      If Dir("E:\1.docx") <>"" Then Kill "E:\1.docx"
End Sub
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 6
22.01.2016, 11:05  [ТС]
1. Вместо GoTo можно указывать сразу необходимую процедуру.
2. Об этом я не подумал.
3. Но здесь идет отсылка самого на себя, и процедура остается открытой.
Visual Basic
1
2
Sub TimerM()
     Application.OnTime Now + TimeValue("00:00:01"), TimerM
Снова будет бить ошибку.
0
Заблокирован
22.01.2016, 11:28
Цитата Сообщение от Shersh Посмотреть сообщение
Application.OnTime Now + TimeValue("00:00:01"), "TimerM" 'кавычки добавьте - мой косяк
И сама Sub TimerM находится у вас в отдельном модуле, надеюсь?
1
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 6
22.01.2016, 12:53  [ТС]
Спасибо тебе большое! Я почему-то думал что если поставить
Visual Basic
1
2
3
If Dir("E:\1.docx") <>"" Then
    Kill "E:\1.docx"
End If
после строки
Visual Basic
1
Application.OnTime Now + TimeValue("00:00:01"), "TimerM"
то команда которая удаляет файл работать не будет, думал что этот таймер тоже будет срезу перенаправлять на себя не завершив процедуру. Все работает, вот код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Workbook_Open()
    TimerM
End Sub
 
Sub TimerM()
    Application.OnTime Now + TimeValue("00:00:01"), "TimerM"
    If Dir("E:\1.docx") <> "" Then
        Kill "E:\1.docx"
    End If
End Sub
Добавлено через 56 минут
А можно ко всему этому еще добавить проверку на наличие папки и ее удаление в случае если она появится?
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
22.01.2016, 13:09
Лучший ответ Сообщение было отмечено SpleX как решение

Решение

Здравствуйте, SpleX,
Поэкспериментировал немного с OnTime, и вот что у меня получилось:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub LongProcedure() 'Продолжительная процедура, которая длится 5 секунд.
    Dim t As Double
    t = Timer + 5
    While Timer < t: Wend
    Debug.Print "Продолжительная процедура завершена."
End Sub
 
Sub TimerM()
    Static calls As Long
    calls = calls + 1
    If calls <= 4 Then
        Debug.Print "Вызывана процедура TimerM, вызов в " & Time
        Application.OnTime Now + TimeValue("00:00:01"), "TimerM"
        LongProcedure
        Debug.Print "Завершена процедура TimerM"
    End If
End Sub
Code
1
2
3
4
5
6
7
8
9
10
11
12
Вызывана процедура TimerM, вызов в 12:40:17
Продолжительная процедура завершена.
Завершена процедура TimerM
Вызывана процедура TimerM, вызов в 12:40:22
Продолжительная процедура завершена.
Завершена процедура TimerM
Вызывана процедура TimerM, вызов в 12:40:27
Продолжительная процедура завершена.
Завершена процедура TimerM
Вызывана процедура TimerM, вызов в 12:40:32
Продолжительная процедура завершена.
Завершена процедура TimerM
Отсюда можно сделать два важных вывода:
  1. Если в процедуре производится планирование выполнения той же самой или другой процедуры через OnTime, то всегда сначала выполняется полностью процедура, запланировавшая выполнение той же или других процедур. Выполнение запланированных процедур откладывается до тех пор, пока не будет выполнена полностью эта процедура.
  2. Если время после выполнения процедуры-планировщика оказывается больше времени, на которое было запланировано выполнение той же или другой процедуры, то запланированная процедура вызывается сразу по окончанию выполнения процедуры-планировщика.
Спасибо вам за эту тему! До этого я как-то не задумывался даже, как работает OnTime...

Добавлено через 7 минут
Цитата Сообщение от SpleX Посмотреть сообщение
А можно ко всему этому еще добавить проверку на наличие папки и ее удаление в случае если она появится?
Можно, например:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Workbook_Open()
    TimerM
End Sub
 
Sub TimerM()
    Application.OnTime Now + TimeValue("00:00:01"), "TimerM"
    If Dir("E:\MyFolder\", vbDirectory) <> "" Then
        With CreateObject("Scripting.FileSystemObject")
            .GetFolder("E:\MyFolder\").Delete
        End With
    End If
End Sub
1
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
22.01.2016, 13:28
Лучший ответ Сообщение было отмечено SpleX как решение

Решение

А ещё полезно когда уже не нужно - отключать.
См.хелп:
Visual Basic
1
2
Application.OnTime EarliestTime:=TimeValue("17:00:00"), _ 
 Procedure:="my_Procedure", Schedule:=False
1
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
22.01.2016, 13:49
Аксима, если продолжительная процедура оставляет возможность обработки событий
Visual Basic
1
    While Timer < t: DoEvents: Wend
, то результат получается иной:
Code
1
2
3
4
5
6
7
8
9
10
11
12
Вызывана процедура TimerM, вызов в 13:44:42
Вызывана процедура TimerM, вызов в 13:44:43
Вызывана процедура TimerM, вызов в 13:44:44
Вызывана процедура TimerM, вызов в 13:44:45
Продолжительная процедура завершена.
Завершена процедура TimerM
Продолжительная процедура завершена.
Завершена процедура TimerM
Продолжительная процедура завершена.
Завершена процедура TimerM
Продолжительная процедура завершена.
Завершена процедура TimerM
2
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 6
22.01.2016, 14:03  [ТС]
Всем спасибо за ответы! Более менее понятно, теперь переварю полученную информацию, и попытаюсь собрать все так чтобы достигнуть задуманного результата.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2016, 14:03
Помогаю со студенческими работами здесь

Как отключить автозамену в программе и плавный переход из одного цвета в другой.
При работе с оператором Input, когда печатаю слово, у меня никак не убирается автозамена букв (т....

При открытии формы,закрывается другая
Когда открываем форму2-тобишь : Form2.show Закрыть вторую форму-тобишь : Как????

Оператор условного перехода, безусловного перехода
Помагите пожалуйста решить!!! 1.Подсчитать количество целых чисел среди чисел a, b, c. 2.На оси...

Переход от одного Combobox к другому с раскрытием последнего
У меня на форме около 10 комбов. Как организовать нужную мне последовательность перехода между...

Создать UserForm для перехода с одного листа на другой, а также комфортно перемещаться на самом листе
Доброго времени суток! возник вопрос, у меня есть excel-евский файл, в котором очень много листов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru