webentwicklung-frage-antwort-db.com.de

Wie kann ich ein Ereignis mit EINGABETASTE für eine dynamisch ausgewählte Zelle in VBA für Excel definieren?

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?

10
Berker Yüceer

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 :)

6
Siddharth Rout

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.

3
Jilji

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

0
engmgs