使用Application.OnKey <key>, <procedure>
,只要按下<procedure>
,我就可以让Excel运行<key>
。
我希望它可以执行默认情况下按<key>
所做的任何操作,然后运行<procedure>
。换句话说,我不想使用OnKey
来覆盖键的功能,我想用它来添加到键的功能。
我正在使用条形码扫描仪,它在扫描某些东西时就像键盘一样,键入条形码的字符,然后回车(char 13)。此回车确实会触发Excel的OnKey "~"
事件。
现在,我可以扫描条形码,然后将条形码的值放入单元格,然后向下移动到下一个单元格。这是一个好的开始。我想要做的是让Excel运行一些代码,以便它将值放在单元格中,向下移动一个单元格,然后运行一个过程。
答案 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
调用的过程的开头即可。
我的粗略测试表明这确实有效,但您需要自己测试一下。