Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/vba асинхронное выполнение макроса - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » vba асинхронное выполнение макроса (Макросы/Sub)
vba асинхронное выполнение макроса
Nikitato Дата: Понедельник, 17.10.2016, 18:49 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Всем привет)

Макрос заполняют таблицу данными из GET Http запроса, который программа запрашивает до тех пор, пока он что то вернет. Проверяется циклом, если запрос пустой, то повторить запрос.
Из - за того, что запрос не сразу возвращает данные ( а деать он это может достаточно долго), виснет весь Excel.
Вопрос в том, есть ли какой-нибудь способ длеать эти запросы асинхронно, т.е. так, что бы при этом не висла вся программа?

Заранее спасибо)
 
Ответить
СообщениеВсем привет)

Макрос заполняют таблицу данными из GET Http запроса, который программа запрашивает до тех пор, пока он что то вернет. Проверяется циклом, если запрос пустой, то повторить запрос.
Из - за того, что запрос не сразу возвращает данные ( а деать он это может достаточно долго), виснет весь Excel.
Вопрос в том, есть ли какой-нибудь способ длеать эти запросы асинхронно, т.е. так, что бы при этом не висла вся программа?

Заранее спасибо)

Автор - Nikitato
Дата добавления - 17.10.2016 в 18:49
Udik Дата: Понедельник, 17.10.2016, 19:02 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Насчет асинхронности не знаю, но может вызывать DoEvents в цикле.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
СообщениеНасчет асинхронности не знаю, но может вызывать DoEvents в цикле.

Автор - Udik
Дата добавления - 17.10.2016 в 19:02
SLAVICK Дата: Вторник, 18.10.2016, 09:20 | Сообщение № 3
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Чтоб именно асинхронно - нужно application.ontime, запускать в новых приложениях excel через:
[vba]
Код
Set app = New Application
[/vba]
Только вряд ли Вам это нужно.
а чтобы не зависал, как уже сказал Udik - используйте DoEvents ... только если цикл очень длинный(много раз повторяется) - лучше использовать DoEvents с шагом раз в 100,(1000).
Для этого нужно что - то типа:
[vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba]


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеЧтоб именно асинхронно - нужно application.ontime, запускать в новых приложениях excel через:
[vba]
Код
Set app = New Application
[/vba]
Только вряд ли Вам это нужно.
а чтобы не зависал, как уже сказал Udik - используйте DoEvents ... только если цикл очень длинный(много раз повторяется) - лучше использовать DoEvents с шагом раз в 100,(1000).
Для этого нужно что - то типа:
[vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba]

Автор - SLAVICK
Дата добавления - 18.10.2016 в 09:20
Nikitato Дата: Вторник, 18.10.2016, 12:42 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
а чтобы не зависал, как уже сказал Udik - используйте DoEvents ... только если цикл очень длинный(много раз повторяется) - лучше использовать DoEvents с шагом раз в 100,(1000).
Для этого нужно что - то типа:
If i Mod 100 = 0 Then DoEvents

Спасибо за помощь!

Да, так действительно лучше, по крайней мере окно программы мутнеет только периодически ( видиммо из-за времени выполнения одного запроса ). Но во время выполнения цикла с DoEvents все ранво ничего нельзя сделать ( максимум окно подвигать ), поэтому это особо не решает вопрос. На сколько я понимаю, то DoEvents на веремя выполнения этого цикла дает пользователю рабоать с книгой ( хотя у меня что то не выходит), но все равно, после этого, программа виснет из-за времени выполнения запроса, а хотелось бы, что бы в это время можно было бы хотябы с другими открытыми книгами работать.
На всякий случай прикреплю цикл:
[vba]
Код
lable1:
For k = 1 To 150000
If k Mod 100 = 0 Then
DoEvents
End If
Next k

Resp = httpGET(URL, Token)

If Resp = "" Then GoTo lable1
[/vba]
Получается, что выполнение долгого Http запроса загружает excel, и нет способа делать это как то сохраняя доступ к функционалу программы?
 
Ответить
Сообщение
а чтобы не зависал, как уже сказал Udik - используйте DoEvents ... только если цикл очень длинный(много раз повторяется) - лучше использовать DoEvents с шагом раз в 100,(1000).
Для этого нужно что - то типа:
If i Mod 100 = 0 Then DoEvents

Спасибо за помощь!

Да, так действительно лучше, по крайней мере окно программы мутнеет только периодически ( видиммо из-за времени выполнения одного запроса ). Но во время выполнения цикла с DoEvents все ранво ничего нельзя сделать ( максимум окно подвигать ), поэтому это особо не решает вопрос. На сколько я понимаю, то DoEvents на веремя выполнения этого цикла дает пользователю рабоать с книгой ( хотя у меня что то не выходит), но все равно, после этого, программа виснет из-за времени выполнения запроса, а хотелось бы, что бы в это время можно было бы хотябы с другими открытыми книгами работать.
На всякий случай прикреплю цикл:
[vba]
Код
lable1:
For k = 1 To 150000
If k Mod 100 = 0 Then
DoEvents
End If
Next k

Resp = httpGET(URL, Token)

If Resp = "" Then GoTo lable1
[/vba]
Получается, что выполнение долгого Http запроса загружает excel, и нет способа делать это как то сохраняя доступ к функционалу программы?

Автор - Nikitato
Дата добавления - 18.10.2016 в 12:42
_Boroda_ Дата: Вторник, 18.10.2016, 12:56 | Сообщение № 5
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
хотелось бы, что бы в это время можно было бы хотябы с другими открытыми книгами работать.

Откройте другой экземпляр Excel и работайте. Правда, иногда можно нарваться таким образом, но обычно все нормально проходит.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
хотелось бы, что бы в это время можно было бы хотябы с другими открытыми книгами работать.

Откройте другой экземпляр Excel и работайте. Правда, иногда можно нарваться таким образом, но обычно все нормально проходит.

Автор - _Boroda_
Дата добавления - 18.10.2016 в 12:56
SLAVICK Дата: Вторник, 18.10.2016, 14:35 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Откройте другой экземпляр Excel и работайте. ....
иногда можно нарваться таким образом, но обычно все нормально проходит.

у меня чаще все проходит через "нарваться" :) . нормально параллельно работать с макросами и надстройками не выходит - часто выкидывает ошибки.
и нет способа делать это как то сохраняя доступ к функционалу программы?

нашел 100-о рабочий вариант(для себя):
установил virtualbox - и такие файлы запускаю на нем - тогда он там себе ворочается сколько хочет и работать не мешает. :D .


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Откройте другой экземпляр Excel и работайте. ....
иногда можно нарваться таким образом, но обычно все нормально проходит.

у меня чаще все проходит через "нарваться" :) . нормально параллельно работать с макросами и надстройками не выходит - часто выкидывает ошибки.
и нет способа делать это как то сохраняя доступ к функционалу программы?

нашел 100-о рабочий вариант(для себя):
установил virtualbox - и такие файлы запускаю на нем - тогда он там себе ворочается сколько хочет и работать не мешает. :D .

Автор - SLAVICK
Дата добавления - 18.10.2016 в 14:35
Udik Дата: Вторник, 18.10.2016, 15:22 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
На всякий случай прикреплю цикл:

так правильно у Вас не получается. Вы отрабатываете цикл с DoEvents, а потом делаете запрос.
На приведенном кусочке должно быть как-то так
[vba]
Код

lable1:
k=k+1
If k Mod 100 = 0 Then DoEvents

Resp = httpGET(URL, Token)

If Resp = "" Then GoTo lable1
[/vba]


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com


Сообщение отредактировал Udik - Вторник, 18.10.2016, 15:24
 
Ответить
Сообщение
На всякий случай прикреплю цикл:

так правильно у Вас не получается. Вы отрабатываете цикл с DoEvents, а потом делаете запрос.
На приведенном кусочке должно быть как-то так
[vba]
Код

lable1:
k=k+1
If k Mod 100 = 0 Then DoEvents

Resp = httpGET(URL, Token)

If Resp = "" Then GoTo lable1
[/vba]

Автор - Udik
Дата добавления - 18.10.2016 в 15:22
Nikitato Дата: Среда, 19.10.2016, 15:01 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
C DoEvents, все равно не выходит.

Нашёл интересную статью о том, как возможно это осуществить несколькими способами.

Multithreading VBA

Сам еще особо не разобрался, но думаю попробовать VBS метод, где в VBA коде можно создать скрипт, который будет выполнять это отдельно от excel, а подом загружать в него.
 
Ответить
СообщениеC DoEvents, все равно не выходит.

Нашёл интересную статью о том, как возможно это осуществить несколькими способами.

Multithreading VBA

Сам еще особо не разобрался, но думаю попробовать VBS метод, где в VBA коде можно создать скрипт, который будет выполнять это отдельно от excel, а подом загружать в него.

Автор - Nikitato
Дата добавления - 19.10.2016 в 15:01
Мир MS Excel » Вопросы и решения » Вопросы по VBA » vba асинхронное выполнение макроса (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!