Excel 在列中按Enter键时如何触发代码

Excel 在列中按Enter键时如何触发代码,excel,vba,Excel,Vba,每当在列“H”中按enter键时,我都会尝试移动到excel中列“A”下一行的第一个单元格。我的代码如下 Private Sub move_to_next_row(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then ActiveCell.Offset(1, -7).Activate End If End Sub 工作表不存在按键关闭事件或类似事件。只能检查H列中的单元格是否已更改,然后移动到下

每当在列“H”中按enter键时,我都会尝试移动到excel中列“A”下一行的第一个单元格。我的代码如下

Private Sub move_to_next_row(KeyCode As Integer, Shift As Integer)  
    If KeyCode = 13 Then
        ActiveCell.Offset(1, -7).Activate
    End If
End Sub

工作表不存在按键关闭事件或类似事件。只能检查H列中的单元格是否已更改,然后移动到下一行的第一列

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Columns("H")) Is Nothing Then
        Me.Cells(Target.Row + 1, "A").Select
    End If
End Sub

此工作簿中
对象中放置以下内容

Private Sub Workbook_Open()
    Application.OnKey "~", "move_to_next_row"
End Sub
然后使用F5运行

然后在一个正常的地方

Sub move_to_next_row()
    Dim SelectRng As Range

    On Error Resume Next
    If ActiveCell.Column = 8 Then
        Set SelectRng = ActiveCell.Offset(1, -7)
    Else
        If Application.MoveAfterReturn Then
            Select Case Application.MoveAfterReturnDirection
                Case xlToLeft
                    Set SelectRng = ActiveCell.Offset(0, -1)
                Case xlToRight
                    Set SelectRng = ActiveCell.Offset(0, 1)
                Case xlUp
                    Set SelectRng = ActiveCell.Offset(-1, 0)
                Case xlDown
                    Set SelectRng = ActiveCell.Offset(1, 0)
            End Select
        End If
    End If
    On Error GoTo 0

    If Not SelectRng Is Nothing Then
        SelectRng.Activate
    End If
End Sub
无论何时按enter键,都会调用“移动到下一行”。如果
ActiveCell
位于列
H
中,它会将
ActiveCell
移动到列
A

尝试此操作(也会由向下箭头触发)


不适用于积分

另一种方法是在H列中设置“回车”键的陷阱(无论用户是否在H列中进行了更改)

学分

  • @应用程序的Tom.OnKey
  • @a工作表的常规\u选择更改
  • 将其放置在工作表代码区域

    Option Explicit
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim wsName As String
    
        wsName = ActiveSheet.Name
        If ActiveCell.Column = 8 Then Application.OnKey "{Enter}", _
                                      "'MoveCursor" & Chr(34) & wsName & Chr(34) & "'"
    End Sub
    
    将其放入模块中

    Option Explicit
    
    Sub MoveCursor(wsN As String)
        If ActiveWorkbook.Name <> ThisWorkbook.Name Then GoTo CleanExit
        If ActiveSheet.Name <> wsN Then GoTo CleanExit
    
        Cells(ActiveCell.Row + 1, 1).Select
    
    CleanExit:
        '<~~ Reset the key to avoid undesirable sideeffects!
        Application.OnKey "{Enter}"
    End Sub
    
    选项显式
    子移动光标(wsN作为字符串)
    如果是ActiveWorkbook.Name ThisWorkbook.Name,则转到CleanExit
    如果是ActiveSheet.Name wsN,则转到CleanExit
    单元格(ActiveCell.Row+1,1)。选择
    清洁出口:
    
    “如果H列包含公式怎么办?@LEO只有当H列中的常量值发生更改时,
    工作表才会触发更改
    。如果公式的结果发生变化,它不会触发。有很多事情可能会出错,但这超出了问题的范围。您只能指明方向,但在一定程度上,您已经完成了您的部分:)顺便说一句,这将终止Enter键的正常行为(在H列以外的任何位置)@Pᴇʜ虽然不是一个很好的实现方法,但Enter键在我的测试中似乎仍然可以正常工作-已经在H列和其他列中进行了测试,因为在我的测试中,
    Application.OnKey“~”之后,“move_to_next_row”
    Enter不再切换到我的工作表中的下一个单元格(只有H列按预期跳转)。如果我运行
    Application.OnKey“~”
    它会再次工作。@Pᴇʜ啊,我明白你的意思-我在更新中已经处理过了。我以为你的意思不是calculating@SiddharthRout您可以使用
    Application.OnKey“{ENTER}”,“将_移动到_next_row”
    来捕获该oneNice,但我认为它在使用多个工作簿时仍然存在故障。我还没有测试过它,但我认为如果你在该工作簿的H列中,并且换到另一个工作簿,它仍然会使用
    OnKey
    ,因此你必须添加
    workbook\u Deactivate
    来取消输入,我想是吗?同一工作簿中的其他工作表也是如此(如果它只影响一个工作表)@Pᴇʜ:说得好。现在就试试吧,漂亮,看起来很完美。
    Option Explicit
    
    Sub MoveCursor(wsN As String)
        If ActiveWorkbook.Name <> ThisWorkbook.Name Then GoTo CleanExit
        If ActiveSheet.Name <> wsN Then GoTo CleanExit
    
        Cells(ActiveCell.Row + 1, 1).Select
    
    CleanExit:
        '<~~ Reset the key to avoid undesirable sideeffects!
        Application.OnKey "{Enter}"
    End Sub