私は動的に選択されたセルを取得しました。これは、入力する情報と、情報を入力するとENTER keypressedそのセルで;
1-マクロをトリガーする必要があります
'macro(value)
macro1 myinfo
2-マクロはそのセルの情報を取得する必要があります
myinfo = Cells( i, j )
どうすればそれを達成できますか?
押されている特定のキーをキャプチャするには、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 キーが押されていますか?お知らせください。多分、代替案を提案できます。
株式コードがそのセルに入力され、ExcelおよびWorksheet_ChangeまたはChangeコマンドでその株式の情報が提供されると、マクロが正しく開始されず、ループが発生します。イベントを何度も.. – BerkerYüceer31分前
バーカー、
このため、「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
[〜#〜] edit [〜#〜]:回答をすでに選択しているようです:)
ワークシート変更イベントを使用します。
以下のようなもの、
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
' call your sub
End If
End Sub
このコードを対応するワークシートモジュールに配置します。
このために非常に感謝し、私はそれを次のように少し変更します:
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:With Application .ScreenUpdating = True .EnableEvents = True End With
Exit Sub
Whoa:MsgBox Err.Description Resume LetsContinue End Sub
これにより、範囲内の任意のセルを特定の値で変更する機会が得られます(セルの値が変更されると、セルの値に係数を乗算し、古い値と新しい値を示すメッセージを表示します。
頑張って乾杯