Всем добра! Вопрос возможно тупой, но не смог разобраться. Итак: Есть книга, в ней главный модуль с бесконечным циклом. Вся обработка происходит на событиях. И всё бы хорошо, но достаточно закрыть любой файл excel и работа модуля прекращается. Куда копать?
Копать в сторону нормального пояснения с примером.
Цитата
главный модуль с бесконечным циклом.
Главный - это какой? Общий или назначенный главным модуль листа/книги, в котором отслеживаются события? "Бесконечный цикл" - именно то, что обозначает - зацикливание вычислений?
копайте от принципа "компьютер должен считать все время! т.е. он все равно что-то считает, даже когда ничего не делает" в сторону "как бы мне настроить точечные расчеты именно в те моменты, когда они реально должны быть выполнены" все наладится
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Олег, модуль не может ни начать работу, ни завершить её. А вот процедура (макрос), которая находится в модуле - может. Привыкайте к правильной терминологии. То, что Вы называете ГЛАВНЫМ модулем, принято называть стандартным (обычным) модулем.
и примера тут не будет скорее всего с какой-то торговой площадки по 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
Этот вариант мне не подходит. Он работает именно для данного примера. Пример синтетический. Вызов по таймеру неприемлем, так как в процессе выполнения нужно обрабатывать события по приходу данных с TCP порта с минимальной задержкой. Нужна нормальная многозадачность, тем более что все работает до тех пор пока не закроешь какой-нибудь файл Excel. Вопрос был именно: "Почему выполнение кода завершается после закрытия другой книги?".
вы взяли не тот инструмент. понимаете, не возможно в ванной сделать водоворот опустив в воду бытовой вентилятор (на выходе получите вышедший из строя вентилятор и отсутвие водоворота в ванной)
откройте это все в отдельном экземпляре Excel. сверните его, спрячьте иконку и не заглядывайте туда, пусть себе шуршит
Ігор Гончаренко написал: вы взяли не тот инструмент. понимаете, не возможно в ванной сделать водоворот опустив в воду бытовой вентилятор
Нет, не понимаю. Я задал вопрос. Если у вас нет на него ответа, то вполне логично просто промолчать, а не напускать на себя загадочной таинственности, рассуждая о вентиляторах в ванной.
извините, но и вы могли бы с высоты ваших знаний о работе Excel не обращать внимание на реплики дилетантов, пытающихся за счет напускания таинственности в своих сообщениях, выглядеть более значащими, чем они есть на самом деле)) удачи!
Хорошо. Попробую ещё раз. Файл прилагается. В первой ячейке фоном выводится текущее время. Ничего хитрого. Так оно и выводится, никому не мешая, пока мы не закроем какую-нибудь другую книгу. Собственно в этом и вопрос: Почему выполнение макроса прекращается после закрытия любой книги и как от этого избавиться?
Еще раз хочу заметить, я не преследую именно эту задачу по выводу времени в ячейку. Её можно реализовать сотней способов не создавая подобной проблемы. Интересует именно проблема завершения макроса в подобных случаях.
Посмотрите в Диспетчере задач загрузку, когда отрабатывает Ваш макрос.
Необходимо добавить хотя бы минимальную задержку. 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
Смысл понятен. Но к сожалению не помогает. Проблема похоже в другом, как мне кажется после закрытия любой книги VBA теряет точку входа в DoEvents и останавливает выполнение макросов. Понять бы еще, баг это или фича.
2. откройте новую книгу 3. поставьте курсор в ранее скопированный макрос, нажмите F8 (название Sub StopM теперь на желтом фоне) 4. закройте книгу открытую в п.2 куда девалась желтая строка, появившаяся было после нажатия F8? хотя... понятно (это потерялась точка входа в DoEvents)
а вообще в теме:
Цитата
После закрытия книги завершается работа макроса в другой книге.
как бы нет вопроса, есть утверждение... ну, да закрывается, все именно так и работает
Добавил в Ваш файл изменения, указанные в #19. Открыл в версии Excel 2019 (64-). Открыл и закрыл с десяток книг - часы в ячейке A1 продолжают "тикать".
Ігор Гончаренко написал: понятно (это потерялась точка входа в DoEvents)
Рад, что вам это понятно. Действительно отладчик в VBA использует тот же функционал, что и при реализации многозадачности в макросах посредством DoEvents. Удивительно, что вам не было об этом известно.