Перейти к содержимому

- - - - -

Excel - Вопросы и ответы. (1. Запрет пересчета одной ячейки в Эксель)


Сообщений в теме: 27

#26 Psw Отправлено 24 Март 2012 - 13:39

  • Не Бритое Зло

Короче непонятно.
Вначале нагуглил что
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal VKEY As Long) As Integer
будет опрашивать клаву, чутка не так как Inkey$ но вполне подходит для моих целей.
Вставил в начало большого циклера
For I = 1 To 30
Cells(TabTop + I, 3).Value = GetAsyncKeyState(I)
Next I
и для более быстрого отображения результатов заремил
'Application.ScreenUpdating = False
увидел что нажатие "Enter" в соседнем окне вызывает изменение возвращаемого значения GetAsyncKeyState(13)
А потом уже увидел что ОКАЗЫВАЕТСЯ моё окошко с экселем медленно но реагирует на перемещения выделенной ячейки стрелками например.
И заработала кнопка "стоп" привязанная к функции, стала останавливать (в каждом обороте главного циклера вызывается DoEvents() )
А когда раньше пробовал (отлаживал правда в RDP сессии) - вроде не прокатывало.
Короче позже ещё раз попробую на том самом компе позапускать.
Но пока что - (на локальном компе) - проблема разрешилась через DoEvents похоже ;)


#27 Джамес Буль Отправлено 24 Март 2012 - 16:00

  • новичок

блин вот вам не лень мозги ломать и использовать грабли :)
можно и из велосипеда делать камаз только зачем?
у каждой программы свое назначение и свои сильные и слабые стороны

VBA в Excel это средства автоматизации работы в Excel
Ну ладно хочется делать сетевую программу на базе табличного процессора
хорошо
но этоже программа работающая по правилам ОС Виндафс
и VBA среда выполнения высокого уровня
всякие инкейсы и ловля событий руками это средний и низкий уровень
на высоком уровне это ненужно ваще
у кнопки есть готовые события где можно написать строчку кода
что еще нужно? ничего :no:

Public StopVar As Boolean
Private Sub ButtonStart_Click()
    Laba125.Left = 30
    Sheet1.StopVar = False
    Application.OnTime Now + TimeValue("00:00:01"), "sheet1.SuperAga"
End Sub
Public Sub SuperAga()
    '------------------
    Laba125.Left = Laba125.Left + 5
    If Laba125.Left > 200 Then Laba125.Left = 30
    '------------------
    If Sheet1.StopVar = False Then Application.OnTime Now + TimeValue("00:00:01"), "sheet1.SuperAga"
End Sub
Private Sub ButtonStop_Click()
    Sheet1.StopVar = True
End Sub

Название рабочего листа книги Sheet1
на него кидаю любой контрол с именем Laba125
и пару кнопок ButtonStop и ButtonStart

При нажатии кнопки старт начинается ежесекундно выполняться процедура SuperAga
в которой между линиями комментов целевой код
в примере просто контрол Laba125 тупо двигается по экрану

Када надавим на кнопку ButtonStop последующие вызовы процедуры отключаются
это правильный код и без извращений :rolleyes:
Анархия - мать порядка

#28 Psw Отправлено 25 Март 2012 - 09:15

  • Не Бритое Зло

Просмотр сообщенияДжамес Буль (24 Март 2012 - 16:00) писал:

у кнопки есть готовые события где можно написать строчку кода
что еще нужно? ничего :no:
Так согласен уже, я с этого и начал, тока не работало нифига, ибо события просто не порождались ;) DoEvents() помогло, но на локальной машине.
В RDP сессии - проверю на недельке. Но общий путь вполне понятен и без извратов - учащать вызовы DoEvents до требуемой скорости реакции на события в самом Excel. Возможно и по таймеру её вызывать - красивее будет.
А про аналог InKey$ из USER32.DLL я просто наткнулсо в гугеле, ибо в старых бэйсиках проблема реакции кода на нажатия кнопок решалась именно так, и люди по привычке идут этой дорогой, не я один.
И кстати - все объяснялки что "разные среды" - тока отговорки, ибо кроме лени ничего не мешало мелкомягкому реализовать InKey$ в VB/VBA. Зато большое спасибо за механизм вызова/использования функций из внешних библиотек/DLL - ибо описывать в массивах/константах двоичный код и передавать ему управление - не особо красиво было ;)
Так что - всем спасибо за советы, мой вопрос про InKey$ и про прерывание работы скрипта вроде разрешилсо, несколькими путями ;)





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей