Как определить событие нажатия клавиши ВВОД для динамически выбранной ячейки в VBA для Excel - PullRequest
10 голосов
/ 21 февраля 2012

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

1 - должен вызывать макрос

'macro(value)
macro1 myinfo

2 - макрос должен получить информацию в этой ячейке

myinfo = Cells( i, j )

Так, как я могу достигнуть этого?

Ответы [ 4 ]

18 голосов
/ 21 февраля 2012

Чтобы зафиксировать нажатие определенной клавиши, вам нужен метод OnKey:

Application.OnKey "~", "myMacro" ' for the regular enter key
' or if you want Enter from the numeric keypad:
' Application.OnKey "{ENTER}", "myMacro"
' Below I'll just assume you want the latter.

Выше указано, что myMacro должен выполняться при нажатии клавиши Enter . Метод OnKey нужно вызывать только один раз. Вы можете поместить это в событие Workbook_Open:

Private Sub Workbook_Open()
    Application.OnKey "{ENTER}", "myMacro"
End Sub

Чтобы прекратить ввод ключа Введите ,

Application.OnKey "{ENTER}"

Чтобы проверить, была ли нажата Enter в ячейке A1, вы можете сделать следующее:

Sub myMacro()
    If Not Intersect(Selection, Range("A1")) Is Nothing Then
    ' equivalent to but more flexible and robust than
    'If Selection.Address = "$A$1" Then
        MsgBox "You pressed Enter while on cell A1."
    End If
End Sub

Теперь, чтобы определить, была ли нажата Enter в определенной ячейке , только если эта ячейка была отредактирована , мы должны быть немного умны. Допустим, вы редактируете значение ячейки и нажимаете Enter. Первое, что запускается, это макрос OnKey, а после этого запускается событие Worksheet_Change. Поэтому сначала нужно «сохранить результаты» OnKey, а затем обработать событие Worksheet_Change на основе этих результатов.

Инициировать OnKey так: Application.OnKey "{ENTER}", "recordEnterKeypress"

В вашем кодовом модуле у вас будет это:

Public enterWasPressed As Boolean

Sub recordEnterKeypress()
    enterWasPressed = True
End Sub

Редактирование ячейки будет зафиксировано событием Worksheet_Change:

Private Sub Worksheet_Change(ByVal Target As Range)
    If enterWasPressed _
        And Not Intersect(Target, Range("A1")) Is Nothing Then
        MsgBox "You just modified cell A1 and pressed Enter."
    End If
    enterWasPressed = False 'reset it
End Sub

Теперь приведенный выше код выполняет то, что вы задаете в вопросе, но я хотел бы повторить: ваш вопрос звучит ужасно, как XY проблема . Почему вы хотите обнаружить нажатие клавиши Enter ? Дайте нам знать, и, возможно, мы сможем предложить альтернативы.

6 голосов
/ 21 февраля 2012

вызывает неправильный запуск макроса, когда код акции, введенный в эту ячейку, и предоставление информации об этой акции в командах excel и Worksheet_Change или Change приведет к тому, что он попадет в цикл только тогда, когда информация о запасе будет проанализирована в ячейках. снова и снова будет вызывать событие Change .. - Berker Yüceer 31 мин. назад

Berker,

Для этого вам не нужно перехватывать клавишу «ENTER». Допустим, вы вводите Stock Code и вместо нажатия ENTER нажимаете на другую ячейку. Разве вы не хотели бы, чтобы макрос запускался в этом сценарии? Если да, то попробуйте код ниже. Я предполагаю, что макрос должен запускаться при вводе кода запаса в ячейку A1.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    '~~> This line ensure that the code will enter into the
    '~~> block only if the change happened in Cell A1
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Application.EnableEvents = False

        '
        ' ~~> Put your macro code here or run your macro here
        '
    End If

LetsContinue:
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With

    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

РЕДАКТИРОВАТЬ : Я вижу, вы уже выбрали свой ответ:)

3 голосов
/ 21 февраля 2012

использовать событие изменения рабочего листа;

что-то, как показано ниже,

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$A$1" Then
        ' call your sub

    End If
End Sub

Поместите этот код в соответствующий модуль рабочего листа.

0 голосов
/ 16 мая 2013

СПАСИБО ОЧЕНЬ много за это, и я делаю, я немного меняю его следующим образом:

Dim oldvalue As String Dim newvalue As String Private Sub Worksheet_Change (ByVal Target As Range) При ошибке GoTo Whoa

With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

'~~> This line ensure that the code will enter into the
'~~> block only if the change happened in Cell A1
If Not Intersect(Target, Range("A:D")) Is Nothing Then
    Application.EnableEvents = False

    '
    ' ~~> Put your macro code here or run your macro here
    '
    oldvalue = Range(Target.Address).Value
    Range(Target.Address).Value = Range(Target.Address).Value * 2.33
    newvalue = Range(Target.Address).Value
    MsgBox ("value changed from  " & oldvalue & "  to  " & newvalue)
End If

LetsContinue: с приложением .ScreenUpdating = True .EnableEvents = True Конец с

Exit Sub

Вау: MsgBox Err.Description Resume LetsContinue End Sub

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

ура лучше всегоудачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...