Как я могу определить событие с нажатой клавишей ENTER для динамически выбранной ячейки в VBA для Excel

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

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

'macro(value)
macro1 myinfo

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

myinfo = Cells( i, j )

Итак, как я могу добиться этого?

Ответ 1

Чтобы записать конкретный нажатый ключ, вам понадобится метод 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

Чтобы остановить захват клавиши Enter,

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 была нажата? Сообщите нам и, возможно, мы можем предложить альтернативы.

Ответ 2

  
    

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

    

Berker,

Для этого вам не нужно ловить ключ "ENTER". Скажем, вы вводите код запаса и вместо нажатия 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

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

некоторые вещи, как показано ниже,

Private Sub Worksheet_Change(ByVal Target As Range)

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

    End If
End Sub

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

Ответ 4

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

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

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

веселит удача