Страницы: 1
RSS
После закрытия книги завершается работа макроса в другой книге.
 
Всем добра!
Вопрос возможно тупой, но не смог разобраться. Итак:
Есть книга, в ней главный модуль с бесконечным циклом. Вся обработка происходит на событиях. И всё бы хорошо, но достаточно закрыть любой файл excel и работа модуля прекращается. Куда копать?
Изменено: Олег - 31.03.2021 19:54:30 (Пример)
 
Копать в сторону нормального пояснения с примером.
Цитата
главный модуль с бесконечным циклом.
Главный - это какой? Общий или назначенный главным модуль листа/книги, в котором отслеживаются события?
"Бесконечный цикл" - именно то, что обозначает - зацикливание вычислений?
 
копайте
от принципа "компьютер должен считать все время! т.е. он все равно что-то считает, даже когда ничего не делает"
в сторону "как бы мне настроить точечные расчеты именно в те моменты, когда они реально должны быть выполнены"
все наладится
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
vikttur написал:
Копать в сторону нормального пояснения с примером.
Модуль Run, процедура Main. Если закрыть любую книгу, она завершает выполнение.
Скрытый текст
Изменено: Олег - 31.03.2021 15:01:33 (правка)
 
Олег, модуль не может ни начать работу, ни завершить её. А вот процедура (макрос), которая находится в модуле - может. Привыкайте к правильной терминологии.
То, что Вы называете ГЛАВНЫМ модулем, принято называть стандартным (обычным) модулем.  
 
и примера тут не будет
скорее всего с какой-то торговой площадки по DDE в файл валятся данные
нужно их обрабатывать и в он-лайн режиме решать что продавать, что покупать...
эх, сколько уже дашбордов написано торговцам и хоть бы один! написал:
Игорь, я разбогател на инет-торговле! вот твои призовые 100тыс.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Да модуль стандартный. Вот пример - упростил до максимума:
На листе есть кнопка CommandButton1. При клике вызывается процедура test из стандартного модуля Module1 и выводит в цикле на кнопку текущее время. Больше ничего нет. При закрытии любой книги выполнение процедуры прекращается.
Скрытый текст

Код
'Module1
Public Sub test()
    Do While True
       ThisWorkbook.Sheets(1).CommandButton1.Caption = Time()
       DoEvents
    Loop
End Sub

'WorkSheet
Private Sub CommandButton1_Click()
    Call test
End Sub
 
замените
Код
Public Sub test()
  ThisWorkbook.Sheets(1).CommandButton1.Caption = Time()
  Application.OnTime Now + 1 / 86400, "test"
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Попробуйте такой вариант.
Код
Public Sub test()
      ThisWorkbook.Sheets(1).CommandButton1.Caption = Time()
      Application.OnTime Now + TimeSerial(0, 0, 1), "test"
      DoEvents
End Sub

UDP Можно удалить, уже есть такое решение.
Изменено: МатросНаЗебре - 31.03.2021 15:50:25
 
Цитата
МатросНаЗебре написал:
замените
Этот вариант мне не подходит. Он работает именно для данного примера. Пример синтетический. Вызов по таймеру неприемлем, так как в процессе выполнения нужно обрабатывать события по приходу данных с TCP порта с минимальной задержкой. Нужна нормальная многозадачность, тем более что все работает до тех пор пока не закроешь какой-нибудь файл Excel. Вопрос был именно: "Почему выполнение кода завершается после закрытия другой книги?".
 
вы взяли не тот инструмент. понимаете, не возможно в ванной сделать водоворот опустив в воду бытовой вентилятор (на выходе получите вышедший из строя вентилятор и отсутвие водоворота в ванной)

откройте это все в отдельном экземпляре Excel. сверните его, спрячьте иконку и не заглядывайте туда, пусть себе шуршит
Изменено: Ігор Гончаренко - 31.03.2021 16:31:43
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
вы взяли не тот инструмент. понимаете, не возможно в ванной сделать водоворот опустив в воду бытовой вентилятор
Нет, не понимаю. Я задал вопрос. Если у вас нет на него ответа, то вполне логично просто промолчать, а не напускать на себя загадочной таинственности, рассуждая о вентиляторах в ванной.
 
извините, но и вы могли бы с высоты ваших знаний о работе Excel не обращать внимание на реплики дилетантов, пытающихся за счет напускания таинственности в своих сообщениях, выглядеть более значащими, чем они есть на самом деле))
удачи!
Изменено: Ігор Гончаренко - 31.03.2021 19:07:10
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Олег написал: Куда копать?
Сюда:
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=rules
Пункт 2,3
 
Хорошо. Попробую ещё раз.  :)
Файл прилагается.
В первой ячейке фоном выводится текущее время. Ничего хитрого. Так оно и выводится, никому не мешая, пока мы не закроем какую-нибудь другую книгу.
Собственно в этом и вопрос: Почему выполнение макроса прекращается после закрытия любой книги и как от этого избавиться?

Еще раз хочу заметить, я не преследую именно эту задачу по выводу времени в ячейку. Её можно реализовать сотней способов не создавая подобной проблемы. Интересует именно проблема завершения макроса в подобных случаях.
Изменено: Олег - 31.03.2021 20:09:02 (правка)
 
А оно не прекращается.
 
Цитата
RAN написал:
А оно не прекращается.
А вот это интересно. Какая у вас версия офиса? У меня Microsoft® Excel® 2019 MSO (16.0.13926.20000), 64-разрядная версия. Последний похоже.
 
Цитата
Олег написал:
Microsoft® Excel® 2019
умеет еще и УФ с листа при копировании бесследно удалять.

W10\Of10-32
 
Посмотрите в Диспетчере задач загрузку, когда отрабатывает Ваш макрос.

Необходимо добавить хотя бы минимальную задержку. Application.Wait для этого не подходит. Добавьте в начало модуля
Код
#If VBA7 Then
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
и в цикл задержку хотя бы на 100 миллисекунд

Код
Sleep 100

Жизнь должна наладиться.
Владимир
 
Цитата
sokol92 написал:
Жизнь должна наладиться.
Смысл понятен. Но к  сожалению не помогает. Проблема похоже в другом, как мне кажется после закрытия любой книги VBA теряет точку входа в DoEvents и останавливает выполнение макросов. Понять бы еще, баг это или фича.
 
1. скопируйте в файл макрос:
Код
Sub StopM
  Dim a
  a = a
  Stop
End Sub
2.  откройте новую книгу
3. поставьте курсор в ранее скопированный макрос, нажмите F8 (название Sub StopM теперь на желтом фоне)
4. закройте книгу открытую в п.2
куда девалась желтая строка, появившаяся было после нажатия F8? хотя... понятно (это потерялась точка входа в DoEvents)

а вообще в теме:
Цитата
После закрытия книги завершается работа макроса в другой книге.
как бы нет вопроса, есть утверждение... ну, да закрывается, все именно так и работает
Изменено: Ігор Гончаренко - 31.03.2021 21:25:11
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Добавил в Ваш файл изменения, указанные в #19. Открыл в версии Excel 2019 (64-). Открыл и закрыл с десяток книг - часы в ячейке A1 продолжают "тикать".
Владимир
 
Цитата
Ігор Гончаренко написал:
понятно (это потерялась точка входа в DoEvents)
Рад, что вам это понятно. Действительно отладчик в VBA использует тот же функционал, что и при реализации многозадачности в макросах посредством DoEvents. Удивительно, что вам не было об этом известно.  
Страницы: 1
Наверх