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