web-dev-qa-db-ja.com

VBA for Excelで動的に選択されたセルのEnterキーを押したイベントを定義するにはどうすればよいですか

私は動的に選択されたセルを取得しました。これは、入力する情報と、情報を入力するとENTER keypressedそのセルで;

1-マクロをトリガーする必要があります

'macro(value)
macro1 myinfo

2-マクロはそのセルの情報を取得する必要があります

myinfo = Cells( i, j )

どうすればそれを達成できますか?

10
Berker Yüceer

押されている特定のキーをキャプチャするには、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 [〜#〜]:回答をすでに選択しているようです:)

6
Siddharth Rout

ワークシート変更イベントを使用します。

以下のようなもの、

Private Sub Worksheet_Change(ByVal Target As Range)

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

    End If
End Sub

このコードを対応するワークシートモジュールに配置します。

3
Jilji

このために非常に感謝し、私はそれを次のように少し変更します:

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

これにより、範囲内の任意のセルを特定の値で変更する機会が得られます(セルの値が変更されると、セルの値に係数を乗算し、古い値と新しい値を示すメッセージを表示します。

頑張って乾杯

0
engmgs