web-dev-qa-db-fra.com

ENTER pour une cellule utilisée par VBA pour Excel

J'ai une cellule choisie dynamiquement qui sera remplie d'informations que je vais mettre et quand je mets l'information et ENTER en appuyant sur une touche dans cette cellule;

1 - cela devrait déclencher une macro

'macro(value)
macro1 myinfo

2 - la macro devrait avoir l'information dans cette cellule

myinfo = Cells( i, j )

Alors, comment puis-je y arriver?

10
Berker Yüceer

Pour capturer une touche spécifique sur laquelle vous appuyez, vous avez besoin de la méthode 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.

Ce qui précède indique que myMacro doit être exécuté lorsque le Enter la touche est enfoncée. La méthode OnKey doit être appelée une seule fois. Vous pouvez le mettre dans l'événement Workbook_Open:

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

Pour arrêter de capturer le Enter clé,

Application.OnKey "{ENTER}"

Pour vérifier si Enter a été pressé alors que sur la cellule A1, vous pouvez faire ceci:

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

Maintenant pour détecter si Enter a été enfoncé dans une cellule spécifique uniquement si cette cellule a été modifiée , nous devons être un peu malins. Supposons que vous modifiez une valeur de cellule et que vous appuyez sur Entrée. La première chose qui est déclenchée est la macro OnKey, puis l'événement Worksheet_Change est déclenché. Vous devez donc d'abord "enregistrer les résultats" de OnKey, puis gérer l'événement Worksheet_Change en fonction de ces résultats.

Initiez OnKey comme ceci: Application.OnKey "{ENTER}", "recordEnterKeypress"

Dans votre module de code, vous auriez ceci:

Public enterWasPressed As Boolean

Sub recordEnterKeypress()
    enterWasPressed = True
End Sub

La modification de la cellule sera capturée par l'événement 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

Maintenant, le code ci-dessus fait ce que vous demandez dans la question, mais je tiens à répéter: votre question ressemble terriblement à un problème de XY . Pourquoi voulez-vous détecter le Enter touche enfoncée? Faites-nous savoir et nous pourrions peut-être suggérer des alternatives.

18

provoquer une macro mal démarrer quand un code de stock saisi dans cette cellule et donner les informations de ce stock dans les commandes Excel et Worksheet_Change ou Change ne le fera que se mettre en boucle événement encore et encore .. - Berker Yüceer Il y a 31 mins

Berker,

Pour cela, vous n'avez pas besoin d'intercepter la touche "ENTER". Disons que vous tapez le code de stock et qu'au lieu d'appuyer sur ENTREE, vous avez cliqué sur une autre cellule. Ne souhaiteriez-vous pas que la macro soit également déclenchée dans ce scénario? Si oui, alors essayez le code ci-dessous. Je suppose que la macro doit s'exécuter lorsque le code de stock est entré dans la cellule 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

EDIT: Je vois que vous avez déjà sélectionné votre réponse :)

6
Siddharth Rout

utiliser un événement de changement de feuille de calcul;

quelque chose comme ci-dessous,

Private Sub Worksheet_Change(ByVal Target As Range)

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

    End If
End Sub

Placez ce code dans le module de feuille de calcul correspondant.

3
Jilji

MERCI TRÈS BEAUCOUP pour cela et je change un peu comme suit:

Dim oldvalue As String Dim newvalue As String Private Sub Worksheet_Change (Cible ByVal comme plage) En cas d'erreur 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

Nous allons continuer: Avec application .ScreenUpdating = True .EnableEvents = True Terminer par

Exit Sub

Whoa: MsgBox Err.Description Reprendre LetsContinue End Sub

cela vous donnera une chance de changer n'importe quelle cellule dans l'intervalle d'une certaine valeur (je veux que la valeur de la cellule soit multipliée par le facteur une fois que la valeur des cellules est changée et me montre un message qui donnera l'ancienne et la nouvelle valeur,

a la meilleure chance

0
engmgs