Страница 1 из 1

keypressed v VBA

Добавлено: 25 ноя 2009, 16:07
pilligrim
Подскажите пожалуйста,
Как можно реализовать аналог кода VB

Код: Выделить всё

Do Until Keypressed
в VBA
не могу найти :confused: а хочется повторять пока не нажмут кнопку.

Re: keypressed v VBA

Добавлено: 25 ноя 2009, 17:08
Teslenko_EA
Здравствуйте pilligrim.
команды (или оператора) Keypressed в VBA не существует, как в прочем и в VB.
Скорее всего это булевая переменная, а нажатие кнопки инвертирует её значение.
Евгений.

Re: keypressed v VBA

Добавлено: 25 ноя 2009, 17:36
EducatedFool
а хочется повторять пока не нажмут кнопку.
Какую кнопку? Любую?
Если любую, то код будет сложным - придётся средствами WinAPI опрашивать клавиатуру...

Пример кода:

Код: Выделить всё

[color=green]'============= Функции для определения нажатой клавиши =================================[/color]
[color=darkblue]Public[/color] [color=darkblue]Declare[/color] [color=darkblue]Function[/color] GetKeyState [color=darkblue]Lib[/color] "user32" ([color=darkblue]ByVal[/color] nVirtKey [color=darkblue]As[/color] VirtualKeys) [color=darkblue]As[/color] [color=darkblue]Integer[/color]

[color=darkblue]Public[/color] [color=darkblue]Enum[/color] VirtualKeys    [color=green]' Virtual Keys, Standard Set[/color]
    VK_LBUTTON = &H1: VK_RBUTTON = &H2: VK_CANCEL = &H3: VK_MBUTTON = &H4    [color=green]'VK_MBUTTON = &H4 -  NOT contiguous with L RBUTTON[/color]
    VK_BACK = &H8: VK_TAB = &H9: VK_CLEAR = &HC: VK_RETURN = &HD
    VK_SHIFT = &H10: VK_CONTROL = &H11: VK_MENU = &H12: VK_PAUSE = &H13: VK_CAPITAL = &H14: VK_ESCAPE = &H1B
    VK_SPACE = &H20: VK_PRIOR = &H21: VK_NEXT = &H22: VK_END = &H23: VK_HOME = &H24
    VK_LEFT = &H25: VK_UP = &H26: VK_RIGHT = &H27: VK_DOWN = &H28: VK_SELECT = &H29: VK_PRINT = &H2A
    VK_EXECUTE = &H2B: VK_SNAPSHOT = &H2C: VK_INSERT = &H2D: VK_DELETE = &H2E: VK_HELP = &H2F

    [color=green]' VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z'[/color]
    [color=green]' VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '9'[/color]

    VK_NUMPAD0 = &H60: VK_NUMPAD1 = &H61: VK_NUMPAD2 = &H62: VK_NUMPAD3 = &H63: VK_NUMPAD4 = &H64: VK_NUMPAD5 = &H65: VK_NUMPAD6 = &H66: VK_NUMPAD7 = &H67: VK_NUMPAD8 = &H68: VK_NUMPAD9 = &H69
    VK_MULTIPLY = &H6A: VK_ADD = &H6B: VK_SEPARATOR = &H6C: VK_SUBTRACT = &H6D: VK_DECIMAL = &H6E: VK_DIVIDE = &H6F
    VK_F1 = &H70: VK_F2 = &H71: VK_F3 = &H72: VK_F4 = &H73: VK_F5 = &H74: VK_F6 = &H75: VK_F7 = &H76: VK_F8 = &H77: VK_F9 = &H78: VK_F10 = &H79: VK_F11 = &H7A: VK_F12 = &H7B
    VK_F13 = &H7C: VK_F14 = &H7D: VK_F15 = &H7E: VK_F16 = &H7F: VK_F17 = &H80: VK_F18 = &H81: VK_F19 = &H82: VK_F20 = &H83: VK_F21 = &H84: VK_F22 = &H85: VK_F23 = &H86: VK_F24 = &H87
    VK_NUMLOCK = &H90: VK_SCROLL = &H91

    [color=green]'   VK_L VK_R - left and right Alt, Ctrl and Shift virtual keys.[/color]
    [color=green]'   Used only as parameters to GetAsyncKeyState() and GetKeyState().[/color]
    [color=green]'   No other API or message will distinguish left and right keys in this way.[/color]
    VK_LSHIFT = &HA0: VK_RSHIFT = &HA1: VK_LCONTROL = &HA2: VK_RCONTROL = &HA3: VK_LMENU = &HA4: VK_RMENU = &HA5

    VK_ATTN = &HF6: VK_CRSEL = &HF7: VK_EXSEL = &HF8: VK_EREOF = &HF9: VK_PLAY = &HFA
    VK_ZOOM = &HFB: VK_NONAME = &HFC: VK_PA1 = &HFD: VK_OEM_CLEAR = &HFE
[color=darkblue]End[/color] [color=darkblue]Enum[/color]
[color=green]'==========================================================================================[/color]


[color=darkblue]Public[/color] [color=darkblue]Function[/color] KeyPressed([color=darkblue]ByVal[/color] VKey [color=darkblue]As[/color] VirtualKeys) [color=darkblue]As[/color] [color=darkblue]Boolean[/color]
    KeyPressed = IIf(GetKeyState(VKey) < 0, [color=darkblue]True[/color], [color=darkblue]False[/color])
[color=darkblue]End[/color] [color=darkblue]Function[/color]


[color=darkblue]Sub[/color] ПримерИспользования()
    [color=green]' запустите макрос, и в окне Immediate смотрите результат[/color]
    [color=green]' во время работы макрос понажимайте клавиши Control, Alt, Shift[/color]
    [color=green]' остановка макроса - Ctrl + Pause[/color]
    [color=darkblue]Dim[/color] ControlPressed [color=darkblue]As[/color] [color=darkblue]Boolean[/color], AltPressed [color=darkblue]As[/color] [color=darkblue]Boolean[/color], ShiftPressed [color=darkblue]As[/color] [color=darkblue]Boolean[/color]
    [color=darkblue]Do[/color]
        DoEvents
        ControlPressed = KeyPressed(VK_CONTROL)
        AltPressed = KeyPressed(VK_MENU)
        ShiftPressed = KeyPressed(VK_SHIFT)
        Debug.Print ControlPressed, AltPressed, ShiftPressed
    [color=darkblue]Loop[/color]
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
Если достаточно отловить нажатие клавиши Esc, то можно сделать проще - отобразить на время выполнения макроса какую-нибудь маленькую форму с кнопкой. При нажатии Esc форма будет закрываться, одновременно останавливая макрос.

Re: keypressed v VBA

Добавлено: 25 ноя 2009, 18:29
VictorM
Да, вопрос достаточно расплывчат...
А каков вопрос - таков ответ. Но все же посмотрите еще вот это Как отловить нажатие клавиш ESC или CTRL + BREAK ?

Re: keypressed v VBA

Добавлено: 30 ноя 2009, 02:41
pilligrim
Teslenko_EA писал(а):Здравствуйте pilligrim.
команды (или оператора) Keypressed в VBA не существует, как в прочем и в VB.
Скорее всего это булевая переменная, а нажатие кнопки инвертирует её значение.
Евгений.
Да точно. Извините за некорректное выражение и постановку вопроса.
В VB можно было делать подобный цикл:

Код: Выделить всё

Do Until Keypressed
[I]действие[/I] 
Loop
Этот код повторял действие пока на клавиатуре не нажмут anykey. Но в VBA, ввиду ограниченности, этой булевы нет. Хотел спросить кто, как решал эту проблему?
Можно даже, только на ESC привязаться.

Спасибо всем кто откликнулся. Иду тестить предложенные варианты.

Re: keypressed v VBA

Добавлено: 30 ноя 2009, 19:43
Teslenko_EA
Здравствуйте pilligrim.
образец привязан "только на ESC" (KeyAscii = 27)
проверяется событие активного контрола, на форме он один, но если будет несколько, Вы понимаете, проверок нажатия тоже должно быть несколько.
Евгений.

Re: keypressed v VBA

Добавлено: 01 дек 2009, 22:19
pilligrim
Teslenko_EA писал(а):Здравствуйте pilligrim.
образец привязан "только на ESC" (KeyAscii = 27)
проверяется событие активного контрола, на форме он один, но если будет несколько, Вы понимаете, проверок нажатия тоже должно быть несколько.
Евгений.
Гениально. Спасибо.
Мне в голову не пришло, что у некоторых контролов есть событие KeyPress. :)
Спасибо за подсказку.