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