Excel — определяет, нажаты ли две определенные клавиши одновременно

Я не знаю, возможно ли это. Я работаю с Excel и использую скрипт VB. Есть ли способ определить, нажаты ли две клавиши одновременно и какие они? Тогда, если нажаты именно эти клавиши, я могу использовать оператор If/Then для выполнения любых процессов, которые мне нужно выполнить?

Я знаю, что если у меня есть что-то вроде поля со списком, я могу использовать функцию нажатия клавиши для обнаружения нажатия одной клавиши, но это будет работать только для одной клавиши, а не для двух клавиш. Кроме того, я не использую поля со списком, текстовые поля или что-либо еще. Я строго использую ячейки, поэтому, похоже, нет ничего похожего на нажатие клавиши, чтобы обнаружить даже нажатие одной клавиши.

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

Пожалуйста, дайте мне знать, возможно ли это или нет, но у меня такое чувство, что это невозможно.


person Chris    schedule 05.11.2013    source источник
comment
Вы смотрели на функцию VBA OnKey? Это будет работать для чего-то с Ctrl, Shift и другими подобными клавишами в сочетании с обычными клавишами, такими как A.   -  person Doug Glancy    schedule 05.11.2013
comment
Спасибо, это кажется хорошим началом, и нет, я не пытался использовать это. Ищу информацию по нему. Проблема в том, что я не могу понять, где разместить событие onkey. Кажется, нет никаких опций, которые вызовут это при нажатии клавиш. Я поместил маркер рядом с ним, поэтому при запуске кода он будет приостановлен на этом маркере, но ничего не вызовет этого, пока я нажимаю клавиши. Я вижу статьи, в которых люди используют это в Excel через надстройку, созданную ими в Visual Studios, но мне нужно выяснить, как сделать это непосредственно в Excel без использования надстройки.   -  person Chris    schedule 05.11.2013
comment
Я разобрался, спасибо. Я должен поместить команду «onkey» в ThisWorkbook, когда она откроется. Поэтому я бы поместил его в «Private Sub Workbook_Open()». Затем мне нужно создать подпрограмму в ThisWorkbook и сослаться на нее. Для выполнения ключевой процедуры обязательно укажите «ThisWorkbook.Routine», где «Routine» — это имя новой подкатегории. В противном случае вы можете создать модуль и как бы вы ни называли Sub, тогда вы не будете указывать «ThisWorkbook.Routine», просто укажите «Routine». Однако я не хотел использовать модуль. Спасибо, что сообщили мне о ключе!   -  person Chris    schedule 05.11.2013
comment
Это почти работает так, как я хочу. Я открыл другую книгу для проверки, она переносится в другую открытую книгу. Я хочу, чтобы он работал только для конкретной книги, а не для всех открытых книг. Затем, если я закрою книгу с кодом и нажму эти клавиши в другой книге, она снова откроет книгу с кодом в ней. Чтобы ключи перестали работать, мне нужно закрыть все сеансы Excel. Есть ли способ сделать так, чтобы этот код строго относился к этой книге, а не ко всем книгам?   -  person Chris    schedule 05.11.2013


Ответы (1)


Дуг,

Спасибо за ваше предложение, я понял все благодаря этому. Вот он, на случай, если кому-то это покажется полезным:

    Private Sub Workbook_Activate()

    'When the workbook is active this will run the script in the place of the standard Ctrl + C.
    Application.onkey "^{c}", "ThisWorkbook.cCopy"

    End Sub


    Private Sub Workbook_Deactivate()

    'When another workbook is active this will disable this script so the standard Ctrl + C will work again.
    Application.onkey "^{c}"

    End Sub


    Sub cCopy()

    'This is the script to run when active. This was used for testing purposes only.   
    Worksheets("Sites").Range("I1").Value2 = "Yes"

    End Sub
person Chris    schedule 05.11.2013