Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 15.12.2008, 01:44   #1
Marc
 
Регистрация: 15.12.2008
Сообщений: 3
По умолчанию Как бороться с аутизмом циклов?

Мне нужно сделать выход из цикла по нажатию какой-либо клавиши.
Вставляю в тело цикла проверку нажатия на кнопку "Enter", но никакой реакции. Программа отказывается реагировать на внешнее воздействие. Только по завершению цикла идёт обработка произведённых нажатий, когда мне это уже не надо.
Почему циклы не видят управления и как с этим бороться?

Код имеет вид примерно следующий:

For x = 1 to 100
...
If KeyCode = "13" Then ...
...
Next x

Условие после Then выполняется только после завершения цикла, в данном примере когда х станет равным 100, а не сразу после нажатия.
Marc вне форума
Старый 15.12.2008, 02:09   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Только по завершению цикла идёт обработка произведённых нажатий, когда мне это уже не надо
В Вашем случае ОС просто не успевает обработать событие нажатия клавиши, так как цикл забирает почти все ресурсы процессора.

К тому же, за время выполнения цикла (при таком количестве итераций оно составит доли миллисекунды) Вы просто не успеете нажать клавишу...

Кроме того, переменная KeyCode обычно имеет тип Integer, поэтому правильнее написать KeyCode = 13 вместо KeyCode = "13"


Можно сделать так:
Код:
For x = 1 To 100
        DoEvents
        If KeyCode = 13 Then MsgBox "Нажата клавиша Enter"
Next x
В этом случае оператор DoEvents временно передаёт управление операционной системе, и, благодаря этому, нажатия клавиш будут успевать обрабатываться.


Правильнее было бы организовать обработку нажатия клавиши так:
Код:
    While KeyCode <> 13: DoEvents: Wend
    MsgBox "Нажата клавиша Enter"
В этом случае программа ничего не делает до нажатия клавиши Enter (при этом не нагружая систему)


Хотелось бы посмотреть весь код... не пойму, как внутри цикла в переменную записывается код нажатой клавиши.

Последний раз редактировалось EducatedFool; 15.12.2008 в 02:24.
EducatedFool вне форума
Старый 15.12.2008, 03:17   #3
Marc
 
Регистрация: 15.12.2008
Сообщений: 3
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
В Вашем случае ОС просто не успевает обработать событие нажатия клавиши, так как цикл забирает почти все ресурсы процессора.
Это вряд ли.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
К тому же, за время выполнения цикла (при таком количестве итераций оно составит доли миллисекунды) Вы просто не успеете нажать клавишу...
Цикл замкнут на себя, поэтому времени масса.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Кроме того, переменная KeyCode обычно имеет тип Integer, поэтому правильнее написать KeyCode = 13 вместо KeyCode = "13"
Верно, без кавычек.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Можно сделать так:
Код:
For x = 1 To 100
        DoEvents
        If KeyCode = 13 Then MsgBox "Нажата клавиша Enter"
Next x
В этом случае оператор DoEvents временно передаёт управление операционной системе, и, благодаря этому, нажатия клавиш будут успевать обрабатываться.
Я ввёл DoEvents, но идёт только перемещение по ячейкам, всё что после then по прежнему не выполняется.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Хотелось бы посмотреть весь код... не пойму, как внутри цикла в переменную записывается код нажатой клавиши.
По сути весь цикл приведён.
Я делал ещё так:
Do Until KeyCode = 13
...
Loop

Т.е. выполнять цикл пока не будет нажат Enter, но бестолку.
Marc вне форума
Старый 15.12.2008, 04:19   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Я ввёл DoEvents, но идёт только перемещение по ячейкам, всё что после then по прежнему не выполняется.
Никак не могу понять, для чего предназначен Ваш цикл... и по каким ячейкам идёт перемещение???

Каким образом код нажатой клавиши записывается в переменную KeyCode?
Обычно обработчик какого-либо события записывает значение кода нажатой клавиши в эту переменную, но вызвать в цикле обработчик вряд ли получится

Цитата:
По сути весь цикл приведён.
А вот это ещё более странно...

Опишите, чего Вы пытаетесь добиться, а также приведите ВЕСЬ код, присутствующий в документе. Так будет намного понятнее...
EducatedFool вне форума
Старый 15.12.2008, 23:00   #5
Marc
 
Регистрация: 15.12.2008
Сообщений: 3
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Никак не могу понять, для чего предназначен Ваш цикл... и по каким ячейкам идёт перемещение???
Суть задачи в получении совершенно случайного числа. Поэтому нужен искусственный выход из цикла. Как-то ведь это можно сделать? Наверно, тут нужен не KeyCode, а что-то иное.
Перемещение идёт вниз по ячейкам Excel при нажатии на Enter. Я делаю код в Excel.
Marc вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С этим надо бороться... Карась О форуме и сайтах клуба 10 01.06.2008 11:10
Проблема с организацией циклов Иринкаа Помощь студентам 7 24.11.2007 18:12