Ich habe eine dynamisch ausgewählte Zelle, die mit einigen Informationen gefüllt wird, die ich setzen werde, und wenn ich die Informationen stelle und ENTER gedrückt in dieser Zelle;
1 - es sollte ein Makro auslösen
'macro(value)
macro1 myinfo
2 - Makro sollte die Informationen in dieser Zelle erhalten
myinfo = Cells( i, j )
Wie kann ich das erreichen?
Um eine bestimmte gedrückte Taste zu erfassen, benötigen Sie die Methode 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.
Das oben Gesagte besagt, dass myMacro
ausgeführt werden muss, wenn Enter Taste wird gedrückt. Die Methode OnKey
muss nur einmal aufgerufen werden. Sie können es in das Ereignis Workbook_Open
einfügen:
Private Sub Workbook_Open()
Application.OnKey "{ENTER}", "myMacro"
End Sub
So beenden Sie die Erfassung der Enter Schlüssel,
Application.OnKey "{ENTER}"
Um zu überprüfen, ob Enter gedrückt wurde, während in Zelle A1, können Sie dies tun:
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
Nun zu erkennen, ob Enter Wurde in einer bestimmten Zelle nur gedrückt, wenn diese Zelle bearbeitet wurde , müssen wir ein bisschen clever sein. Angenommen, Sie bearbeiten einen Zellenwert und drücken die Eingabetaste. Das erste, was ausgelöst wird, ist das Makro OnKey
, und danach wird das Ereignis Worksheet_Change
ausgelöst. Sie müssen also zuerst die Ergebnisse von OnKey
"speichern" und dann das Ereignis Worksheet_Change
basierend auf diesen Ergebnissen behandeln.
Initiiere OnKey
wie folgt: Application.OnKey "{ENTER}", "recordEnterKeypress"
In Ihrem Codemodul hätten Sie Folgendes:
Public enterWasPressed As Boolean
Sub recordEnterKeypress()
enterWasPressed = True
End Sub
Die Zellenbearbeitung wird vom Ereignis Worksheet_Change
erfasst:
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
Jetzt macht der obige Code, was Sie in der Frage fragen, aber ich möchte noch einmal wiederholen: Ihre Frage klingt schrecklich wie ein XY-Problem . Warum möchten Sie das erkennen? Enter Taste gedrückt? Lassen Sie es uns wissen und vielleicht können wir Ihnen Alternativen vorschlagen.
ursache Wird ein Makro gestartet, wenn ein Aktiencode in dieser Zelle eingegeben wird, und die Informationen zu diesem Aktienbestand in Excel angegeben werden, wird der Befehl nur in eine Schleife geraten, wenn die in den Zellen geparsten Aktieninformationen Change auslösen Ereignis immer und immer .. - Berker Yüceer vor 31 Minuten
Berker,
Dazu müssen Sie die "ENTER" -Taste nicht abfangen. Angenommen, Sie geben den Aktiencode ein und statt ENTER zu drücken, haben Sie auf eine andere Zelle geklickt. Möchten Sie nicht, dass das Makro auch in diesem Szenario ausgelöst wird? Wenn ja, probieren Sie den folgenden Code aus. Ich gehe davon aus, dass das Makro ausgeführt werden muss, wenn der Aktiencode in Zelle A1 eingegeben wird.
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
EDIT: Ich sehe, dass du deine Antwort bereits ausgewählt hast :)
arbeitsblattänderungsereignis verwenden;
etwas als unten,
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
' call your sub
End If
End Sub
Fügen Sie diesen Code in das entsprechende Arbeitsblattmodul ein.
DANKE SEHR Vieles für dieses und ich ändere mich ein bisschen wie folgt:
Dim oldvalue As String Dim newvalue As String Private Sub Worksheet_Change (ByVal Target As Range) Bei Fehler 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
Lass uns weitermachen: Mit der Bewerbung .ScreenUpdating = True .EnableEvents = True Ende mit
Exit Sub
Whoa: MsgBox Err.Description LetsContinue fortsetzen End Sub
das gibt Ihnen die Möglichkeit, jede Zelle innerhalb des Bereichs um einen bestimmten Wert zu ändern (ich möchte, dass der Zellenwert mit dem Faktor multipliziert wird, sobald der Zellenwert geändert wird, und zeigt eine Meldung an, die alten und neuen Wert ergibt.)
prostbestes Glück