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

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

22.01.2016, 10:14. Показов 5297. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru