使用Excel OnKey而不覆盖默认密钥行为

时间:2012-03-22 19:40:37

标签: excel vba

使用Application.OnKey <key>, <procedure>,只要按下<procedure>,我就可以让Excel运行<key>

我希望它可以执行默认情况下按<key>所做的任何操作,然后运行<procedure>。换句话说,我不想使用OnKey来覆盖键的功能,我想用它来添加到键的功能。

背景资料:

我正在使用条形码扫描仪,它在扫描某些东西时就像键盘一样,键入条形码的字符,然后回车(char 13)。此回车确实会触发Excel的OnKey "~"事件。

现在,我可以扫描条形码,然后将条形码的值放入单元格,然后向下移动到下一个单元格。这是一个好的开始。我想要做的是让Excel运行一些代码,以便它将值放在单元格中,向下移动一个单元格,然后运行一个过程。

2 个答案:

答案 0 :(得分:3)

通常,您必须在自己的代码中模拟操作。如果你想在Enter上使用OnKey,你可以使用这样的代码

Sub SEtup()

    Application.OnKey "~", "DoThis"

End Sub

Sub DoThis()

    'Simulate enter key
    If Application.MoveAfterReturn Then
        Select Case Application.MoveAfterReturnDirection
            Case xlDown
                If ActiveCell.Row < ActiveCell.Parent.Rows.Count Then
                    ActiveCell.Offset(1, 0).Select
                End If
            Case xlToLeft
                If ActiveCell.Column > 1 Then
                    ActiveCell.Offset(0, -1).Select
                End If
            Case xlToRight
                If ActiveCell.Column < ActiveCell.Parent.Columns.Count Then
                    ActiveCell.Offset(0, 1).Select
                End If
            Case xlUp
                If ActiveCell.Row > 1 Then
                    ActiveCell.Offset(-1, 0).Select
                End If
        End Select
    End If

    'This is your code
    Debug.Print ActiveCell.Address

End Sub

另一种选择是使用Worksheet事件。如果条形码输出是可预测的,您可以使用Worksheet_SelectionChange事件。例如,如果您的条形码始终输出四个数字,短划线和两个数字,则可以

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Offset(-1, 0).Value Like "####-##" Then
        'do stuff here
        Debug.Print Target.Address
    End If

End Sub

假设您的MoveAfterReturnDirection是xlDown,但您可以编写其他可能性的代码。实际上,如果输出是可预测的,您可以使用Worksheet_Change事件来识别条形码输入并运行一个过程。

答案 1 :(得分:0)

为什么不使用SendKeys“重新抛出”回车符,并让Excel按其认为合适的方式处理它?不可否认,这是一个kludge,但也许不比你描述的其他代码更多!它将是最简单和最易读的解决方案 - 如果它有效。

Sub PlainOldCarriageReturn()

    Application.EnableEvents = False ' So it won't trigger OnKey.
    Application.SendKeys "~", True ' Send a carriage return.
    DoEvents ' Process the carriage return.
    Application.EnableEvents = True ' Back to normal

End Sub

只需将PlainOldCarriageReturn放在OnKey调用的过程的开头即可。

我的粗略测试表明这确实有效,但您需要自己测试一下。